c++实现简单三子棋
一、问题描述
用c++实现简单三子棋游戏。
二、步骤
1.菜单界面
设置一个简陋的菜单界面。
//初始化棋盘
void InitBoard(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
2.创建棋盘
用define定义的常量初始化棋盘的行数为(3)和列数为(3),并创建二维数组,元素类型是char。
#define ROW 3 //行数
#define COL 3 //列数
3.棋盘初始化
用两层for循环来初始化棋盘,并赋值为’ ‘。
//初始化棋盘
void InitBoard(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
在这里棋盘的初始化中也可以用库函数memset初始化棋盘,我比较懒也就没写。
4.打印棋盘
//打印棋盘
void DisChessBoard(char board[ROW][COL])
{
for (int i = 0; i <ROW; i++)
{
for (int j = 0; j <COL; j++)
{
//1.打印一行的数据
cout << ' ' << board[i][j] << ' ';
if (j<COL-1)
{
cout << '|';
}
}
cout << endl;
//2.打印分割行
if (i <ROW- 1)
{
for (int j = 0; j <COL; j++)
{
printf("---");
if (j <COL-1)
{
cout << '|';
}
}
cout << endl;
}
}
}
打印的判断条件是行(列)数-1防止出现打印不美观的情况,如下图所示:
打印好的棋盘如下图所示:
5.玩家下棋
玩家输入行列坐标表示落子,使用’*’表示玩家落子。
注意:
1.玩家落子需要在棋盘范围(3×3)内。
2.玩家要在棋盘空的位置上落子。
3.如果输入的坐标被占或者输入的坐标不合法,则需要重新输入。
//玩家下棋----*
void playerMove(char board[ROW][COL])
{
int i, j;
cout << "玩家下,请输入坐标:(x y)" << endl;
while (true)
{
cin >> i >> j;
if (i >= 1 && i <= ROW && j >= 1 && j <= COL)
{
//由于玩这个游戏的人不一定就是程序员,知道数组的下标从0开始。
//所以把横竖坐标都减了1
if (board[i-1][j-1] == ' ')
{
board[i-1][j-1] = '*';
break;
}
else
{
cout << "位置被占用,请重新输入" << endl;
}
}
else
{
cout << "您输入的坐标有误,请重新输入" << endl;
}
}
}
6.电脑下棋
电脑随机生成坐标表示落子,使用’#’表示玩家落子。
由于是电脑随机生成0-2范围内的下标,所以不会出现越界的情况。
使用rand()函数需要配合着srand((unsigned int)time(0))一起使用,不然会导致每回合生成的数是固定的值。
//电脑下棋-----#
void computerMove(char board[ROW][COL])
{
cout << "电脑走:>" << endl;
while (true)
{
//通过rand()函数来取余3,得到数组的下标范围是0-2之间
int i = rand() % 3;
int j = rand() % 3;
if (board[i][j ] == ' ')
{
board[i][j ] = '#';
break;
}
}
}
7.判断胜负
//判断谁赢、谁输、平局的结果
//告诉我们4种结果
//1.玩家赢----*
//2.电脑赢----#
//3.平局------Q
//4.继续-----C就是谁都没有赢,并且棋盘也没有满
//判断是否满了
bool isFull(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (board[i][j] == ' ')
{
return false; //没满
}
}
}
return true; //满了
}
//判断谁赢、谁输、平局的结果
char isWin(char board[ROW][COL])
{
//判断俩条对角线是否相等
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
//判断每一行是否相等
for (int i = 0; i < ROW; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
//判断每一列是否相等
for (int i = 0; i < ROW; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//判断是否平局
if (true == isFull(board))
{
return 'Q';
}
return 'C';
}
三、结果演示
1.玩家胜利
2.电脑胜利
3.和棋
四、代码实现
分文件编写有如下三个:
(1).头文件sanzi_chess.h
#include<ctime>
#include<Windows.h>
//菜单函数
void menu();
//初始化棋盘
void InitBoard(char board[ROW][COL]);
//打印棋盘函数
void DisChessBoard(char board[ROW][COL]);
//玩家下棋
void playerMove(char board[ROW][COL]);
//电脑下棋
void computerMove(char board[ROW][COL]);
//判断谁赢、谁输、平局的结果
//告诉我们4种结果
//1.玩家赢----*
//2.电脑赢----#
//3.平局------Q
//4.继续-----C就是谁都没有赢,并且棋盘也没有满
char isWin(char board[ROW][COL]);
//判断是否满了
bool isFull(char board[ROW][COL]);
(2).源文件sanzi_chess.cpp
#include"sanzi_chess.h"
//菜单函数
void menu()
{
cout << "↑→→→→→→→→→→→→→→→↓" << endl;
cout << "↑ 1.玩游戏 ↓" << endl;
cout << "↑←←←←←←←←←←←←←←←↓" << endl;
cout << "↑ 0.退出程序 ↓" << endl;
cout << "↑←←←←←←←←←←←←←←←↓" << endl;
}
//初始化棋盘
void InitBoard(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void DisChessBoard(char board[ROW][COL])
{
for (int i = 0; i <ROW; i++)
{
for (int j = 0; j <COL; j++)
{
//1.打印一行的数据
cout << ' ' << board[i][j] << ' ';
if (j<COL-1)
{
cout << '|';
}
}
cout << endl;
//2.打印分割行
if (i <ROW- 1)
{
for (int j = 0; j <COL; j++)
{
printf("---");
if (j <COL-1)
{
cout << '|';
}
}
cout << endl;
}
}
}
//玩家下棋----*
void playerMove(char board[ROW][COL])
{
int i, j;
cout << "玩家下,请输入坐标:(x y)" << endl;
while (true)
{
cin >> i >> j;
if (i >= 1 && i <= ROW && j >= 1 && j <= COL)
{
if (board[i-1][j-1] == ' ')
{
board[i-1][j-1] = '*';
break;
}
else
{
cout << "位置被占用,请重新输入" << endl;
}
}
else
{
cout << "您输入的坐标有误,请重新输入" << endl;
}
}
}
//电脑下棋-----#
void computerMove(char board[ROW][COL])
{
cout << "电脑走:>" << endl;
while (true)
{
int i = rand() % 3;
int j = rand() % 3;
if (board[i][j ] == ' ')
{
board[i][j ] = '#';
break;
}
}
}
//判断是否满了
bool isFull(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (board[i][j] == ' ')
{
return false; //没满
}
}
}
return true; //满了
}
//判断谁赢、谁输、平局的结果
char isWin(char board[ROW][COL])
{
//判断俩条对角线是否相等
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
//判断每一行是否相等
for (int i = 0; i < ROW; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
//判断每一列是否相等
for (int i = 0; i < ROW; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//判断是否平局
if (true == isFull(board))
{
return 'Q';
}
return 'C';
}
(3).源文件test.cpp
#include"sanzi_chess.h"
//三子棋游戏函数
void sanzi_chess_game()
{
//字符数组----用来存放棋盘的信息
char board[ROW][COL] = {
0};
char ret=0;
//初始化棋盘
InitBoard(board);
//打印棋盘
DisChessBoard(board);
while (true)
{
//玩家下完棋后,打印一下棋盘信息,并判断一下玩家赢了没有
playerMove(board);
DisChessBoard(board);
ret=isWin(board);
if (ret != 'C')
{
break;
}
//电脑下完棋后,打印一下棋盘信息,并判断一下电脑赢了没有
computerMove(board);
DisChessBoard(board);
ret=isWin(board);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
cout << "玩家赢" << endl;
cout << "你好,程序将在5秒后将会清屏" << endl;
Sleep(5000);
system("cls");
}
else if (ret == '#')
{
cout << "电脑赢" << endl;
cout << "你好,程序将在5秒后将会清屏" << endl;
Sleep(5000);
system("cls");
}
else
{
cout << "平局" << endl;
cout << "你好,程序将在5秒后将会清屏" << endl;
Sleep(5000);
system("cls");
}
}
int main()
{
srand((unsigned int)time(NULL));
while (true)
{
menu();
int select = 0;
cout << "请选择:>" << endl;
cin >> select;
switch (select)
{
case 1:
sanzi_chess_game();
break;
case 0:
exit(0);
default:
cout << "您输入有误,请重新输入" << endl;
cout << "您按任意键后,将会清屏" << endl;
system("pause");
system("cls");
}
}
system("pause");
return 0;
}
主函数中添加了系统命令system(“cls”);用来清空屏幕。
在此基础上添加一些算法,使得电脑下棋更加聪明,使得玩家获胜难度加大。
如有需要源码请点击:添加链接描述