案例分析:
每个玩家轮流输入下棋,要求使用在二维数组3*3中实现。
玩家1(棋子代表为:&)玩家2(棋子代表为:%)双方用char类型二维数组来记录棋子信息
判断胜负后询问是否继续游戏
代码实现具体如下:
#include<iostream>
using namespace std;
//声明全局变量
char board1[3][3];
bool gameover=true;
int winner = 0;
//声明函数定义
void printboard(char a[3][3]);
void win_fail2(char a[3][3]);
//设置一个棋盘的初始值为
char input(char a[3][3])
{
for (int x = 0; x < 3; x++)
{
for (int y = 0; y < 3; y++)
{
a[x][y] = ' ';
}
}
return a[3][3];
}
//打印棋盘
void printboard(char a[3][3])
{
system("cls");
for (int x = 0; x < 3; x++)
{
cout << " +---+---+---+" << endl;
for (int y = 0; y < 3; y++)
{
cout << " | " << a[x][y];
}
cout << " | ";
cout << "\n";
}
cout << " +---+---+---+" << endl;
win_fail2(a);
}
//玩家1输入
char palyer1(char a[3][3])
{
int x = 0;
int y = 0;
cout << "请玩家1落子!!"<<endl;
while (1)
{
cout << "请输入x的坐标";
cin >> x;
cout << "请输入y的坐标";
cin >> y;
if (x <=0 || x > 3 || y <=0 || y > 3)
{
cout << "您输入的坐标有误!!请重新输入" << endl;
continue;
}
if (a[x - 1][y - 1] != ' ')
{
cout << "此位置已经有子,不能落子!!" << endl;
continue;
}
a[x - 1][y - 1] = '&';
break;
}
return a[3][3];
}
//玩家2输入
char palyer2(char a[3][3])
{
int x = 0;
int y = 0;
cout << "请玩家2落子!!" << endl;
while(1)
{
cout << "请输入x位置的坐标";
cin >> x;
cout << "请输入y位置的坐标";
cin >> y;
if (x <= 0 || x > 3 || y <= 0 || y > 3)
{
cout<<"您输入的坐标有误!!请重新输入"<<endl;
continue;
}
if (a[x - 1][y - 1] != ' ')
{
cout<<"此位置已经有子,不能落子!!"<<endl;
continue;
}
a[x - 1][y - 1] = '%';
break;
}
return a[3][3];
}
//判断棋盘是否已经满了
int Isfull(char a[3][3])
{
//找不到空格了,说明满了
//满了返回1,没满返回0
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
if (a[row][col] == ' ')
{
return 0;//没满
}
}
}
return 1;
}
//判断结果
void win_fail2(char a[3][3])
{
if (a[0][0] == '&' && a[0][1] == '&'&& a[0][2] == '&')
{
winner = 1;
}
if (a[1][0] == '&' && a[1][1] == '&'&& a[1][2] == '&')
{
winner = 1;
}
if (a[2][0] == '&' && a[2][1] == '&'&& a[2][2] == '&')
{
winner = 1;
}
if (a[0][0] == '&' && a[1][0] == '&'&& a[2][0] == '&')
{
winner = 1;
}
if (a[0][1] == '&' && a[1][1] == '&'&& a[2][1] == '&')
{
winner = 1;
}
if (a[0][2] == '&' && a[1][2] == '&'&& a[2][2] == '&')
{
winner = 1;
}
if (a[0][0] == '&' && a[1][1] == '&'&& a[2][2] == '&')
{
winner = 1;
}
if (a[0][2] == '&' && a[1][1] == '&'&& a[2][0] == '&')
{
winner = 1;
}
//红方胜利
if (a[0][0] == '%' && a[0][1] == '%'&& a[0][2] == '%')
{
winner = 2;
}
if (a[1][0] == '%' && a[1][1] == '%'&& a[1][2] == '%')
{
winner = 2;
}
if (a[2][0] == '%' && a[2][1] == '%'&& a[2][2] == '%')
{
winner = 2;
}
if (a[0][0] == '%' && a[1][0] == '%'&& a[2][0] == '%')
{
winner = 2;
}
if (a[0][1] == '%' && a[1][1] == '%'&& a[2][1] == '%')
{
winner = 2;
}
if (a[0][2] == '%' && a[1][2] == '%'&& a[2][2] == '%')
{
winner = 2;
}
if (a[0][0] == '%' && a[1][1] == '%'&& a[2][2] == '%')
{
winner = 2;
}
if (a[0][2] == '%' && a[1][1] == '%'&& a[2][0] == '%')
{
winner = 2;
}
//检测棋盘满没满
if (Isfull(a))
{
winner = 3;
}
}
//是否继续游戏并输出胜利者
char pdwin_fail(char a[3][3])
{
if (winner < 1)
{
cout << "未分胜负,请继续" << endl;
}
else
{
if (winner == 1)
{
gameover = false;
cout << "玩家1胜利" << endl;
cout << "是否继续游戏呢?1继续,0退出" << endl;
cin >> gameover;
if(gameover)
{
a[3][3] = input(a);
printboard(a);
winner = 0;
}
}
else if (winner == 2)
{
gameover = false;
cout << "玩家2胜利" << endl;
cout << "是否继续游戏呢?1继续,0退出" << endl;
cin >> gameover;
if (gameover)
{
a[3][3] = input(a);
printboard(a);
winner = 0;
}
}
else
{
gameover = false;
cout << "你两五五开" << endl;
cout << "是否继续游戏呢?1继续,0退出" << endl;
cin >> gameover;
if (gameover)
{
a[3][3] = input(a);
printboard(a);
winner = 0;
}
}
}
return a[3][3];
}
//主函数:
int main()
{
//初始化棋盘变量
board1[3][3] = input(board1);
//打印棋盘
printboard(board1);
//玩家1和玩家2分别循环下棋
while (gameover)
{
//玩家1下棋打印棋盘
board1[3][3] = palyer1(board1);
printboard(board1);
board1[3][3] = pdwin_fail(board1);
if (!gameover)
{
break;
}
//玩家2下棋打印棋盘
board1[3][3] = palyer2(board1);
printboard(board1);
board1[3][3] = pdwin_fail(board1);
}
cout << "游戏结束,感谢你们的参与!" << endl;
system("pause");
return 0;
}
这个简单的井字棋小游戏使用二维数组的方式来编写,大大提高了我对二维数组的认识,
在后期调试阶段,由于本人经验不足,在判断玩家胜利条件的众多条件数组中,没有认真仔细分析获胜条件,导致后期调试用了大量时间,借此审视自己的不足之处。