三子棋游戏【代码】

三子棋游戏【代码】,第1张

文章目录

  • 一、三子棋游戏规则
  • 二、程序实现思路
  • 三、子函数的实现
    • 3.1 棋盘初始化函数
    • 3.2 打印棋盘函数
    • 3.3 玩家下棋函数
    • 3.4 电脑下棋函数
    • 3.5 判断输赢函数
    • 3.6 判断棋盘是否已下满函数
  • 四、完整的程序
  • 五、最后实现效果

一、三子棋游戏规则🍖

  在一个3×3方格的棋盘上,电脑和玩家轮流交替下棋子每轮各自只能下一颗棋子,直到电脑胜利或玩家胜利或双方打成平手时结束游戏。胜负判定只要电脑或者玩家任意一方能在棋盘上下出连续的三颗棋子就表示胜利(而这连续的三颗棋子可以是横3连,也可是纵3连,同样也可是斜3连),但若棋盘被下满后仍然没有出现3连子,则判定为双方平局


二、程序实现思路🍖

  首先我们需要设计一个游戏菜单:选择是否开始玩儿游戏,1:开始游戏,0:退出游戏

  然后思考一下确定一个的游戏流程:创建一个可以存放棋子的棋盘 → 初始化棋盘 → 打印棋盘 → 双方开始下棋(玩家走 → 判断输赢 → 电脑走 → 判断输赢)→ 直至有一方胜利或者平局 → 游戏结束。(为了最后的显示效果,任意一方走一步就打印一次棋盘)。

  代码实现test.c源文件:

#include"game.h"

void menu()
{
	printf("****************************************\n");
	printf("*********   1.play     0.exit  *********\n");
	printf("****************************************\n");
}

void game()
{
	//创建一个能存放棋子棋盘
	char board[ROW][COL] = { 0 };
	char ret = 0;
	//初始化棋盘
	init_board(board, ROW, COL);
	//打印棋盘
	display_board(board, ROW, COL);
	//下棋
	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		display_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		
		//电脑下棋
		computer_move(board, ROW, COL);
		display_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家胜利!!!\n");
	}
	else if (ret == '#')
	{
		printf("电脑胜利!!!\n");
	}
	else
	{
		printf("游戏平局!!!\n");
	}
}

int main()
{
	int input = 0;
	do
	{
		menu();//菜单
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//三子棋游戏的实现
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

  注意:仔细看上面的代码,你会我并没有引头文件而是引了"game.h"文件,而且程序中出现了很多未定义的标识符:如ROW、COL。那是因为我把这些东西有放到头文件"game.h"中去了,引用该头文件就相当于引用他们。还有就是上面的很多函数是没有定义的,只不过事先说明其用处罢了。下面让我们来一 一实现这这些函数吧!!!


三、子函数的实现🍖 3.1 棋盘初始化函数🍖
//初始化棋盘,使得棋盘上没有任何棋子
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';//空格
		}
	}
}

3.2 打印棋盘函数🍖
//实现打印棋盘以及棋盘上的棋子
void display_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//打印行
		int j = 0;
		for (j = 0; j < col; j++)
		{
			//打印列
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		//打印分割线
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

3.3 玩家下棋函数🍖
//玩家下棋
//在棋盘上是用‘*’来表示玩家的棋子
void player_move(char board[ROW][COL], int row, int col)
{
	//创建两个变量用来存储玩家输入的行、列;
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家下棋:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标已有棋子,请重新输入:\n");
			}
		}
		else
		{
			printf("坐标不合法,请重新输入\n");
		}
	}
}

3.4 电脑下棋函数🍖
//电脑随机下棋
void computer_move(char board[ROW][COL], int row, int col)
{
	//创建两个变量用来存储电脑下棋的行、列;
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row;//随机获取0~(row-1)之间的数
		y = rand() % row;//随机获取0~(col-1)之间的数
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

3.5判断输赢函数🍖
//判断游戏是否胜利、失败、平局还是继续;
//若返回值为‘*’则表示玩家胜利;
//若返回值为‘#’则表示电脑胜利;
//若返回值为‘Q’则表示双方打成平手;
//若返回值为‘C’则表示游戏继续;
char is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//判断行
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}
	//判断列
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[1][j];
		}
	}
	//判断对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//判断棋盘是否已下满
	if (is_full(board, row, col) == 1)
	{
		return 'Q';
	}
	return 'C';
}

3.6 判断棋盘是否已下满函数🍖
//判断棋盘是否已下满,若下满返回true,否则返回false;
bool is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return false;
			}
		}
	}
	return true;
}

完整的程序🍖

头文件

#include
#include
#include
#include
#include

#define ROW 3
#define COL 3

void init_board(char board[ROW][COL], int row, int col);
void display_board(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_move(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);

源文件

#include"game.h"

void menu()
{
	printf("****************************************\n");
	printf("*********   1.play     0.exit  *********\n");
	printf("****************************************\n");
}

void game()
{
	//创建一个能存放棋子棋盘
	char board[ROW][COL] = { 0 };
	char ret = 0;
	printf("开始三子棋游戏:\n");
	//初始化棋盘
	init_board(board, ROW, COL);
	//打印棋盘
	system("cls");//清空屏幕
	display_board(board, ROW, COL);
	//下棋
	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		system("cls");//清空屏幕
		display_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		Sleep(3000);//延时3秒
		//电脑下棋
		computer_move(board, ROW, COL);
		system("cls");//清空屏幕
		display_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家胜利!!!\n");
	}
	else if (ret == '#')
	{
		printf("电脑胜利!!!\n");
	}
	else
	{
		printf("游戏平局!!!\n");
	}
}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();//菜单
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//三子棋游戏的实现
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

源文件

#include"game.h"

//初始化棋盘,使得棋盘上没有任何棋子
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//实现打印棋盘以及棋盘上的棋子
void display_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//打印行
		int j = 0;
		for (j = 0; j < col; j++)
		{
			//打印列
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		//打印分割线
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

//玩家下棋
//在棋盘上是用‘*’来表示玩家的棋子
void player_move(char board[ROW][COL], int row, int col)
{
	//创建两个变量用来存储玩家下棋的行、列;
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家下棋:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标已有棋子,请重新输入:\n");
			}
		}
		else
		{
			printf("坐标不合法,请重新输入\n");
		}
	}
}

//电脑随机下棋
void computer_move(char board[ROW][COL], int row, int col)
{
	//创建两个变量用来存储电脑下棋的行、列;
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row;//随机获取0~(row-1)之间的数
		y = rand() % row;//随机获取0~(col-1)之间的数
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

//判断棋盘是否已下满,若下满返回true,否则返回false;
bool is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return false;
			}
		}
	}
	return true;
}

//判断游戏是否胜利、失败、平局还是继续;
//若返回值为‘*’则表示玩家胜利;
//若返回值为‘#’则表示电脑胜利;
//若返回值为‘Q’则表示双方打成平手;
//若返回值为‘C’则表示游戏继续;
char is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//判断行
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}
	//判断列
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[1][j];
		}
	}
	//判断对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//判断棋盘是否已下满
	if (is_full(board, row, col) == true)
	{
		return 'Q';
	}
	return 'C';
}

五、最后实现效果🍖



这份博客👍如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧👀。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/798359.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存