Разрабатываю игру в качестве обучения. Вся игра идет через кнопки. Играбельные кнопки у меня занесены в список 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(); и игра сбрасывается, все просто
Виртуальный выделенный сервер (VDS) становится отличным выбором
Сделал кастомный адаптер для спиннераПри раскрытии спиннера метод getDropDownView вызывается непрерывно циклически, даже если список не трогать
Делаю приложение для конференций, хочу реализовать в ней новости и программу событийСайта нет, и писать его с нуля не хочется
Настроил sphinx , проиндексировалВ общем все работает , но только через консоль
Вопрос достаточно простойЯ недавно только начал изучать спринг и меня интересует как добавлять изменения на сервер: - Допустим, я написал...