简易三子棋

一、问题描述

用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”);用来清空屏幕。
在此基础上添加一些算法,使得电脑下棋更加聪明,使得玩家获胜难度加大。
如有需要源码请点击:添加链接描述

猜你喜欢

转载自blog.csdn.net/weixin_47812603/article/details/113102231