Разрабатываю игру в качестве обучения. Вся игра идет через кнопки. Играбельные кнопки у меня занесены в список static ArrayList<JButton> buttons = new ArrayList<JButton>();
. Так вот, после игры хочу нажать на кнопку "рестарт" и играть заново.
Я знаю, как сделать рестарт для каждой кнопки отдельно, но какой способ есть для рестарта всех кнопок разом?
Нашел такой способ:
fileMenu = new JMenu("Файл");
resItem = new JMenuItem("Рестарт");
fileMenu.add(resItem);
resItem.addActionListener((ActionEvent e) -> {
for (JButton button : buttons) {
button.setText("");
button.setSelected(false);
button.setEnabled(true);
}
resultat.setText("Сейчас начинается ваш ход!");
});
И при запуске рестарта да, все вроде бы очистилось, но при нажатии на какую-либо из кнопок происходит сразу же победа игрока! Как правильно реализовать кнопку рестарта играбельных кнопок разом? Буду благодарен. Полный код:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class TicTakToe {
//Создание фрейма, шрифта, кнопок (3х3) и текстового поля
JFrame frame;
JMenuBar menuBar;
JPanel mainPanel;
Font font = new Font("sanserif", Font.BOLD, 55);
static JButton button1 = new JButton();
static JButton button2 = new JButton();
static JButton button3 = new JButton();
static JButton button4 = new JButton();
static JButton button5 = new JButton();
static JButton button6 = new JButton();
static JButton button7 = new JButton();
static JButton button8 = new JButton();
static JButton button9 = new JButton();
// Текстовое поле для вывода результата
static JTextField resultat = new JTextField();
// Массив для хранения кнопок
static ArrayList<JButton> buttons = new ArrayList<JButton>();
// Список всех ходов игрока и компьютера
static ArrayList<Integer> Moves = new ArrayList<Integer>();
// Отдельный поток для хода компьютера
static Thread c;
// Массив для хода игрока
static int [][] player;
static int[][] comp;
public static void main(String[] args) {
new TicTakToe().gui();
player = new int[3][3];
comp = new int[3][3];
c = new Thread(new CompPlayer());
}
public void gui() {
// Добавление кнопок, текстового поля для вывода результата
//функция остановки компилятора при закрытии программы
frame = new JFrame("Крестики-нолики");
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("Файл");
JMenuItem resItem = new JMenuItem("Рестарт");
fileMenu.add(resItem);
resItem.addActionListener((ActionEvent e) -> {
for (JButton button : buttons) {
button.setText("");
button.setSelected(false);
button.setEnabled(true);
}
});
JMenuItem exitItem = new JMenuItem("Выход");
fileMenu.add(exitItem);
exitItem.addActionListener((ActionEvent e) -> {
System.exit(0);
});
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
mainPanel = new JPanel(new GridLayout(3,3));
button1.setActionCommand("1");
button1.addActionListener(new ButtonListener());
buttons.add(button1);
mainPanel.add(button1);
button2.setActionCommand("2");
button2.addActionListener(new ButtonListener());
buttons.add(button2);
mainPanel.add(button2);
button3.setActionCommand("3");
button3.addActionListener(new ButtonListener());
buttons.add(button3);
mainPanel.add(button3);
button4.setActionCommand("4");
button4.addActionListener(new ButtonListener());
buttons.add(button4);
mainPanel.add(button4);
button5.setActionCommand("5");
button5.addActionListener(new ButtonListener());
buttons.add(button5);
mainPanel.add(button5);
button6.setActionCommand("6");
button6.addActionListener(new ButtonListener());
buttons.add(button6);
mainPanel.add(button6);
button7.setActionCommand("7");
button7.addActionListener(new ButtonListener());
buttons.add(button7);
mainPanel.add(button7);
button8.setActionCommand("8");
button8.addActionListener(new ButtonListener());
buttons.add(button8);
mainPanel.add(button8);
button9.setActionCommand("9");
button9.addActionListener(new ButtonListener());
buttons.add(button9);
mainPanel.add(button9);
resultat.setText("Сейчас начинается ваш ход!");
frame.getContentPane().add(mainPanel);
frame.getContentPane().add(BorderLayout.SOUTH, resultat);
frame.setSize(300,350);
frame.setVisible(true);
//Остановить компилятор при закрытии программы
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// Все ходы игрока и компьютера
static int allMoves = 0;
// Счетчик на количество хода игрока
int allMovesPlayer = 0;
int allMovesComp = 0;
// Функция увеличения кол-ва всех ходов
public synchronized static void growAllMoves() {
allMoves = allMoves + 1;
}
// Функция получения кол-ва ходов
public synchronized static int getAllMoves() {
return allMoves;
}
// Добавление к значению хода участника игры
public synchronized static void add (int c) {
Moves.add(c);
}
// Статус игрока (1 победа, 0 продолжение игры)
int statPlayer = 0;
int statComp = 0;
// Хранит значение хода компьютера
static int compMove;
// Команды для кнопок (игрок)
class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
// Вызов метода увеличивания ходов
growAllMoves();
// Определяем какую кнопку нажал игрок
int actionCommand = Integer.parseInt(event.getActionCommand());
if (getAllMoves() % 2 != 0) {
allMovesPlayer++;
switch (actionCommand) {
case 1: {
player[0][0] = 1;
button1.setFont(font);
button1.setText("X");
button1.setEnabled(false);
break;
}
case 2: {
player[0][1] = 1;
button2.setFont(font);
button2.setText("X");
button2.setEnabled(false);
break;
}
case 3: {
player[0][2] = 1;
button3.setFont(font);
button3.setText("X");
button3.setEnabled(false);
break;
}
case 4: {
player[1][0] = 1;
button4.setFont(font);
button4.setText("X");
button4.setEnabled(false);
break;
}
case 5: {
player[1][1] = 1;
button5.setFont(font);
button5.setText("X");
button5.setEnabled(false);
break;
}
case 6: {
player[1][2] = 1;
button6.setFont(font);
button6.setText("X");
button6.setEnabled(false);
break;
}
case 7:{
player[2][0] = 1;
button7.setFont(font);
button7.setText("X");
button7.setEnabled(false);
break;
}
case 8: {
player[2][1] = 1;
button8.setFont(font);
button8.setText("X");
button8.setEnabled(false);
break;
}
case 9: {
player[2][2] = 1;
button9.setFont(font);
button9.setText("X");
button9.setEnabled(false);
break;
}
}
// Добавление хода игрока в общий список ходов
// Также проводим проверку:
// при ходах игрока больше 3 проверяем, выиграл он или нет.
add(actionCommand);
if (allMovesPlayer >= 3) {
if (statPlayer == 0) {
statPlayer = check(player);
}
}
}
// Если игрок не выиграл, но при этом его кол-ва хода
// меньше 5, то запускается ход компьютера
if (statPlayer == 0 && allMovesPlayer < 5)c.run();
// В случае победы
if (statPlayer == 1) {
resultat.setText("Поздравляем игрок! Ты выиграл!!!");
for (JButton b : buttons) {
b.setEnabled(false);
}
// Боевая ничья
} else if (statPlayer == 0 && allMovesPlayer >=5) {
resultat.setText("Боевая ничья! Спасибо за игру :)");
for (JButton b : buttons) {
b.setEnabled(false);
}
}
}
}
// Проверка комбинации на выигрыш
// в случае выигрыша возвращается 1
public int check(int[][] a) {
// Счетчики комбинаций
//строка, столбец, 1 диагональ, 2 диагональ
int row = 0;
int column = 0;
int diagonal = 0;
int diagonal2 = 0;
// Проверки:
// по строке или столбцу
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
if (a[i][j] == 1) row++;
if (a[j][i] == 1) column++;
}
if (row == 3 || column == 3) {
return 1;
}
row = 0;
column = 0;
}
// диагональ 1
for (int i = 0, j = 0; i < a.length ; i++) {
if (a[i][j] == 1) diagonal++;
j++;
}
if (diagonal == 3) {
return 1;
}
// диагональ 2
for (int i = 0, j = 2; i < a.length ; i++) {
if (a[i][j] == 1) diagonal2++;
j--;
}
if (diagonal2 == 3) {
return 1;
}
return 0;
}
}
// Ход компьютера (четный)
class CompPlayer extends TicTakToe implements Runnable {
@Override
public void run() {
growAllMoves();
if (getAllMoves() % 2 == 0) {
allMovesComp++;
compMove =(int) (Math.random()*10);
while(compMove == 0 || Moves.contains(compMove)) {
if (allMovesComp >=5) break;
compMove =(int) (Math.random()*10);
}
add(compMove);
switch (compMove) {
case 1: {
comp[0][0] = 1;
button1.setFont(font);
button1.setText("O");
button1.setEnabled(false);
break;
}
case 2: {
comp[0][1] = 1;
button2.setFont(font);
button2.setText("O");
button2.setEnabled(false);
break;
}
case 3: {
comp[0][2] = 1;
button3.setFont(font);
button3.setText("O");
button3.setEnabled(false);
break;
}
case 4: {
comp[1][0] = 1;
button4.setFont(font);
button4.setText("O");
button4.setEnabled(false);
break;
}
case 5: {
comp[1][1] = 1;
button5.setFont(font);
button5.setText("O");
button5.setEnabled(false);
break;
}
case 6: {
comp[1][2] = 1;
button6.setFont(font);
button6.setText("O");
button6.setEnabled(false);
break;
}
case 7:{
comp[2][0] = 1;
button7.setFont(font);
button7.setText("O");
button7.setEnabled(false);
break;
}
case 8: {
comp[2][1] = 1;
button8.setFont(font);
button8.setText("O");
button8.setEnabled(false);
break;
}
case 9: {
comp[2][2] = 1;
button9.setFont(font);
button9.setText("O");
button9.setEnabled(false);
break;
}
}
// При кол-ве ходов компьютера больше 3
// делаем проверку на выигрыш
if (allMovesComp >= 3) {
if (statComp == 0) {
statComp = check(comp);
}
}
}
// Сообщение для игрока
if (statComp == 1) {
resultat.setText("Вы проиграли!");
buttons.forEach((b) -> {
b.setEnabled(false);
});
} else if (statComp == 0 && allMovesComp >=5) {
resultat.setText("Боевая ничья! Спасибо за игру :)");
buttons.forEach((b) -> {
b.setEnabled(false);
});
}
}
}
я решаю эту проблему, создавая метод reset(), в котором просто прописаны все изначальные параметры, необходимые для сброса н-р:
`
gameWin = false;
selectButton = false;
int ae = 0;
`
обнулить двумерный массив через fori
вызываешь метод reset(); и игра сбрасывается, все просто
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Сделал кастомный адаптер для спиннераПри раскрытии спиннера метод getDropDownView вызывается непрерывно циклически, даже если список не трогать
Делаю приложение для конференций, хочу реализовать в ней новости и программу событийСайта нет, и писать его с нуля не хочется
Настроил sphinx , проиндексировалВ общем все работает , но только через консоль
Вопрос достаточно простойЯ недавно только начал изучать спринг и меня интересует как добавлять изменения на сервер: - Допустим, я написал...