Android TicTacToe -随机游戏结局



所以今天我制作《TicTacToe》是出于学习目的,在我自己尝试之前,一切看起来都很好-在某些情况下游戏会提前结束。假设这是我的tictactoe网格

1|2|3
4|5|6
7|8|9

例如,当我将X放在2和0时,游戏突然结束,得出玩家2(0用户)获胜的结论。

这是我用来判断某人是否获胜的函数。我做这样的计算可能有点傻,但我真的不知道有什么其他的方法可以发现什么时候有人赢了,并决定谁是赢家。只是简单的8个if语句,包含所有可能的结果,包括获胜者。

(plr1, plr2 -字符串值为"X"one_answers"O",text1,2,3是X和O的textview,它们的排列方式与上面的网格相同)

if(text1.getText().toString() == text2.getText().toString() && text2.getText().toString() == text3.getText().toString()) {
        if(text1.getText().toString() == plr1) {
            status.setText("Player 1 won!");
            gameRunning = false;
        }
        else if(text1.getText().toString() == plr2){
            status.setText("Player 2 won!");
            gameRunning = false;
        }
    }
    else if(text4.getText().toString() == text5.getText().toString() && text5.getText().toString() == text6.getText().toString()) {
        if(text4.getText().toString() == plr1) {
            status.setText("Player 1 won!");
            gameRunning = false;
        }
        else if(text1.getText().toString() == plr2){
            status.setText("Player 2 won!");
            gameRunning = false;
        }
    }
    else if(text7.getText().toString() == text8.getText().toString() && text8.getText().toString() == text9.getText().toString()) {
        if(text1.getText().toString() == plr1) {
            status.setText("Player 1 won!");
            gameRunning = false;
        }
        else if(text1.getText().toString() == plr2){
            status.setText("Player 2 won!");
            gameRunning = false;
        }
    }
    else if(text1.getText().toString() == text4.getText().toString() && text4.getText().toString() == text7.getText().toString()) {
        if(text1.getText().toString() == plr1) {
            status.setText("Player 1 won!");
            gameRunning = false;
        }
        else if(text1.getText().toString() == plr2){
            status.setText("Player 2 won!");
            gameRunning = false;
        }
    }
    else if(text2.getText().toString() == text5.getText().toString() && text5.getText().toString() == text8.getText().toString()) {
        if(text1.getText().toString() == plr1) {
            status.setText("Player 1 won!");
            gameRunning = false;
        }
        else if(text1.getText().toString() == plr2){
            status.setText("Player 2 won!");
            gameRunning = false;
        }
    }
    else if(text3.getText().toString() == text6.getText().toString() && text6.getText().toString() == text9.getText().toString()) {
        if(text1.getText().toString() == plr1) {
            status.setText("Player 1 won!");
            gameRunning = false;
        }
        else if(text1.getText().toString() == plr2){
            status.setText("Player 2 won!");
            gameRunning = false;
        }
    }
    else if(text1.getText().toString() == text5.getText().toString() && text5.getText().toString() == text9.getText().toString()) {
        if(text7.getText().toString() == plr1) {
            status.setText("Player 1 won!");
            gameRunning = false;
        }
        else if(text7.getText().toString() == plr2){
            status.setText("Player 2 won!");
            gameRunning = false;
        }
    }
    else if(text3.getText().toString() == text5.getText().toString() && text5.getText().toString() == text7.getText().toString()) {
        if(text1.getText().toString() == plr1) {
            status.setText("Player 1 won!");
            gameRunning = false;
        }
        else if(text1.getText().toString() == plr2){
            status.setText("Player 2 won!");
            gameRunning = false;
        }
    }

问题逻辑上应该是在if语句,但对我来说,他们似乎还好,也许我错过了一些东西,因为目前是午夜在这里。

比较从TextView得到的字符串是一个性能瓶颈(即使只做了几次),更一般地说,不是一个好习惯。正如您所展示的,您的TicTacToe网格可以适合3x3数组,可以定义为:byte[][] grid = new byte[3][3];。一个byte就足够了,因为网格正方形只能有三种状态:空(例如0), X (1)和O (2)。

检查获胜者更容易,更干净,更快捷:

  1. 检查水平wins

    for (int i = 0; i < 3; i++) {
        if ((grid[0][i] == grid[1][i]) && (grid[1][i] == grid[2][i])) {
            ...
        }
    }
    
  2. 检查垂直获胜(每列…)

  3. 检查2对角线胜利(这是可循环的,但不值得为一个固定的3×3板)

在每次获胜的情况下,只需从获胜行中取任何值来确定谁获胜。

最新更新