Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android应用程序中对抗电脑-tic tac toe_Java_Android - Fatal编程技术网

Java 如何在android应用程序中对抗电脑-tic tac toe

Java 如何在android应用程序中对抗电脑-tic tac toe,java,android,Java,Android,我有一个tic-tac游戏设置,需要一些代码实现方面的帮助,以使其适用于计算机和人类,可能是使用minmax算法。我目前已经为玩家对玩家设置了它,但是我如何才能包含玩家对电脑的代码,因为我对这个问题已经不知所措了 @Override public void onClick(View v) { if (!((Button) v).getText().toString().equals("")) { return; } if (playerOneMove)

我有一个tic-tac游戏设置,需要一些代码实现方面的帮助,以使其适用于计算机和人类,可能是使用minmax算法。我目前已经为玩家对玩家设置了它,但是我如何才能包含玩家对电脑的代码,因为我对这个问题已经不知所措了

@Override
public void onClick(View v) {

    if (!((Button) v).getText().toString().equals("")) {
        return;
    }

    if (playerOneMove) {
        ((Button) v).setText("X");
        ((Button) v).setTextColor(playerX);
    } else {
        ((Button) v).setText("O");
        ((Button) v).setTextColor(playerO);
    }

    turnsCount++;

    if (checkGameIsWon()) {
        if (playerOneMove) {
            player1Wins();
        } else {
            player2Wins();
        }
    } else if (turnsCount == 9) {
        draw();
    } else {
        playerOneMove = !playerOneMove;
        switchPlayerTurn();
    }
}

private boolean checkGameIsWon() {
    String[][] field = new String[3][3];

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            field[i][j] = buttons[i][j].getText().toString();
        }
    }

    for (int i = 0; i < 3; i++) {
        if (field[i][0].equals(field[i][1])
                && field[i][0].equals(field[i][2])
                && !field[i][0].equals("")) {
            return true;
        }
    }

    for (int i = 0; i < 3; i++) {
        if (field[0][i].equals(field[1][i])
                && field[0][i].equals(field[2][i])
                && !field[0][i].equals("")) {
            return true;
        }
    }

    if (field[0][0].equals(field[1][1])
            && field[0][0].equals(field[2][2])
            && !field[0][0].equals("")) {
        return true;
    }

    if (field[0][2].equals(field[1][1])
            && field[0][2].equals(field[2][0])
            && !field[0][2].equals("")) {
        return true;
    }

    return false;
}
@覆盖
公共void onClick(视图v){
if(!((按钮)v.getText().toString()等于(“”){
返回;
}
如果(移动){
((按钮)v.setText(“X”);
(按钮)v.setTextColor(playerX);
}否则{
(按钮)v.setText(“O”);
(按钮)v.setTextColor(playerO);
}
TurnScont++;
if(checkGameIsWon()){
如果(移动){
player1Wins();
}否则{
player2Wins();
}
}否则如果(turnsCount==9){
draw();
}否则{
playeronmove=!playeronmove;
switchPlayerTurn();
}
}
私有布尔checkGameIsWon(){
字符串[][]字段=新字符串[3][3];
对于(int i=0;i<3;i++){
对于(int j=0;j<3;j++){
字段[i][j]=按钮[i][j].getText().toString();
}
}
对于(int i=0;i<3;i++){
如果(字段[i][0]。等于(字段[i][1])
&&字段[i][0]。等于(字段[i][2])
&&!字段[i][0]。等于(“”){
返回true;
}
}
对于(int i=0;i<3;i++){
如果(字段[0][i]。等于(字段[1][i])
&&字段[0][i]。等于(字段[2][i])
&&!字段[0][i]。等于(“”){
返回true;
}
}
如果(字段[0][0]。等于(字段[1][1])
&&字段[0][0]。等于(字段[2][2])
&&!字段[0][0]。等于(“”){
返回true;
}
如果(字段[0][2]。等于(字段[1][1])
&&字段[0][2]。等于(字段[2][0])
&&!字段[0][2]。等于(“”){
返回true;
}
返回false;
}

在onClick方法的末尾,它将是:

(1) 对手的移动(这是交换X和O的位置)

(2) 最后一个移动的玩家的胜利

(3) 抽签(所有盒子都已填满,没有人可以移动)


因此,您只需编写一些代码来处理(1)——如为AI做出决策

我的建议是制定一种独立于董事会状态检查获胜状态的方法。所以你需要传递一个矩阵或3x3数组

你运行它,看看移动玩家是否赢了

然后,对于每个空白点,您制作一份当前板状态的副本,仅对于该副本,用移动玩家的颜色/形状/图标/字符填充其中一个空格。然后将每个数组传递给检查算法

这会告诉你(人工智能)你的移动是否成功。(如果超过一个招式获胜,只需随机选择一个)

如果你的任何一个招式都没有立即获胜,那么你会再次为每个空位复制当前的棋盘状态——但现在为敌人(即人类)复制。然后为每个副本填写其中一个点,并将其传递给“DoesThisWin”算法。这会告诉你该人在轮到他们时是否立即获胜(例如,如果你什么也没做,他们又轮到了一次,或者如果你在某个没用的地方打球)

如果他们赢了。。。破坏它!哈哈哈!拿着那个肉袋D

如果没有赢或输,你可以随机玩

对于386时代的电脑来说,速度会快得让人目瞪口呆,所以尽管有很多比较,但在现代硬件(甚至是手表/手机)上,速度仍然非常快


即便如此,还是值得考虑加快速度

例如,具有基于数字而非字符串的内部表示

假设X=1,O=-1,[empty]=0

现在我们加上[0][0]+[0][1]+[0][2]如果总数是3(或-3),那么我们赢了


当然,这是使用数字线的镜像性质(0以上和0以下),因此它不会推广到2个以上的玩家。(虽然字符串或字符可以概括为2个以上的玩家,但你需要一个更大的棋盘等等,而且tic-tac-toe可能对这么多玩家不感兴趣(你的每个动作之间有太多破坏性的动作??)

由于我的问题更多地是实现方面的问题,所以您可以使用上面的代码片段在示例代码中显示这一点吗?谢谢你的回答?