c ++ bool返回true

时间:2014-11-12 17:25:36

标签: c++ boolean tic-tac-toe

我正在制作一个tic-tac-toe控制台应用程序,我主要完成它。还有一些我要添加的东西,但我遇到了一个大问题。我有一个bool checkwin()函数,它应该看看游戏是否已经赢了,但由于某种原因,无论我的参数是否满足,这个函数总是返回true。这导致程序在第一次移动后结束。为什么要这样做,我该如何解决?

bool checkwin( Boardstatus& BSTAT)
{
    //Row 'A' checkwin
    if (BSTAT.getsquarestatus("A1")==BSTAT.getsquarestatus("A2") && BSTAT.getsquarestatus("A2")==BSTAT.getsquarestatus("A3"))
    {
        return true;
    }
    //Row 'B' checkwin
    else if (BSTAT.getsquarestatus("B1")==BSTAT.getsquarestatus("B2") && BSTAT.getsquarestatus("B2")==BSTAT.getsquarestatus("B3"))
    {
        return true;
    }
    //Row 'C' checkwin
    else if (BSTAT.getsquarestatus("C1")==BSTAT.getsquarestatus("C2") && BSTAT.getsquarestatus("C2")==BSTAT.getsquarestatus("C3"))
    {
        return true;
    }
    //Column 1 checkwin
    else if (BSTAT.getsquarestatus("A1")==BSTAT.getsquarestatus("B1") && BSTAT.getsquarestatus("B1")==BSTAT.getsquarestatus("C1"))
    {
        return true;
    }
    //Column 2 checkwin
    else if (BSTAT.getsquarestatus("A2")==BSTAT.getsquarestatus("B2") && BSTAT.getsquarestatus("B2")==BSTAT.getsquarestatus("C2"))
    {
        return true;
    }
    //Column 3 checkwin
    else if (BSTAT.getsquarestatus("A3")==BSTAT.getsquarestatus("B3") && BSTAT.getsquarestatus("B3")==BSTAT.getsquarestatus("C3"))
    {
        return true;
    }
    //Diagonal upper-left->bottom-right checkwin
    else if (BSTAT.getsquarestatus("A1")==BSTAT.getsquarestatus("B2") && BSTAT.getsquarestatus("B2")==BSTAT.getsquarestatus("C3"))
    {
        return true;
    }
    //Diagonal lower-left->upper-right checkwin
    else if (BSTAT.getsquarestatus("C1")==BSTAT.getsquarestatus("B2") && BSTAT.getsquarestatus("B2")==BSTAT.getsquarestatus("A3"))
    {
        return true;
    }
    else
    {
        return false;
    }
}



int main()
{
//Start of initializing all squares as a blank
Boardstatus BSTAT;
BSTAT.setsquarestatus( "A1", ' ' );
BSTAT.setsquarestatus( "A2", ' ' );
BSTAT.setsquarestatus( "A3", ' ' );
BSTAT.setsquarestatus( "B1", ' ' );
BSTAT.setsquarestatus( "B2", ' ' );
BSTAT.setsquarestatus( "B3", ' ' );
BSTAT.setsquarestatus( "C1", ' ' );
BSTAT.setsquarestatus( "C2", ' ' );
BSTAT.setsquarestatus( "C3", ' ' );
//End of square initialization

    do
    {
    playerturn(BSTAT);
    } while (checkwin(BSTAT) == false);

    return 0;
}

3 个答案:

答案 0 :(得分:5)

它返回true,因为' '等于' ' - 也就是说,在第一次移动后,您可以确保连续的三个方格仍为空,并且您只测试方形值是否为是相等而不是相等而不是空

解决此问题的一种可能方法:

if (BSTAT.getsquarestatus("A1")!=' ' &&
    BSTAT.getsquarestatus("A1")==BSTAT.getsquarestatus("A2") &&
    BSTAT.getsquarestatus("A2")==BSTAT.getsquarestatus("A3"))

您需要将此... != ' '检查添加到每个条件,显然会更改您测试的特定方格。

这可能是显而易见的,但你只需要测试其中一个方块,因为如果第一个方格不是空的而其他方格是等于它,那么显然其他方格也不是空的。

答案 1 :(得分:0)

你必须添加其他测试, 例如 : if(BSTAT.getsquarestatus(“A1”)== BSTAT.getsquarestatus(“A2”)&& BSTAT.getsquarestatus(“A2”)== BSTAT.getsquarestatus(“A3”)&& BSTAT.getsquarestatus( “A1”)!=''&& BSTAT.getsquarestatus(“A2”)!=''&& BSTAT.getsquarestatus(“A3”)!='')

为所有测试做同样的事情

然而,还有另一种更好的方法来实现这个算法

答案 2 :(得分:0)

使用矩阵。 int TicTac [3] [3]初始化为0 1 - >球员1 2 - >玩家2和支票获胜者将是`for(int i = 0; i< 3; i ++)         {
            if((TicTac [i] [0] == 2&& TicTac [i] [1] == 2&& TicTac [i] [2] == 2)||                 (TicTac [i] [0] == 1&& TicTac [i] [1] == 1&&& TicTac [i] [2] == 1)){

            return TicTac[i][0];
        }
        if((TicTac[0][i] == 2 && TicTac[1][i]  == 2 && TicTac[2][i] == 2) ||
            (TicTac[0][i] == 1 && TicTac[1][i]  == 1 && TicTac[2][i] == 1)) {

            return TicTac[0][i];
        }
    }
    if((TicTac[0][0] == 1 && TicTac[1][1] == 1  && TicTac[2][2] == 1 )||
            TicTac[0][0] == 2 && TicTac[1][1] == 2  && TicTac[2][2] == 2) {

        return TicTac[0][0];
    }
    if(TicTac[0][2] == 1 && TicTac[1][1] == 1 && TicTac[2][0] == 1 ||
        TicTac[0][2] == 2 && TicTac[1][1] == 2 && TicTac[2][0] == 2 ) {

        return TicTac[0][2];}
}`