当前位置: 首页 > 知识库问答 >
问题:

用Java编程一个国际象棋游戏,gameOver boolean不起作用

夹谷岳
2023-03-14

我正试图用Java做一个可以在控制台上玩的象棋游戏。对于每一步,游戏要求玩家要一个棋子(例如,第二行第三列的棋子为12个)和一个最终位置(例如,第四行第三列为32个)。一切都工作得很好,包括测试移动是否非法,以及给定的玩家是否在检查中,但我的gameOver boolean似乎在要求第一步移动之前改变了我的棋盘数组的值。

以下是相关代码。从我的主要方法:

public static void main(String[] args) {
    int[][] board = {   {12, 13, 14, 15, 16, 14, 13, 12},
                        {11, 11, 11, 11, 11, 11, 11, 11},
                        {0,  0,  0,  0,  0,  0,  0,  0},
                        {0,  0,  0,  0,  0,  0,  0,  0},
                        {0,  0,  0,  0,  0,  0,  0,  0},
                        {0,  0,  0,  0,  0,  0,  0,  0},
                        {21, 21, 21, 21, 21, 21, 21, 21},
                        {22, 23, 24, 25, 26, 24, 23, 22}
                    };
    Scanner scan = new Scanner(System.in);
    boolean oneTurn = true;
    while(!(gameOver(oneTurn, board))) {
        printBoard(board);
        System.out.println(((oneTurn) ? "1's" : "2's") +  " turn");
        System.out.print("What piece? ");
        int origin = scan.nextInt();

gameOver boolean,它测试当前玩家是否可以做出任何合法的动作,不会让玩家受到限制:

public static boolean gameOver(boolean oneTurn, int[][] board) {
    for (int a = 0; a<8; a++) {
        for(int b = 0; b<8; b++) {
            for (int c = 0; c<8; c++) {
                for(int d = 0; d<8; d++) {
                    if(board[a][b] / 10 == (oneTurn ? 1 : 2) && !(illegal(oneTurn, 10*a+b, 10*c+d, board)) && !(illegalCheck(oneTurn, 10*a+b, 10*c+d, board))) return false;
                }
            }
        }
    }
    return true;
}
public static boolean check(boolean oneTurn, int[][] board) {
    int king = kingNum(oneTurn, board);
    for (int a = 0; a<8; a++) {
        for(int b = 0; b<8; b++) {
            if(board[a][b] / 10 == (oneTurn ? 2 : 1) && !(illegal(!oneTurn, 10*a+b, king, board))) return true;
        }
    }
    return false;
}
public static boolean illegalCheck(boolean oneTurn, int origin, int dest, int[][] board) {
    int[][] newBoard = board;
    newBoard[dest / 10][dest % 10] = board[origin / 10][origin % 10];
    newBoard[origin / 10][origin % 10] = 0;
    if(check(oneTurn, newBoard)) return true;
    else return false;
}
    |  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |
_____________________________________________

0   | 1R |    | 1B | 1Q | 1K | 1B | 1N | 1R |
_____________________________________________

1   | 1P | 1P | 1P | 1P | 1P | 1P | 1P | 1P |
_____________________________________________

2   |    |    |    |    |    |    |    |    |
_____________________________________________

3   |    |    |    |    |    |    |    |    |
_____________________________________________

4   |    |    |    |    |    |    |    |    |
_____________________________________________

5   |    |    |    |    |    |    |    |    |
_____________________________________________

6   | 2P | 2P | 2P | 2P | 2P | 2P | 2P | 2P |
_____________________________________________

7   | 2R | 2N | 2B | 2Q | 2K | 2B | 2N | 2R |
_____________________________________________

1's turn
What piece? 

gameOver发现的第一个合法移动是骑士移动,所以我想这就是为什么骑士没有出现在第一板上。当我把printBoard方法放在布尔测试之前时,板子打印得很完美。

我最近才开始学习编程,所以我会很感激任何关于为什么会发生这种情况的建议。很明显我错过了什么。让我知道如果有其他细节我可以提供。谢谢!

共有1个答案

阴宏爽
2023-03-14

当你写的时候

int[][] newBoard = board;
newBoard[dest / 10][dest % 10] = board[origin / 10][origin % 10];
newBoard[origin / 10][origin % 10] = 0;

创建newboard作为对与board相同的数组对象的新引用,然后继续修改数组。您可以这样复制它:

int[][] newBoard = new int[8][];
for (int i = 0; i < newBoard.length; ++i)
    newBoard[i] = board[i].clone();

Java的多维数组是引用其他数组的数组(因为数组是对象),所以我们首先创建一个新的顶级数组,然后将附属数组的副本分配给它。(有一系列关于object.clone()cloneable的规则,但是您在这里必须知道的是,克隆一个数组将生成一个具有相同值的新数组。对于多维数组,这是一个浅层副本(副本引用相同的子数组),所以我们不能只调用board.clone()就这么做了。)

 类似资料:
  • 本文向大家介绍Javafx实现国际象棋游戏,包括了Javafx实现国际象棋游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Javafx实现国际象棋游戏的具体代码,供大家参考,具体内容如下 基本规则 棋子马设计“日”的移动方式 兵设计只能向前直走,每次只能走一格。但走第一步时,可以走一格或两格的移动方式 请为后设计横、直、斜都可以走,步数不受限制,但不能越子的移动方式。 车只能横向

  • 我目前正在编写我的第一盘国际象棋,我的棋子有一个小问题。我将在下面添加一些代码,但通常我想检查玩家移动某个棋子(在本例中为国王)的棋盘是否已经被另一个棋子占据,因为在这种情况下,另一个棋子将被杀死(如果棋子属于另一个玩家),或者移动是错误的(棋子被自己的棋子占据)。如果你对如何做有任何想法,我将不胜感激。顺致敬意, 公共抽象类文章{ } 公共类国王延伸件{ }

  • 我目前正在创建一个国际象棋游戏,包括以下几个类: ChessPiece-对于所有不同的棋子,由一个Movement行为实例变量组成 移动行为-接口实现的当铺移动行为,KingMovement行为等类,以定义如何每个片类型移动 ChessBoard-由ChessPiece[][] 2D数组组成,具有addPiece()/RemvePiece()/replace ePiece()等功能 玩家-小班帮助

  • 我刚刚学习了Android和Java编程(里面非常noob),我想问一些关于Android编程和Socket服务器的问题。 我得到一个任务,创建一个简单的国际象棋应用程序(不包括AI),棋子的位置将从TCP套接字中检索: 服务器:xinuc.org 端口:7387 我被告知使用Socket Persistent,因为服务器会在每秒更新典当的位置,典当的位置将以这种格式发送 [卒典][横位][竖位]

  • 我正在下国际象棋,除了一件事,我几乎得到了所有的东西:我需要使棋手不可能将棋子移动到棋盘上。我很难解决这个问题。 我现在用伪代码生成的有效移动是:类getMoveLocations(我定义了一个位置为国际象棋中的一个方块):如果这个位置在边界内,这个位置的棋子是敌人的棋子,并且模拟的移动不会导致棋盘被检查,然后将该位置添加到工件可以移动到的可能位置。 问题是我如何检查棋盘是否“在检查中”。在我的代

  • DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。