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.
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl