Bonjour, je suis débutant en java et j'ai cette erreur que j'arrive pas à corriger si pouvez m'aider s'il vous plait je souhaite récupérer la liste des cases minées du jeu demineur mais ça va pas voici mon code :
package nv;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Arrays;
public class Demineur extends JFrame implements ActionListener,
MouseListener {
int rows = 8;
int cols = 8;
int numMines = 7;
GridLayout layout = new GridLayout(rows, cols);
boolean[] mines = new boolean[rows * cols];
boolean[] clickable = new boolean[rows * cols];
boolean lost = false;
boolean won = false;
int[] numbers = new int[rows * cols];
JButton[] buttons = new JButton[rows * cols];
boolean[] clickdone = new boolean[rows * cols];
JMenuItem newGameButton = new JMenuItem("new game");
JMenuItem difficulty = new JMenuItem("options");
JLabel mineLabel = new JLabel("mines: " + numMines + " marked: 0");
JPanel p = new JPanel();
public Demineur() {
p.setLayout(layout);
setupI();
for (int i = 0; i < (rows * cols); i++) {
p.add(buttons[i]);
}
JMenuBar mb = new JMenuBar();
JMenu m = new JMenu("file");
newGameButton.addActionListener(this);
m.add(newGameButton);
difficulty.addActionListener(this);
m.add(difficulty);
mb.add(m);
this.setJMenuBar(mb);
this.add(p);
this.add(mineLabel, BorderLayout.SOUTH);
this.pack();
this.setVisible(true);
}
public void fillMines() {
int needed = numMines;
while (needed > 0) {
int x = (int) Math.floor(Math.random() * rows);
int y = (int) Math.floor(Math.random() * cols);
if (!mines[(rows * y) + x]) {
mines[(rows * y) + x] = true;
needed--;
}
}
List<Integer> minePositions = new ArrayList<>();
for (int i = 0; i < mines.length; i++) {
if (mines[i]) {
minePositions.add(i);
}
}
}
public void fillNumbers() {
for (int x = 0; x < rows; x++) {
for (int y = 0; y < cols; y++) {
int cur = (rows * y) + x;
if (mines[cur]) {
numbers[cur] = 0;
continue;
}
int temp = 0;
boolean l = (x - 1) >= 0;
boolean r = (x + 1) < rows;
boolean u = (y - 1) >= 0;
boolean d = (y + 1) < cols;
int left = (rows * (y)) + (x - 1);
int right = (rows * (y)) + (x + 1);
int up = (rows * (y - 1)) + (x);
int upleft = (rows * (y - 1)) + (x - 1);
int upright = (rows * (y - 1)) + (x + 1);
int down = (rows * (y + 1)) + (x);
int downleft = (rows * (y + 1)) + (x - 1);
int downright = (rows * (y + 1)) + (x + 1);
if (u) {
if (mines[up]) {
temp++;
}
if (l) {
if (mines[upleft]) {
temp++;
}
}
if (r) {
if (mines[upright]) {
temp++;
}
}
}
if (d) {
if (mines[down]) {
temp++;
}
if (l) {
if (mines[downleft]) {
temp++;
}
}
if (r) {
if (mines[downright]) {
temp++;
}
}
}
if (l) {
if (mines[left]) {
temp++;
}
}
if (r) {
if (mines[right]) {
temp++;
}
}
numbers[cur] = temp;
}
}
}
public void setupI() {
for (int x = 0; x < rows; x++) {
for (int y = 0; y < cols; y++) {
mines[(rows * y) + x] = false;
clickdone[(rows * y) + x] = false;
clickable[(rows * y) + x] = true;
buttons[(rows * y) + x] = new JButton( /*"" + ( x * y )*/);
buttons[(rows * y) + x].setPreferredSize(new Dimension(
45, 45));
buttons[(rows * y) + x].addActionListener(this);
buttons[(rows * y) + x].addMouseListener(this);
}
}
fillMines();
fillNumbers();
}
public void setupI2() {
this.remove(p);
p = new JPanel();
layout = new GridLayout(rows, cols);
p.setLayout(layout);
buttons = new JButton[rows * cols];
mines = new boolean[rows * cols];
clickdone = new boolean[rows * cols];
clickable = new boolean[rows * cols];
numbers = new int[rows * cols];
setupI();
for (int i = 0; i < (rows * cols); i++) {
p.add(buttons[i]);
}
this.add(p);
this.pack();
fillMines();
fillNumbers();
}
public void setup() {
for (int x = 0; x < rows; x++) {
for (int y = 0; y < cols; y++) {
mines[(rows * y) + x] = false;
clickdone[(rows * y) + x] = false;
clickable[(rows * y) + x] = true;
buttons[(rows * y) + x].setEnabled(true);
buttons[(rows * y) + x].setText("");
}
}
fillMines();
fillNumbers();
lost = false;
mineLabel.setText("mines: " + numMines + " marked: 0");
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == difficulty) {
rows = Integer.parseInt((String) JOptionPane.showInputDialog(
this, "Rows", "Rows", JOptionPane.PLAIN_MESSAGE, null,
null, 10));
cols = Integer.parseInt((String) JOptionPane.showInputDialog(
this, "Columns", "Columns", JOptionPane.PLAIN_MESSAGE,
null, null, 10));
numMines = Integer.parseInt((String) JOptionPane.showInputDialog(this, "Mines", "Mines",
JOptionPane.PLAIN_MESSAGE, null, null, 10));
setupI2();
}
if (!won) {
for (int x = 0; x < rows; x++) {
for (int y = 0; y < cols; y++) {
if (e.getSource() == buttons[(rows * y) + x]
&& !won && clickable[(rows * y) + x]) {
doCheck(x, y);
break;
}
}
}
}
if (e.getSource() == newGameButton) {
setup();
won = false;
return;
}
siGagner();
}
public void mousePressed(MouseEvent e) {
if (e.getButton() == 3) {
int n = 0;
for (int x = 0; x < rows; x++) {
for (int y = 0; y < cols; y++) {
if (e.getSource() == buttons[(rows * y) + x]) {
clickable[(rows * y) + x] = !clickable[(rows * y)
+ x];
}
if (!clickdone[(rows * y) + x]) {
if (!clickable[(rows * y) + x]) {
buttons[(rows * y) + x].setText("X");
n++;
} else {
buttons[(rows * y) + x].setText("");
}
mineLabel.setText("mines: " + numMines + " marked: "
+ n);
}
}
}
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void doCheck(int x, int y) {
int cur = (rows * y) + x;
boolean l = (x - 1) >= 0;
boolean r = (x + 1) < rows;
boolean u = (y - 1) >= 0;
boolean d = (y + 1) < cols;
int left = (rows * (y)) + (x - 1);
int right = (rows * (y)) + (x + 1);
int up = (rows * (y - 1)) + (x);
int upleft = (rows * (y - 1)) + (x - 1);
int upright = (rows * (y - 1)) + (x + 1);
int down = (rows * (y + 1)) + (x);
int downleft = (rows * (y + 1)) + (x - 1);
int downright = (rows * (y + 1)) + (x + 1);
clickdone[cur] = true;
buttons[cur].setEnabled(false);
if (numbers[cur] == 0 && !mines[cur] && !lost && !won) {
if (u && !won) {
if (!clickdone[up] && !mines[up]) {
clickdone[up] = true;
buttons[up].doClick();
}
if (l && !won) {
if (!clickdone[upleft] && numbers[upleft] != 0
&& !mines[upleft]) {
clickdone[upleft] = true;
buttons[upleft].doClick();
}
}
if (r && !won) {
if (!clickdone[upright] && numbers[upright] != 0
&& !mines[upright]) {
clickdone[upright] = true;
buttons[upright].doClick();
}
}
}
if (d && !won) {
if (!clickdone[down] && !mines[down]) {
clickdone[down] = true;
buttons[down].doClick();
}
if (l && !won) {
if (!clickdone[downleft] && numbers[downleft] != 0
&& !mines[downleft]) {
clickdone[downleft] = true;
buttons[downleft].doClick();
}
}
if (r && !won) {
if (!clickdone[downright]
&& numbers[downright] != 0
&& !mines[downright]) {
clickdone[downright] = true;
buttons[downright].doClick();
}
}
}
if (l && !won) {
if (!clickdone[left] && !mines[left]) {
clickdone[left] = true;
buttons[left].doClick();
}
}
if (r && !won) {
if (!clickdone[right] && !mines[right]) {
clickdone[right] = true;
buttons[right].doClick();
}
}
} else {
buttons[cur].setText("" + numbers[cur]);
if (!mines[cur] && numbers[cur] == 0) {
buttons[cur].setText("");
}
}
if (mines[cur] && !won) {
buttons[cur].setText("0");
doLose();
}
}
public void gagner() {
if (!lost && !won) {
won = true;
JOptionPane.showMessageDialog(null,
"you win!nstarting a new game", "you lose",
JOptionPane.INFORMATION_MESSAGE);
newGameButton.doClick();
}
}
public void siGagner() {
for (int x = 0; x < rows; x++) {
for (int y = 0; y < cols; y++) {
int cur = (rows * y) + x;
if (!clickdone[cur]) {
if (mines[cur]) {
continue;
} else {
return;
}
}
}
}
gagner();
}
public void mouseReleased(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void doLose() {
if (!lost && !won) {
lost = true;
for (int i = 0; i < rows * cols; i++) {
if (!clickdone[i]) {
buttons[i].doClick(0);
}
}
JOptionPane.showMessageDialog(null,
"you lose!nstarting a new game", "you lose",
JOptionPane.ERROR_MESSAGE);
setup();
}
System.out.println(Arrays.toString(mines));
}
}
Et le main
package nv;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Arrays;
public class Main{
public static void main(String[] args) {
new Demineur();
}
}
Une version de java sans genericité ? (Avant java 5)
PS: pourquoi galérer avec la linéarisation des indices, alors qu'on peut très bien utiliser de tableaux 2D ?
int[][] t = new int[10][10];
Vu que de toutes façons, le code fait des boucles sur 2 indices :
for (int x = 0; x < rows; x++) { // ligne 172
for (int y = 0; y < cols; y++) {
PS2 : autre galère utiliser les noms x et y pour des indices de lignes et colonne
d'une part pas de chance c'est le mauvais choix : d'habitude le numéros de colonnes correspondent aux abscisses (les x) et les lignes aux y
d'autre part ça embrouille ; c'est beaucoup moins fatigant d'employer r pour les rows et c pour les cols, comme ça on n'a pas à réfléchir sur qui est qui.
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
Bonjour, merci a vous tous pour vos réponses, j'ai pu corriger mais jusqu'à présent, je n'arrive pas à faire la déduction des cases minées si vous pouvez me donner des pistes s'il vous plait.
Corrigé comment ? Quelle était la cause du problème ?
(On essaie d'aider alors ça serait sympa de faire un retour)
java:59: error: type List does not take parameters
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl