Android TicTacToe - 随机游戏结局

Edg*_*r.A 0 java android tic-tac-toe

所以今天我为了学习目的而制作TicTacToe,一切看起来都很好,直到我自己尝试玩它 - 在某些情况下游戏结束之前就应该结束了.让我们说这是我的tictactoe网格:

1|2|3
4|5|6
7|8|9
Run Code Online (Sandbox Code Playgroud)

因此,例如当我将X置于2并且O游戏突然得出结论玩家2(O用户)获胜时.

这是我的功能,找出是否有人赢了.我可能很愚蠢地做这样的计算,但我真的不知道有什么其他方法可以找到有人获胜并决定谁是赢家.如果包括获胜者在内的所有可能结果的陈述,则只需简单8

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

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Ele*_*ntW 6

比较你从TextViews 得到的字符串是一个性能瓶颈(即使只做了几次),更一般地说,不是好的做法.如您所示,您的TicTacToe网格可以放入3x3阵列,可以这样定义:byte[][] grid = new byte[3][3];.A byte就足够了,因为网格方格只能有3种状态:空(例如0),X(1)和O(2).

检查获胜者是更容易,更清洁和更快:

  1. 检查横向胜利

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

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

在获胜的每种情况下,只需从获胜线中获取任何值以确定谁赢了.