【问题标题】:Tic Tac Toe cin input issue井字游戏输入问题
【发布时间】:2014-02-11 02:56:57
【问题描述】:

关于井字游戏的问题。我试图让用户准确输入“0,0”(行/列)格式,否则将无效。错误是,如果我输入任何正确的网格编号,无论如何都会给出无效错误。

“即 - '1,2'

无效错误

无效错误

无效错误”

因此,如果用户正确输入数字,则不会在任何网格中插入用户输入。

所以这是我的代码,任何建议/帮助都可以继续前进。另请注意,我只是在尝试验证和输入 X 和 O,而不是真正检查用户是否平局/获胜

#include <iostream>
#include "Tictactoe.h"

using namespace std;

int main(){
char board[3][3]={{'.','.','.'},{'.','.','.'},{'.','.','.'}};
bool gameover(true);
int iPlayerTurn(1);

do {
    // Print board

cout << " -   0   1   2" << endl;
cout << "   +---+---+---+" << endl;

cout << " 0" << " | " << board[0][0] << " | " << board[0][1] << " | " << board[0][2] << " | " << endl;
cout << "   +---+---+---+" << endl;

cout << " 1" << " | " << board[1][0] << " | " << board[1][1] << " | " << board[1][2] << " | " << endl;
cout << "   +---+---+---+" << endl;

cout << " 2" << " | " << board[2][0] << " | " << board[2][1] << " | " << board[2][2] << " | " << endl;
cout << "   +---+---+---+" << endl;



char cPlayerMark;
    if (iPlayerTurn == 1) {
        cPlayerMark = 'X';
    } else {
        cPlayerMark = 'O';
    }
// check if move is valid

    std::cout << "Player" << iPlayerTurn << "'s move:" << std::endl;
    bool bValidMove;
    // Loop until we get a valid move
    do {
        char cNextMove;
        cin >> cNextMove;
        bValidMove = true;

        // Check for a valid move
        if (cNextMove == '0,0' && board[0][0] == '.') {
            board[0][0] = cPlayerMark;
        } else if (cNextMove == '0,1' && board[0][1] == '.') {
            board[0][1] = cPlayerMark;
        } else if (cNextMove == '0,2' && board[0][2] == '.') {
            board[0][2] = cPlayerMark;
        } else if (cNextMove == '1,0' && board[1][0] == '.') {
            board[1][0] = cPlayerMark;
        } else if (cNextMove == '1,1' && board[1][1] == '.') {
            board[1][1] = cPlayerMark;
        } else if (cNextMove == '1,2' && board[1][2] == '.') {
            board[1][2] = cPlayerMark;
        } else if (cNextMove == '2,0' && board[2][0] == '.') {
            board[2][0] = cPlayerMark;
        } else if (cNextMove == '2,1' && board[2][1] == '.') {
            board[2][1] = cPlayerMark;
        } else if (cNextMove == '2,2' && board[2][2] == '.') {
            board[2][2] = cPlayerMark;
        } else {
            cout << "Invalid Move. Try again." <<endl;
            bValidMove = false;
        }
    } while (!bValidMove);

}while (!gameover);
}

【问题讨论】:

  • 你认为'0,0'是一个字符吗?你觉得是什么角色?
  • char 只能包含一个字符。尝试改用std::string
  • char 的 1 个字节,没问题。谢谢你们的回复

标签: c++ arrays cin


【解决方案1】:

问题是您将cNextMove 定义为字符而不是字符串。所以无论用户输入多少个字符,它只能包含一个字符。并且比较总是错误的。

如果你用 gcc4.8 编译你的代码,你实际上会得到如下警告:

test.cpp:45:26: warning: multi-character character constant [-Wmultichar]
         if (cNextMove == '0,0' && board[0][0] == '.') {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多