C++ 中连接 4 游戏的输入逻辑错误

Input logic error for Connect 4 game in C++

本文关键字:输入 错误 游戏 连接 C++      更新时间:2023-10-16

>我已经用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);