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

使用Java定制TicTacToe游戏板

赵光赫
2023-03-14

我需要创建一个方法来检查tictactoe游戏是否在玩、DRAW、XWIN或owin。然而,我很难编写代码来检查X或O是否获胜,因为游戏板的大小和获胜所需的大小(sizeWin)会根据用户的输入而改变。我被迫使用一维阵列的游戏板。我根本不知道从这里到哪里去。我最近的想法是使用嵌套的for循环来检查是否按行、列或对角线获得胜利,但我不确定如何实现它。如果有人对如何处理这个问题有任何提示,或者有任何其他的解决方法,我将非常感谢

private void setGameState(int i) {

    // Check rows
    getLines();
    getColumns();
    getSizeWin();
    for (row = 0; row == lines; row++) {
        for (col = 0; col == columns; col++) {

        }
    }
}

public TicTacToeGame(int lines, int columns, int sizeWin) {

    // linesXcolumns game, starts with X, need sizeWin in a line/column/diag to win
    this.lines = lines;
    this.columns = columns;
    CellValue currentCellValue = CellValue.X;
    this.sizeWin = sizeWin;

    // Creating board according to given size
    int size = lines * columns;
    this.board = new CellValue[size];

    // Setting up board to be empty
    for (int i = 0; i < size; i++) {
        board[i] = CellValue.EMPTY;
    }
}

ps.如果有人将操作员称为TicTacToe(3,4,3),一个由3行4列组成的游戏板就会打印出来。赢的X或O的数目是3。

    CAM$ java TicTacToe 3 4 3 
      |    |    |
    ---------------
      |    |    |     
    --------------- 
      |    |    |

共有1个答案

夹谷浩宕
2023-03-14

它比看起来要复杂一点,但你得到它之后,它就简单了。我做了一个工作正常的函数:

private static String checkGameState() {
    // Looking for errors.
    if (rowCount <= 0 || columnCount <= 0) {
        return "ERROR: Illegal board size: " + rowCount + "*" + columnCount;
    }
    if (boradContent.length != rowCount * columnCount) {
        return "ERROR: boradContent not compatible with rowSize and columnSize.";
    }
    if (sizeWin > rowCount && sizeWin > columnCount) {
        return "ERROR: Board is too small for this sizeWin: " + sizeWin + ".";
    }

    String gameState = "PLAYING";

    // Checking rows
    for (int i = 0; i < rowCount; i++) {
        char currentChar = getField(i, 0);
        int score = 1;
        for (int j = 1; j < columnCount; j++) {
            if (currentChar == getField(i, j)) {
                score++;
                if (score >= sizeWin) {
                    if (gameState.equals("PLAYING")) {
                        gameState = currentChar + "WIN";
                    } else if (!gameState.equals(currentChar + "WIN")) {
                        gameState = "DRAW";
                        return gameState;
                    }
                }
            } else {
                if (j > columnCount - sizeWin) {
                    break;
                }
                score = 1;
                currentChar = getField(i, j);
            }
        }
    }

    // Checking columns
    for (int j = 0; j < columnCount; j++) {
        char currentChar = getField(0, j);
        int score = 1;
        for (int i = 1; i < rowCount; i++) {
            if (currentChar == getField(i, j)) {
                score++;
                if (score >= sizeWin) {
                    if (gameState.equals("PLAYING")) {
                        gameState = currentChar + "WIN";
                    } else if (!gameState.equals(currentChar + "WIN")) {
                        gameState = "DRAW";
                        return gameState;
                    }
                }
            } else {
                if (j > rowCount - sizeWin) {
                    break;
                }
                score = 1;
                currentChar = getField(i, j);
            }
        }
    }

    // Checking diagonally
    // Checking diagonally - from top-left to bottom-right
    for (int i = 0; i < rowCount - sizeWin + 1; i++) {
        for (int j = 0; j < columnCount - sizeWin + 1; j++) {
            char currentChar = getField(i, j);
            int score = 1;
            for (int k = 1; k < sizeWin; k++) {
                if (currentChar == getField(i + k, j + k)) {
                    score++;
                    if (score >= sizeWin) {
                        if (gameState.equals("PLAYING")) {
                            gameState = currentChar + "WIN";
                        } else if (!gameState.equals(currentChar + "WIN")) {
                            gameState = "DRAW";
                            return gameState;
                        }
                    }
                } else {
                    break;
                }
            }

        }
    }

    // Checking diagonally - from top-right to bottom-left
    for (int i = 0; i < rowCount - sizeWin + 1; i++) {
        for (int j = sizeWin -1; j < columnCount; j++) {
            char currentChar = getField(i, j);
            int score = 1;
            for (int k = 1; k < sizeWin; k++) {
                if (currentChar == getField(i + k, j - k)) {
                    score++;
                    if (score >= sizeWin) {
                        if (gameState.equals("PLAYING")) {
                            gameState = currentChar + "WIN";
                        } else if (!gameState.equals(currentChar + "WIN")) {
                            gameState = "DRAW";
                            return gameState;
                        }
                    }
                } else {
                    break;
                }
            }

        }
    }

    return gameState;
}

值得一提的是,rowCount、columnCount、sizeWin和boradContent变量都是类级变量,我使用了getField(int X,int Y)方法,这不是很复杂,但更有用。它只是将给定的字段坐标转换为一维数组中的位置,并返回其内容:

private static char getField(int X, int Y) {
    return boradContent[X * columnCount + Y];
}
 类似资料:
  • 本文向大家介绍Java控制台实现猜拳游戏小游戏,包括了Java控制台实现猜拳游戏小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java猜拳游戏的具体代码,供大家参考,具体内容如下 先来看一下效果图:  首先我们创建一个Person类,这个类有name和score两个属性,有play这个方法,源代码如下: 接下来是主程序入口: 源代码下载:Java猜拳游戏 以上就是本文的全部内

  • 我正在为PC游戏做一个简单的叠加程序。它只是一个位于屏幕中央的透明矩形,但其大小由用户的鼠标滚轮控制。所以概念是简单地将透明矩形的大小与敌方玩家的大小匹配,来计算他的距离。 不幸的是,我不能用传统的鼠标监听器实现这一点,因为鼠标必须同时关注游戏和覆盖程序。我正在尝试JNativeHook,但无法更新我的矩形。有什么建议吗?

  • 包含在程序启动时启动的线程。这个线程包含一个循环,每40毫秒更新一次游戏并重新绘制()board。 备选办法B: 板创建一个摆动计时器。这个计时器的动作监听器是板本身。actionPerformed()方法每40毫秒运行一次,并更新game+repaints Board()。 谢谢

  • 我用随机数生成了一个简单的游戏。如果数字是正确的,请在文本字段中输入正确的数字,并与ramdom数字游戏相匹配,然后再次尝试。但如果号码与ramdom匹配,请始终显示消息,然后重试。我在下面写下了迄今为止我所做的尝试。 lbltxt上打印的文本是什么。getText()我等于txtRam txtfield,但no等于罚款,但显示为重试

  • 你将如何能够使用Pyplay创建多个屏幕和用户执行的事件? 例如,如果我有一个带有两个按钮(“开始”和“退出”)的菜单屏幕,并且用户单击了“开始”,一个新的屏幕将与游戏中的下一个按钮出现在同一个窗口中。在该屏幕上,用户可以点击另一个按钮,然后移动到另一个屏幕/返回菜单等。

  • 所以我为我的课做了一个抽动练习作业。我已经成功地创建了一个简单的Tic Tac Toe程序,但不知何故,检查绘制的方法有时并不正确。如果所有东西都填满了,但没有赢家,那就是平局。但如果除第0行第1列外,其他所有内容都已填满,则即使该框仍为空白,它仍将显示“Draw”。如果你不明白我的意思,就试着把所有的东西都填满,但不是赢,即使最后一个框没有填满,它也会说“平局”。我在代码中做错了什么????驱动