C++ 中连接 4 游戏的输入逻辑错误
Input logic error for Connect 4 game in C++
>我已经用C++编码了Connect 4。该程序大部分工作,但player_turn函数中存在逻辑错误。
连接4.cpp:
#include <iostream>
#include <stdlib.h>
void setup_grid();
void display_grid();
void player_turn(char);
bool four_in_a_row(char);
char grid[6][7];
int main()
{
char player = '1';
setup_grid();
system("cls");
while(true)
{
display_grid();
player_turn(player);
if(four_in_a_row(player))
{
system("cls");
display_grid();
std::cout << "Player " << player << " has won!" << std::endl;
goto end;
}
if(player == '1')
player = '2';
else if(player == '2')
player = '1';
system("cls");
}
end:
std::cin.get();
std::cin.get();
return 0;
}
void setup_grid()
{
for(int i = 0; i < 6; i++)
for(int j = 0; j < 7; j++)
grid[i][j] = '0';
}
void display_grid()
{
std::cout << std::endl;
std::cout << "Enter a column number (1-7) to put a piece into that column." << std::endl;
std::cout << std::endl;
for(int i = 0; i < 6; i++)
{
for(int j = 0; j < 7; j++)
std::cout << grid[i][j] << ' ';
std::cout << std::endl;
}
std::cout << std::endl;
}
void player_turn(char player)
{
int column_number;
input:
std::cout << "Player " << player << ": ";
std::cin >> column_number;
column_number--;
if(grid[0][column_number] != '0')
{
std::cout << "Column is full." << std::endl;
goto input;
}
if((column_number < 1) || (column_number > 7))
{
std::cout << "That number was not between 1 and 7" << std::endl;
goto input;
}
for(int i = 0; i < 6; i++)
{
if(grid[i + 1][column_number] != '0')
{
grid[i][column_number] = player;
break;
}
else if(i == 6)
{
grid[i][column_number] = player;
break;
}
}
}
bool four_in_a_row(char player)
{
// Horizontal check:
for(int i = 0; i < 6; i++)
for(int j = 0; j < 4; j++)
if(grid[i][j] == player && grid[i][j+1] == player)
if(grid[i][j+2] == player && grid[i][j+3] == player)
return true;
// Vertical check:
for(int i = 0; i < 3; i++)
for(int j = 0; j < 7; j++)
if(grid[i][j] == player && grid[i+1][j] == player)
if(grid[i+2][j] == player && grid[i+3][j] == player)
return true;
// Diagonal check:
for(int y = 0; y < 3; y++)
{
for(int x = 0; x < 7; x++)
{
if(grid[y][x] == player)
{
// Diagonally left:
if(grid[y+1][x-1] == player)
{
if(grid[y+2][x-2] == player)
if(grid[y+3][x-3] == player)
return true;
}
// Diagonally right: (There is an error here)
if(grid[y+1][x+1] == player)
{
if(grid[y+2][x+2] == player)
if(grid[y+3][x+3] == player)
return true;
}
}
}
}
return false;
}
如果用户输入大于 7 的 1 位数字,程序会将该部分放在第一列中,而不是打印"该数字不在 1 和 7 之间"。
如果用户键入 0 或大于 9 的整数,程序将打印"列已满",仅当列实际存在时才应打印。
在对列号执行任何其他操作之前,您需要检查列号是否有效。
另外,摆脱goto
并使用循环。
do {
bool valid = true;
std::cout << "Player " << player << ": ";
std::cin >> column_number;
if((column_number < 1) || (column_number > 7))
{
std::cout << "That number was not between 1 and 7" << std::endl;
valid = false;
continue;
}
column_number--;
if(grid[0][column_number] != '0')
{
std::cout << "Column is full." << std::endl;
valid = false;
}
} while (!valid);
相关文章:
- 堆栈中大小变量输入错误 (C++)
- 如果用户没有输入任何内容或输入错误,如何重新输入用户的输入?
- 如何从标准输入中检测格式化输入错误?
- 如何在没有打印语句的情况下报告用户输入错误
- 用户输入错误
- 按下Enter时如何输入错误消息,但没有给出任何答案
- 在我的IF-ELSE循环中输入错误
- C++ 输入错误
- C++ 函数输入错误
- 使用ifstreamwhile循环,如何显示输入错误并在下一行继续
- switch 语句中的输入错误 如何循环回第一种情况?C++
- 在 switch 语句中输入字符以进行C++时用户输入错误
- 如果我输入错误的 dos 命令,shellexecute 会给出正确的结果
- C++输入错误的数组
- scanf和多个输入错误
- C++输入浮点而不是整数时的输入错误
- 使用字符串流和if-else语句时发生字符串输入错误
- 当用户输入错误输入时,一次清除 cin 中的整行而不是一个字符
- setw() 在包含 UTF-8 多字节字符/码位的字符串上输入错误的输出
- c++中的getline输入错误