Игра TicTacToe - Java

Узнай цену своей работы

Формулировка задачи:

Привет, всем! Написал игру TicTacToe, по книге Якова Файна, но есть одна проблема. Игра запускается, играет, если первая игра выиграна или проиграна, дальше идет все нормально, но если первая игра сыграна в ничью, то игра зависает на последнем ходу. Подскажите в чем проблема. Интерфейс игры писал сам, логику игры списал с книги. Прилагаю фото игры, здесь все нормально. Здесь зависла на последнем ходу

Решение задачи: «Игра TicTacToe»

textual
Листинг программы
  1. /**
  2.      * Этот метод будет обрабатывать все события
  3.      *
  4.      * @param ActionEvent объект
  5.      */
  6.  
  7.  
  8.     @Override
  9.     public void actionPerformed(ActionEvent e) {
  10.  
  11.         Object theButton = e.getSource();
  12.         // Это кнопка New Game ?
  13.         if (theButton == newGameButton) {
  14.             for (int i = 0; i < 3; i++) {
  15.                 for (int j = 0; j < 3; j++) {
  16.                     squares[i][j].setEnabled(true);
  17.                     squares[i][j].setText("");
  18.                     squares[i][j].setBackground(Color.WHITE);
  19.                 }
  20.             }
  21.             emptySquaresLeft = 9;
  22.             score.setText(" Поиграем?");
  23.             return; // выходим из метода
  24.         }
  25.         String winner = "";
  26.         // Это одна из клеток?
  27.         for (int i = 0; i < 3; i++) {
  28.             for (int j = 0; j < 3; j++) {
  29.                 if (theButton == squares[i][j]) {
  30.                     squares[i][j].setText("X");
  31.                     squares[i][j].setEnabled(false);
  32.                     winner = lookForWinner();
  33.                     if (!"".equals(winner)) {
  34.                         endTheGame();
  35.                     } else {
  36.                         computerMove();
  37.                         winner = lookForWinner();
  38.                         if (!"".equals(winner)) {
  39.                             endTheGame();
  40.                         }
  41.                     }
  42.                     break;
  43.                 }
  44.             } // конец цикла for
  45.         }
  46.         if (winner.equals("X")) {
  47.             score.setText(" Вы выграли!");
  48.             while (true) {
  49.                 count++;
  50.                 break;
  51.             }
  52.             counter.setText(" счет: " + count + ":" + countcomp);
  53.         } else if (winner.equals("O")) {
  54.             score.setText(" Вы проиграли!");
  55.             while (true) {
  56.                 countcomp++;
  57.                 break;
  58.             }
  59.             counter.setText(" счет: " + count + ":" + countcomp);
  60.         } else if (winner.equals("T")) {
  61.             score.setText(" Ничья!");
  62.             counter.setText(" счет: " + count + ":" + countcomp);
  63.         }
  64.     } // конец метода actionPerformed
  65.  
  66.     /**
  67.      * Этот метод вызывается после каждого хода, чтобы узнать,
  68.      * есть ли победитель. Он проверяет каждый ряд, колонку
  69.      * и диагональ, чтобы найти три клетки с одинаковыми надписями
  70.      * (не пустыми)
  71.      *
  72.      * @return "X", "O", "T" – ничья, "" - еще нет победителя
  73.      */
  74.     String lookForWinner() {
  75.         String theWinner = "";
  76.         emptySquaresLeft--;
  77.         if (emptySquaresLeft == 0) {
  78.             return "T"; // это ничья. T от английского слова tie
  79.         }
  80.         // Проверяем ряд 1 – элементы массива 0,1,2
  81.         if (!squares[0][0].getText().equals("")
  82.                 &&
  83.                 squares[0][0].getText().equals(squares[0][1].getText())
  84.                 &&
  85.                 squares[0][0].getText().equals(squares[0][2].getText())) {
  86.             theWinner = squares[0][0].getText();
  87.             //так как массив двумерный, поэтому заносим индексы
  88.             //из 6 цифр. Метод выделения выигрышных клеток
  89.             highlightWinner(0, 0, 0, 1, 0, 2);
  90.             // Проверяем ряд 2 – элементы массива 3,4,5
  91.         } else if (!squares[1][0].getText().equals("")
  92.                 &&
  93.                 squares[1][0].getText().equals(squares[1][1].getText())
  94.                 &&
  95.                 squares[1][0].getText().equals(squares[1][2].getText())) {
  96.  
  97.             theWinner = squares[1][0].getText();
  98.             highlightWinner(1, 0, 1, 1, 1, 2);
  99.             // Проверяем ряд 3 – элементы массива 6,7,8
  100.         } else if (!squares[2][0].getText().equals("")
  101.                 &&
  102.                 squares[2][0].getText().equals(squares[2][1].getText())
  103.                 &&
  104.                 squares[2][0].getText().equals(squares[2][2].getText())) {
  105.  
  106.             theWinner = squares[2][0].getText();
  107.             highlightWinner(2, 0, 2, 1, 2, 2);
  108.  
  109.             // Проверяем колонку 1 – элементы массива 0,3,6
  110.         } else if (!squares[0][0].getText().equals("")
  111.                 &&
  112.                 squares[0][0].getText().equals(squares[1][0].getText())
  113.                 &&
  114.                 squares[0][0].getText().equals(squares[2][0].getText())) {
  115.  
  116.             theWinner = squares[0][0].getText();
  117.             highlightWinner(0, 0, 1, 0, 2, 0);
  118.             // Проверяем колонку 2 – элементы массива 1,4,7
  119.         } else if (!squares[0][1].getText().equals("")
  120.                 &&
  121.                 squares[0][1].getText().equals(squares[1][1].getText())
  122.                 &&
  123.                 squares[0][1].getText().equals(squares[2][1].getText())) {
  124.             theWinner = squares[0][1].getText();
  125.             highlightWinner(0, 1, 1, 1, 2, 1);
  126.             // Проверяем колонку 3 – элементы массива 2,5,8
  127.         } else if (!squares[0][2].getText().equals("")
  128.                 &&
  129.                 squares[0][2].getText().equals(squares[1][2].getText())
  130.                 &&
  131.                 squares[0][2].getText().equals(squares[2][2].getText())) {
  132.  
  133.             theWinner = squares[0][2].getText();
  134.             highlightWinner(0, 2, 1, 2, 2, 2);
  135.             // Проверяем первую диагональ – элементы массива 0,4,8
  136.         } else if (!squares[0][0].getText().equals("") &&
  137.                 squares[0][0].getText().equals(squares[1][1].getText()) &&
  138.                 squares[0][0].getText().equals(squares[2][2].getText())) {
  139.             theWinner = squares[0][0].getText();
  140.             highlightWinner(0, 0, 1, 1, 2, 2);
  141.             // Проверяем вторую диагональ – элементы массива 2,4,6
  142.         } else if (!squares[0][2].getText().equals("") &&
  143.                 squares[0][2].getText().equals(squares[1][1].getText()) &&
  144.                 squares[0][2].getText().equals(squares[2][0].getText())) {
  145.             theWinner = squares[0][2].getText();
  146.             highlightWinner(0, 2, 1, 1, 2, 0);
  147.         }
  148.         return theWinner;
  149.     }
  150.  
  151.     void computerMove() {
  152.         int selectedSquare;
  153. // Сначала компьютер пытается найти пустую клетку
  154. // рядом с двумя клетками с ноликами, чтобы выиграть
  155.         selectedSquare = findEmptySquare("O");
  156. // Если он не может найти два нолика, то хотя бы
  157. // попытается не дать оппоненту сделать ряд из 3-х
  158. // крестиков,поместив нолик рядом с двумя крестиками
  159.         if (selectedSquare == -1) {
  160.             selectedSquare = findEmptySquare("X");
  161.         }
  162. // если selectedSquare все еще равен -1, то
  163. // попытается занять центральную клетку
  164.         if ((selectedSquare == -1) && (squares[1][1].getText().equals(""))) {
  165.             selectedSquare = 1;
  166.             printMove(selectedSquare, selectedSquare);
  167.         }
  168. // не повезло с центральной клеткой...
  169. // просто занимаем случайную клетку
  170.         if (selectedSquare == -1) {
  171.             selectedSquare = getRandomSquare();
  172.         }
  173.     }
  174.  
  175.     //печать ноликов компьютером, так как массив
  176. //кнопок имеет разные типы
  177. //нужен отдельный метод для вывода на экран ноликов
  178.     int printMove(int x, int y) {
  179.         squares[x][y].setText("O");
  180.         squares[x][y].setEnabled(false);
  181.         return 0;
  182.     }
  183.  
  184.     /**
  185.      * Этот метод проверяет каждый ряд, колонку и диагональ
  186.      * чтобы узнать, есть ли в ней две клетки
  187.      * с одинаковыми надписями и пустой клеткой.
  188.      *
  189.      * @param передается X – для пользователя и O – для компа
  190.      * @return количество свободных клеток,
  191.      * или -1, если не найдено две клетки
  192.      * с одинаковыми надписями
  193.      */
  194.     int findEmptySquare(String player) {
  195.         int weight[][] = new int[3][3];
  196.  
  197.         for (int i = 0; i < 3; i++) {
  198.             for (int j = 0; j < 3; j++) {
  199.  
  200.                 if (squares[i][j].getText().equals("O"))
  201.                     weight[i][j] = -1;
  202.                 else if (squares[i][j].getText().equals("X"))
  203.                     weight[i][j] = 1;
  204.                 else
  205.                     weight[i][j] = 0;
  206.             }
  207.         }
  208.         int twoWeights = player.equals("") ? -2 : 2;
  209.  
  210. // Проверим, есть ли в ряду 1 две одинаковые клетки и
  211. // одна пустая.
  212.         if (weight[0][0] + weight[0][1] + weight[0][2] == twoWeights) {
  213.  
  214.             if (weight[0][0] == 0)
  215.                 //присваиваем методу индексы клетки
  216.                 return printMove(0, 0);
  217.             else if (weight[0][1] == 0)
  218.                 return printMove(0, 1);
  219.             else
  220.                 return printMove(0, 2);
  221.         }
  222. // Проверим, есть ли в ряду 2 две одинаковые клетки и
  223. // одна пустая.
  224.         if (weight[1][0] + weight[1][1] + weight[1][2] == twoWeights) {
  225.             if (weight[1][0] == 0)
  226.                 return printMove(1, 0);
  227.             else if (weight[1][1] == 0)
  228.                 return printMove(1, 1);
  229.             else
  230.                 return printMove(1, 2);
  231.         }
  232. // Проверим, есть ли в ряду 3 две одинаковые клетки и
  233. // одна пустая.
  234.         if (weight[2][0] + weight[2][1] + weight[2][2] == twoWeights) {
  235.             if (weight[2][0] == 0)
  236.                 return printMove(2, 0);
  237.             else if (weight[2][1] == 0)
  238.                 return printMove(2, 1);
  239.             else
  240.                 return printMove(2, 2);
  241.         }
  242. // Проверим, есть ли в колонке 1 две одинаковые клетки и
  243. // одна пустая.
  244.         if (weight[0][0] + weight[1][0] + weight[2][0] == twoWeights) {
  245.             if (weight[0][0] == 0)
  246.                 return printMove(0, 0);
  247.             else if (weight[1][0] == 0)
  248.                 return printMove(1, 0);
  249.             else
  250.                 return printMove(2, 0);
  251.         }
  252. // Проверим, есть ли в колонке 2 две одинаковые клетки
  253. // и одна пустая.
  254.         if (weight[0][1] + weight[1][1] + weight[2][1] == twoWeights) {
  255.             if (weight[0][1] == 0)
  256.                 return printMove(0, 1);
  257.             else if (weight[1][1] == 0)
  258.                 return printMove(1, 1);
  259.             else
  260.                 return printMove(2, 1);
  261.         }
  262. // Проверим, есть ли в колонке 3 две одинаковые клетки
  263. // и одна пустая.
  264.         if (weight[0][2] + weight[1][2] + weight[2][2] == twoWeights) {
  265.             if (weight[0][2] == 0)
  266.                 return printMove(0, 2);
  267.             else if (weight[1][2] == 0)
  268.                 return printMove(1, 2);
  269.             else
  270.                 return printMove(2, 2);
  271.         }
  272. // Проверим, есть ли в диагонали 1 две одинаковые клетки
  273. // и одна пустая.
  274.         if (weight[0][0] + weight[1][1] + weight[2][2] == twoWeights) {
  275.             if (weight[0][0] == 0)
  276.                 return printMove(0, 0);
  277.             else if (weight[1][1] == 0)
  278.                 return printMove(1, 1);
  279.             else
  280.                 return printMove(2, 2);
  281.         }
  282.         // Проверим, есть ли в диагонали 2 две одинаковые клетки
  283.         // и одна пустая.
  284.         if (weight[0][2] + weight[1][1] + weight[2][0] == twoWeights) {
  285.             if (weight[0][2] == 0)
  286.                 return printMove(0, 2);
  287.             else if (weight[1][1] == 0)
  288.                 return printMove(1, 1);
  289.             else
  290.                 return printMove(2, 0);
  291.         }
  292.  
  293.         // Не найдено двух одинаковых соседних клеток
  294.         return -1;
  295.  
  296.     } // конец метода findEmptySquare()
  297.  
  298.     /**
  299.      * Этот метод выбирает любую пустую клетку
  300.      *
  301.      * @return случайно выбранный номер клетки
  302.      */
  303.     int getRandomSquare() {
  304.         boolean gotEmptySquare = false;
  305.  
  306.         int selectedSquare = -1;
  307.         int selectedSquare1 = 0;
  308.         do {
  309.             //так как у двумерного массива два индекса
  310.             //поэтому создаем два рандомных числа
  311.             //с помощью которых будем искать пустую клетку
  312.             selectedSquare = (int) (Math.random() * 3);
  313.             selectedSquare1 = (int) (Math.random() * 3);
  314.             if (squares[selectedSquare][selectedSquare1].getText().equals("")) {
  315.                 gotEmptySquare = true;
  316. // чтобы закончить цикл
  317.             }
  318.         } while (!gotEmptySquare);
  319.         //печатаем нолик
  320.         return printMove(selectedSquare, selectedSquare1);
  321.     } // конец метода getRandomSquare()
  322.  
  323.     /**
  324.      * Этот метод выделяет выигравшую линию.
  325.      *
  326.      * @param первая, вторая и третья клетки для выделения
  327.      */
  328.     void highlightWinner(int win1, int win2, int win3, int win4, int win5, int win6) {
  329.         //выделяем клетки которые победили!
  330.         squares[win1][win2].setBackground(Color.BLACK);
  331.         squares[win3][win4].setBackground(Color.BLACK);
  332.         squares[win5][win6].setBackground(Color.BLACK);
  333.     }
  334.  
  335.     // Делаем недоступными клетки и доступной кнопку ”New Game”
  336.     void endTheGame() {
  337.         newGameButton.setEnabled(true);
  338.         for (int i = 0; i < 3; i++) {
  339.             for (int j = 0; j < 3; j++) {
  340.                 squares[i][j].setEnabled(false);
  341.             }
  342.         }
  343.     }
  344. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.385 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы