如何在andriod app - tic toe中对抗计算机

时间:2018-06-05 05:13:01

标签: java android

我有一个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;
}

1 个答案:

答案 0 :(得分:0)

在你的onClick方法结束时,它将是:

(1)对手的移动(这是你交换X&O和o的地方)

(2)最后一名球员的胜利

(3)平局(所有方框已经填满,没有人可以移动)

所以你只需编写一些代码来处理(1) - 就像为AI决定一样。

我建议制作一种方法,独立于电路板状态检查获胜状态 。所以你需要传递一个矩阵或3x3数组。

你运行它以查看移动的玩家是否赢了。

然后,对于每个空白点,您只复制当前的棋盘状态和该副本,用移动的球员的颜色/形状/图标/角色填充其中一个空白。然后将每个数组传递给检查算法。

告诉你(AI)你的行动是否获胜。 (如果获胜不止一次,只需随意挑选一次)

如果你的动作没有立即获胜,那么你再次为每个空位复制当前的棋盘状态 - 但现在为敌人(即人类)制作。然后为每个副本填写其中一个点,然后将其传递给你的“胜利”。算法。这告诉你人类是否在转弯时立即获胜(例如,如果你什么也没做,他们又转了一圈,或者你在某个地方打得没用)。

如果他们有胜利......破坏它! Muahahaha!拿那个fleshbags! :d

如果没有胜利或失败,你可以随机玩。

拥有386台时代的计算机,这本来就非常快,所以即使经过多次比较,它在现代硬件(甚至是手表/手机)上的速度仍然非常快。

即使如此,也许值得考虑加快速度。

E.g。有一个基于数字的内部表示,而不是字符串。

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

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

当然,这是使用数字线的镜像特性(0以上和0以下),因此它不会超过2个玩家。 (虽然字符串或字符可以推广到超过2个玩家,但是你需要更大的棋盘等等,而且对于那么多玩家而言,tic tac toe可能并不是很有趣(每个玩家之间的动作太多了)你的举动???))