Ti c Ta c Toe game не зацикливается + или правильно выполняет правила - PullRequest
0 голосов
/ 09 мая 2020

В основном я пытаюсь сделать игру «ti c ta c toe» между двумя игроками-людьми в качестве задачи для новичков. У меня возникают 2 проблемы при запуске программы в консоли. Первая проблема заключается в том, что l oop, который я настроил, чтобы игроки могли делать несколько ходов, один за другим, позволяет каждому игроку иметь только один go. Другая проблема заключается в том, что у меня есть набор правил, так что если вы соберете 3 подряд, игра завершится sh. Проблема в том, что игра говорит «игра окончена» после каждого go.

import java.util.Scanner;

public class Game {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);

        int SIDE = 3;
        char[][] grid = new char[SIDE][SIDE];
        for (int row = 0; row < SIDE; row++) {
            for (int col = 0; col < SIDE; col++) {
                grid[row][col] = '_';
            }
        }
        for (int row = 0; row < SIDE; row++) {
            for (int col = 0; col < SIDE; col++) {
                System.out.printf("%3c", grid[row][col]);
            }
            System.out.printf("%n");
        }
        boolean playing = true;
        while (playing) {
            System.out.println("Player1: Please enter coordinates for your move");

Ответы [ 3 ]

1 голос
/ 09 мая 2020

Метод GameOver при вызове создает новую сетку. Поэтому при проверке значений в строках, столбцах и диагоналях обнаруживается, что значения совпадают, поскольку все они пусты. Дайте методу GameOver новый параметр, который принимает сетку, и используйте его. Однако будьте осторожны с этим, поскольку теперь все строки и столбцы будут иметь в качестве значения «_». Так же, как вы проверили "_" в диагональных условиях, вы должны проверить его в if-выражении строки и столбца.

Это показывает содержимое пустого массива сетки:

screenshot

Кроме того, вы должны сделать отступ в коде, чтобы его было легче читать и отлаживать. Я бы также предложил создать метод печати сетки вместо дублирования вложенных циклов for для ее печати.

0 голосов
/ 09 мая 2020
while(playing){
            System.out.println ("Player1: Please enter coordinates for your move");
            int row1 = input.nextInt();
            int col1 = input.nextInt();
            grid[row1-1][col1-1] = 'x';
            if (!GameOver(row1-1, col1-1)) {
                playing = false;
                System.out.println("Game Over");
            }


            for (int row = 0; row < SIDE; row++) {
                for (int col = 0; col < SIDE; col++) {
                    System.out.printf("%3c", grid [row][col]);
                }
                System.out.printf("%n");
            }
            System.out.println ("Player 2: Please enter coordinates for your move");
            int row2 = input.nextInt();
            int col2 = input.nextInt();
            grid[row2-1][col2-1] = 'O';
            if (!GameOver(row1-1, col1-1)) {
                playing = false;
                System.out.println("Game Over");
            }
            for (int row = 0; row < SIDE; row++) {
                for (int col = 0; col < SIDE; col++) {
                    System.out.printf("%3c", grid [row][col]);
                }
                System.out.printf("%n");
            }
0 голосов
/ 09 мая 2020

Некоторые изменения

  • Я изменил метод gameOver(), который, по-видимому, был проблемой: практически вы не передали текущую сетку, но вы всегда создавали новую, поэтому тривиально элемент управления искажено.
  • Я исправил while-l oop, заменив логическую переменную playing простым методом «break»: это означает, что если игрок 1 выигрывает, он немедленно выходит цикл;
  • Я улучшил вставку;
  • Я создал очень удобный метод, который избавляет вас от необходимости каждый раз писать для отображения сетки: showGrid()

Код

public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);

        // GRID set up
        int SIDE = 3;
        char[][] grid = new char[SIDE][SIDE];
        for (int row = 0; row < SIDE; row++) {
            for (int col = 0; col < SIDE; col++) {
                grid[row][col] = '_';
            }
        }

        while (true) {
            showGrid(grid, SIDE);
            System.out.println("Player1: Please enter row coordinate for your move");
            int row1 = input.nextInt();
            System.out.println("Player1: Please enter column coordinate *for-loop* your move");
            int col1 = input.nextInt();
            grid[row1 - 1][col1 - 1] = 'x';
            if (gameOver(grid, row1 - 1, col1 - 1)) {
                showGrid(grid, SIDE);
                System.out.println("Game Over");
                break;
            }
            showGrid(grid, SIDE);
            System.out.println("Player2: Please enter row coordinate for your move");
            int row2 = input.nextInt();
            System.out.println("Player2: Please enter column coordinate for your move");
            int col2 = input.nextInt();
            grid[row2 - 1][col2 - 1] = 'O';
            if (gameOver(grid, row1 - 1, col1 - 1)) {
                showGrid(grid, SIDE);
                System.out.println("Game Over");
                break;
            }
        }

    }

    public static boolean gameOver(char[][] grid, int rMove, int cMove) {
        if (grid[0][cMove] == grid[1][cMove]
                && grid[0][cMove] == grid[2][cMove])
            return true;
        if (grid[rMove][0] == grid[rMove][1]
                && grid[rMove][0] == grid[rMove][2])
            return true;
        //Check diagonal victory
        if (grid[0][0] == grid[1][1] && grid[0][0] == grid[2][2]
                && grid[1][1] != '_')
            return true;
        if (grid[0][2] == grid[1][1] && grid[0][2] == grid[2][0]
                && grid[1][1] != '_')
            return true;
        return false;
    }

    public static void showGrid(char[][] grid, int side) {
        for (int row = 0; row < side; row++) {
            for (int col = 0; col < side; col++) {
                System.out.printf("%3c", grid[row][col]);
            }
            System.out.printf("%n");
        }
    }

Помните, что имена методов всегда указаны в верблюжьем регистре .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...