如何在我的连接四游戏中检查哪个玩家移动?

时间:2016-12-19 18:47:09

标签: java

我正在尝试创建一个方法/ while循环,用于检查哪个玩家移动。现在我检查哪个游戏在for循环中移动。我想让我的代码更清晰简洁。这是主要方法:

public static void main(String[] args) {


            try (Scanner input = new Scanner(System.in)) {
                int height = 6, width = 8, moves = height * width;
                ConnectFour board = new ConnectFour(width, height);
                System.out.println("Use 0-" + (width - 1) + " to choose a column.");
                System.out.println(board);



                for (int player = 0; moves-- > 0; player = 1 - player) {  // Here is where i check to see who plays 
                    char symbol = players[player];
                    board.chooseAndDrop(symbol, input);
                    System.out.println(board);
                    if (board.isWinningPlay()) {
                        System.out.println("Player " + symbol + " wins!");
                        return;
                    }
                }
                System.out.println("Game over, no winner.");
            }


        }

我的想法更多:

                    int playerNb = 0;
                    while (thegamestarted)
                    {
                        if (playerNb == 0)
                            // Get user input
                        else
                            // Get second player input

                        // Process the input
                        // Change playerNb to 1 or 0
                    }

以下是完整代码:

    import java.util.Arrays;
    import java.util.Scanner;
    import java.util.stream.Collectors;
    import java.util.stream.IntStream;

    public class ConnectFour {
        private static final char[] players = new char[] { 'X', 'O' };

        private final int width, height;
        private final char[][] grid;
        private int lastCol = -1, lastTop = -1;

        public ConnectFour(int width, int height) {
            this.width = width;
            this.height = height;
            this.grid = new char[height][];
            for (int h = 0; h < height; h++) {
                Arrays.fill(this.grid[h] = new char[width], '.');
            }
        }

        public String toString() {
            return IntStream.range(0, this.width)
                            .mapToObj(Integer::toString)
                            .collect(Collectors.joining()) + "\n" +
                   Arrays.stream(this.grid)
                         .map(String::new)
                         .collect(Collectors.joining("\n"));
        }

        /**
         * Prompts the user for a column, repeating until a valid
         * choice is made.
         */
        public void chooseAndDrop(char symbol, Scanner input) {
            do {
                System.out.print("\nPlayer " + symbol + " turn: ");
                int col = input.nextInt();

                if (! (0 <= col && col < this.width)) {
                    System.out.println("Column must be between 0 and " +
                                       (this.width - 1));
                    continue;
                }
                for (int h = this.height - 1; h >= 0; h--) {
                    if (this.grid[h][col] == '.') {
                        this.grid[this.lastTop=h][this.lastCol=col] = symbol;
                        return;
                    }
                }

                System.out.println("Column " + col + " is full.");
            } while (true);
        }

        /**
         * Detects whether the last chip played was a winning move.
         */
        public boolean isWinningPlay() {
            if (this.lastCol == -1) {
                throw new IllegalStateException("No move has been made yet");
            }
            char sym = this.grid[this.lastTop][this.lastCol];
            String streak = String.format("%c%c%c%c", sym, sym, sym, sym);
            return contains(this.horizontal(), streak) ||
                   contains(this.vertical(), streak) ||
                   contains(this.slashDiagonal(), streak) ||
                   contains(this.backslashDiagonal(), streak);
        }

        /**
         * The contents of the row containing the last played chip.
         */
        private String horizontal() {
            return new String(this.grid[this.lastTop]);
        }

        /**
         * The contents of the column containing the last played chip.
         */
        private String vertical() {
            StringBuilder sb = new StringBuilder(this.height);
            for (int h = 0; h < this.height; h++) {
                sb.append(this.grid[h][this.lastCol]);
            }
            return sb.toString();
        }

        /**
         * The contents of the "/" diagonal containing the last played chip
         * (coordinates have a constant sum).
         */
        private String slashDiagonal() {
            StringBuilder sb = new StringBuilder(this.height);
            for (int h = 0; h < this.height; h++) {
                int w = this.lastCol + this.lastTop - h;
                if (0 <= w && w < this.width) {
                    sb.append(this.grid[h][w]);
                }
            }
            return sb.toString();
        }

        /**
         * The contents of the "\" diagonal containing the last played chip
         * (coordinates have a constant difference).
         */
        private String backslashDiagonal() {
            StringBuilder sb = new StringBuilder(this.height);
            for (int h = 0; h < this.height; h++) {
                int w = this.lastCol - this.lastTop + h;
                if (0 <= w && w < this.width) {
                    sb.append(this.grid[h][w]);
                }
            }
            return sb.toString();
        }

        private static boolean contains(String haystack, String needle) {
            return haystack.indexOf(needle) >= 0;
        }

        public static void main(String[] args) {
            try (Scanner input = new Scanner(System.in)) {
                int height = 6, width = 8, moves = height * width;
                ConnectFour board = new ConnectFour(width, height);
                System.out.println("Use 0-" + (width - 1) + " to choose a column.");
                System.out.println(board);

                for (int player = 0; moves-- > 0; player = 1 - player) {
                    char symbol = players[player];
                    board.chooseAndDrop(symbol, input);
                    System.out.println(board);
                    if (board.isWinningPlay()) {
                        System.out.println("Player " + symbol + " wins!");
                        return;
                    }
                }
                System.out.println("Game over, no winner.");
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

从你的代码中分辨出你想要的东西有点困难,但是跟踪它是什么玩家的绝对最简单的方法是跟踪转弯数,并用模数检查它是偶数还是奇数功能

这只是一个简短的伪代码,向您展示如何通过简单的数学来判断转向是什么。您必须根据自己的需要进行调整。你可以看到它只会是&#34;玩家2&#34;打开一个偶数转弯数,其中转弯数除以2没有余数。请记住在每次移动后增加转弯。

没有&#34;好&#34;回答。你是编写代码的人,你可以决定轮到你,你只需要跟踪它。

int turn = 1;

for ( ) {
    if (turn % 2 == 0) {
        System.out.println("Player 2");
    } else {
        System.out.println("Player 1");
    }
    turn++;
}