Java 四子连游戏

编程练习题

四子连是一个两个人玩的棋盘游戏,在游戏中,玩家轮流将不同的棋子放在一个六行七列的垂直悬挂的网格中。这个游戏的目的是看谁先实现一行、一列或者一条对角线上有四个相同的棋子。程序提示两个玩家交替地下棋,当放下一子时,程序在控制台重新显示这个棋盘,然后确定游戏的状态(蠃、平局还是继续)。

运行示例

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-0-1-2-3-4-5-6-
玩家 X 放下列数(0 ~ 6):3
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | |X| | | |
-0-1-2-3-4-5-6-
玩家 O 放下列数(0 ~ 6):2
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |O|X| | | |
-0-1-2-3-4-5-6-
玩家 X 放下列数(0 ~ 6):4

. . . . . . . .

| | | | |O| | |
| |X|O|X|X|O| |
| |X|X|X|O|O| |
| |X|O|O|O|X| |
| |O|X|X|O|O| |
| |X|O|X|X|O| |
-0-1-2-3-4-5-6-
玩家 X 放下列数(0 ~ 6):1
| |X| | |O| | |
| |X|O|X|X|O| |
| |X|X|X|O|O| |
| |X|O|O|O|X| |
| |O|X|X|O|O| |
| |X|O|X|X|O| |
-0-1-2-3-4-5-6-
玩家 X 获胜

参考代码

import java.util.Scanner;
public class Game {
    private static Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        char[][] board = new char[6][7];
        displayBoard(board);
        while (true) {
            dropADisc('X', board);
            displayBoard(board);
            if (isWon(board)) {
                System.out.println("玩家 X 获胜");
                System.exit(1);
            }
            else if (isDraw(board)) {
                System.out.println("平局");
                System.exit(2);
            }
            dropADisc('O', board);
            displayBoard(board);
            if (isWon(board)) {
                System.out.println("玩家 O 获胜");
                System.exit(3);
            }
            else if (isDraw(board)) {
                System.out.println("平局");
                System.exit(4);
            }
        }
    }
    private static void dropADisc(char player, char[][] board) {
        boolean done = false;
        do {
            System.out.print("玩家 " + player + " 放下列数(0 ~ 6):");
            int column = input.nextInt();
            if (placeADisk(board, column, player))
                done = true;
            else
                System.out.println("该列已满");
        }
        while (!done);
    }
    private static boolean placeADisk(char[][] board, int column, char player) {
        for (int i = 0; i < board.length; i++) {
            if (board[i][column] == '\0') {
                board[i][column] = player;
                return true;
            }
        }
        return false;
    }
    private static void displayBoard(char[][] board) {
        for (int i = board.length - 1; i >= 0; i--) {
            System.out.print("|");
            for (int j = 0; j < board[i].length; j++)
                System.out.print(board[i][j] != '\0' ?  board[i][j] + "|": " |");
            System.out.println();
        }
        System.out.println("-0-1-2-3-4-5-6-");
    }
    private static boolean isWon(char[][] board) {
        return isConsecutiveFour(board);
    }
    private static boolean isDraw(char[][] board) {
        for (char[] chars : board)
            for (char aChar : chars)
                if (aChar == '\0')
                    return false;
        return true;
    }
    private static boolean isConsecutiveFour(char[][] values) {
        int numberOfRows = values.length;
        int numberOfColumns = values[0].length;
        for (char[] value : values)
            if (isConsecutiveFour(value))
                return true;
        for (int j = 0; j < numberOfColumns; j++) {
            char[] column = new char[numberOfRows];
            for (int i = 0; i < numberOfRows; i++)
                column[i] = values[i][j];
            if (isConsecutiveFour(column))
                return true;
        }
        for (int i = 0; i < numberOfRows - 3; i++) {
            int numberOfElementsInDiagonal = Math.min(numberOfRows - i, numberOfColumns);
            char[] diagonal = new char[numberOfElementsInDiagonal];
            for (int k = 0; k < numberOfElementsInDiagonal; k++)
                diagonal[k] = values[k + i][k];
            if (isConsecutiveFour(diagonal))
                return true;
        }
        for (int j = 1; j < numberOfColumns - 3; j++) {
            int numberOfElementsInDiagonal = Math.min(numberOfColumns - j, numberOfRows);
            char[] diagonal = new char[numberOfElementsInDiagonal];
            for (int k = 0; k < numberOfElementsInDiagonal; k++)
                diagonal[k] = values[k][k + j];
            if (isConsecutiveFour(diagonal))
                return true;
        }
        for (int j = 3; j < numberOfColumns; j++) {
            int numberOfElementsInDiagonal = Math.min(j + 1, numberOfRows);
            char[] diagonal = new char[numberOfElementsInDiagonal];
            for (int k = 0; k < numberOfElementsInDiagonal; k++)
                diagonal[k] = values[k][j - k];
            if (isConsecutiveFour(diagonal))
                return true;
        }
        for (int i = 1; i < numberOfRows - 3; i++) {
            int numberOfElementsInDiagonal = Math.min(numberOfRows - i, numberOfColumns);
            char[] diagonal = new char[numberOfElementsInDiagonal];
            for (int k = 0; k < numberOfElementsInDiagonal; k++)
                diagonal[k] = values[k + i][numberOfColumns - k - 1];
            if (isConsecutiveFour(diagonal))
                return true;
        }
        return false;
    }
    private static boolean isConsecutiveFour(char[] values) {
        for (int i = 0; i < values.length - 3; i++) {
            boolean isEqual = true;
            for (int j = i; j < i + 3; j++)
                if (values[j] == '\0' || values[j] != values[j + 1]) {
                    isEqual = false;
                    break;
                }
            if (isEqual)
                return true;
        }
        return false;
    }
}

你可能感兴趣的:(Java 四子连游戏)