【问题标题】:Issue Switching Players - Tic Tac Toe问题切换玩家 - 井字游戏
【发布时间】:2020-01-22 19:06:23
【问题描述】:

我有一个问题,我似乎无法正确切换播放器(从 X 到 O),它只是在两者之间随机切换。到目前为止,这是我的代码:

#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;

bool gameover = false;
char position[3][3] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
char player = 'X';
char player2 = 'O';
void draw(){
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << position[i][j] << " ";
        }
        cout << endl;
    }
}


void input(){
    if (_kbhit()) {
        switch (_getch())
        {
        case '1':
            position[0][0] = player;
            break;
        case '2':
            position[0][1] = player;
            break;
        case '3':
            position[0][2] = player;
            break;
        case '4':
            position[0][3] = player;
            break;
        case '5':
            position[0][4] = player;
            break;
        case '6':
            position[0][5] = player;
            break;
        case '7':
            position[0][6] = player;
            break;
        case '8':
            position[0][7] = player;
            break;
        case '9':
            position[0][8] = player;
            break;
        }
    }

}

void logic() {
    if (player == 'X') {
        player = 'O';
    }
    else {
        player = 'X';
    }
}

int main (){
    while (!gameover) {
        input();
        draw();
        logic();
        system("cls");
    }
    return 0;
}

很抱歉,如果这个问题以前被问过很多次,但我似乎无法找到解决办法。我尝试将系统 ('cls') 改为暂停,但也不起作用。

【问题讨论】:

  • 你永远不会在你的代码中使用player2。为什么会存在?
  • 第一个问题在于您如何评估position 多维数组。
  • 尝试打印 _getch 返回的内容,您可能会在这里得到 unhandle char(不在 0-9 中),它不会修改游戏(在切换中被忽略)但玩家仍然切换(输入不应该返回,直到一个有效的动作被播放)。
  • @marvinIsSacul 这很奇怪,但在技术上是有效的(OP 没有访问边界之外的数组)。

标签: c++ tic-tac-toe game-loop


【解决方案1】:

查看_kbhit()函数文档:

_kbhit returns a nonzero value if a key has been pressed. Otherwise, it returns 0.

所以,如果用户没有按任何键,_kbhit() 返回 0。
input() 函数退出,while 循环在用户什么都不做时不断更改 player 变量...

当您修复该问题时,您的代码应处理已播放的位置。
顺便说一句,你想一直画那个吗?
在有效的移动发生之前,您似乎不需要这样做。

【讨论】:

  • 感谢您查找此内容。带着这种想法,我使用了 if 和 else 语句来代替并且有效(终于!!)。抱歉,“一直画那个”是什么意思? (不熟悉行话哈哈)。非常感谢您的帮助。
  • 其实我只是测试了一下,不使用if语句,我仍然可以使用switch语句,这也是我最初想做的。
  • 在您原来的main() 程序中,您使用的是通常的常规游戏循环:1-getUserInput, 2-updateGameState, 3-drawGame(顺序可能会有所不同)。但是由于您是在 CMD 终端上“绘制”它,并且只有在有有效输入时才需要绘制它,因此您可能可以在这种情况下绘制它,并避免不必要的闪烁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多