c++ - 为什么没有显示获胜镜头?

标签 c++

我创建了一个简单的井字游戏。当玩家获得胜利时(例如,您连续获得 2 X,而您只需要一个,然后输入),程序会立即说:

"someone won"

(我还在琢磨,如何说出获胜选手的名字。)

没有将“3”变成“X”(假设最后一个数字是 3)。

如果我输入 3,“3”应该变成“X”并留下“3 X (X X X)”。相反,它只留下“2(X X 3)”并立即说“有人赢了”。我该如何解决这个问题?

这是我的代码:

#include <iostream>
#include <string>

using namespace std;

//board numbers
char numbers[10] = {'0','1','2','3','4','5','6','7','8','9'};

//structure of players
struct playersinfo
{
int playersnumber;
string player1name, player2name, playersturn;
char player1mark, player2mark;
};

playersinfo players;

//prototype of progress, drawboard, oneWon and twoWon
int progress();
void drawboard();
bool oneWon();
bool twoWon();

int main()
{
//assigns i to progress;
int i, j = 1;
char choice;

//assign players mark
players.player1mark = 'X';
players.player2mark = 'O';

//ask players their name
cout << "Enter player 1's name : ";
cin >> players.player1name;
system("cls");
cout << "Enter player 2's name : ";
cin >> players.player2name;

do
{
    if(j == 1)
    {
        players.playersturn = players.player1name;
        players.playersnumber = 1;
    }
    else if(j == 2)
    {
        players.playersturn = players.player2name;
        players.playersnumber = 2;
    }

    drawboard();
    cout << '\t' <<players.playersturn << " enter a number : ";
    cin >> choice;
    if(choice == numbers[1])
    {
        if(players.playersnumber == 1)
            numbers[1] = players.player1mark;
        else
            numbers[1] = players.player2mark;
        //increment j
        j++;
        if(j == 3)
            j -= 2;
    }
    if(choice == numbers[2])
    {
        if(players.playersnumber == 1)
            numbers[2] = players.player1mark;
        else
            numbers[2] = players.player2mark;
        //increment j
        j++;
        if(j == 3)
            j -= 2;
    }
    if(choice == numbers[3])
    {
        if(players.playersnumber == 1)
            numbers[3] = players.player1mark;
        else
            numbers[3] = players.player2mark;
        //increment j
        j++;
        if(j == 3)
            j -= 2;
    }
    if(choice == numbers[4])
    {
        if(players.playersnumber == 1)
            numbers[4] = players.player1mark;
        else
            numbers[4] = players.player2mark;
        //increment j
        j++;
        if(j == 3)
            j -= 2;
    }
    if(choice == numbers[5])
    {
        if(players.playersnumber == 1)
            numbers[5] = players.player1mark;
        else
            numbers[5] = players.player2mark;
        //increment j
        j++;
        if(j == 3)
            j -= 2;
    }
    if(choice == numbers[6])
    {
        if(players.playersnumber == 1)
            numbers[6] = players.player1mark;
        else
            numbers[6] = players.player2mark;
        //increment j
        j++;
        if(j == 3)
            j -= 2;
    }
    if(choice == numbers[7])
    {
        if(players.playersnumber == 1)
            numbers[7] = players.player1mark;
        else
            numbers[7] = players.player2mark;
        //increment j
        j++;
        if(j == 3)
            j -= 2;
    }
    if(choice == numbers[8])
    {
        if(players.playersnumber == 1)
            numbers[8] = players.player1mark;
        else
            numbers[8] = players.player2mark;
        //increment j
        j++;
        if(j == 3)
            j -= 2;

    }
    if(choice == numbers[9])
    {
        if(players.playersnumber == 1)
            numbers[9] = players.player1mark;
        else
            numbers[9] = players.player2mark;
        //increment j
        j++;
        if(j == 3)
            j -= 2;
    }

    //check progress
    i = progress();

    if(i == -1)
    {
        cout << "\n\n\t\tGame is tied up";
        break;
    }
}while(i != 1);

//congratulate player
if(i == 1)
{

}

cin.ignore();
cin.get();
return 0;
}

//definitions of IsTied, IsOver and drawboard

/*********************************
1  = Game is over
0  = Game is sill in progress 
-1 = Game is tied up 
*********************************/
int progress()
{
if(numbers[1] == numbers[2] && numbers[2] == numbers[3])
    return 1;
else if(numbers[4] == numbers[5] && numbers[5] == numbers[6])
    return 1;
else if(numbers[7] == numbers[8] && numbers[8] == numbers[9])
    return 1;
else if(numbers[1] == numbers[4] && numbers[4] == numbers[7])
    return 1;
else if(numbers[2] == numbers[5] && numbers[5] == numbers[8])
    return 1;
else if(numbers[3] == numbers[6] && numbers[6] == numbers[9])
    return 1;
else if(numbers[7] == numbers[5] && numbers[5] == numbers[3])
    return 1;
else if(numbers[9] == numbers[5] && numbers[5] == numbers[9])
    return 1;
else if(numbers[1] != '1' && numbers[2] != '2' && numbers[3] != '3'
    && numbers[4] != '4' && numbers[5] != '5' && numbers[6] != '6'
    && numbers[7] != '7' && numbers[8] != '8' && numbers[9] != '9')
        return -1;
else 
    return 0;
}
/****************************
FUNCTION THAT DRAWS THE BOARD
****************************/
void drawboard()
{
//clear system screen
system("cls");

cout << "\n\n\t\tTic Tac Toe\n\n";
cout << '\t' <<players.player1name << " = (X) --- " << players.player2name << " = (O)" << endl <<     endl;
cout << '\t' << "     |     |     " << endl;
cout << '\t' << "  " << numbers[1] << "  |  " << numbers[2] << "  |  " << numbers[3] << "  " << endl;
cout << '\t' << "_____|_____|_____" << endl;
cout << '\t' << "     |     |     " << endl;
cout << '\t' << "  " << numbers[4] << "  |  " << numbers[5] << "  |  " << numbers[6] << "  " << endl;
cout << '\t' << "_____|_____|_____" << endl;
cout << '\t' << "     |     |     " << endl;
cout << '\t' << "  " << numbers[7] << "  |  " << numbers[8] << "  |  " << numbers[9] << "  " << endl;
cout << '\t' << "     |     |     " << endl;
}

最佳答案

我在大学里做了一个 java 程序来做这个,我不知道如何用 C++ 编程,但基本上,要找出谁赢了,你会得到一个 bool 值,当玩家 1 出局时为真,当玩家 1 出局时为假玩家 2 开始。这样,当有人获胜时,您可以让程序查看 bool 值,它会告诉您最后一步是谁下的。

为了解决它说有人在输入最终 X 之前获胜的事实,只需将检查他们是否获胜的代码放在放下 X 的代码之后运行即可

关于c++ - 为什么没有显示获胜镜头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675474/

相关文章:

c++ - getsockopt() 返回的值是之前由 setsockopt() 设置的值的两倍

c++ - MacOS X- C++ 中的段错误 11

c++ - 弗洛伊德三角变体

c++ - 从模拟用户下启动的某些系统默认 .lnk 文件的问题

c++ - 明确禁止具体类模板特化

c++ - boost 日志记录类属性

c++ - 使用内存池中的自定义删除器将 std::unique_ptr 返回到抽象类型

c++ - 为什么 boost::spirit 将 foo123 与 (+alpha | +alnum) 语法匹配?

c++ - 如何编写要在 main() 获得控制权之前执行的代码?

c++ - 有提议吗? C++的运算符/空条件运算符?