C语言实现三子棋游戏(简单版)

C语言实现三子棋游戏(简单版)

相信大多数人童年时期都玩过三子棋游戏,我的童年亦是如此,只记得用一块破碎的砖块或者烧黑的木炭在空地上两横两竖,便和小伙伴开启三子棋游戏。
如今人去楼空,代替小伙伴的是电子设备,对弈的人变成“数字人”。那么今天要介绍的是简易版的三子棋游戏,和“数字人”展开对弈吧!
接下来将逐层介绍实现细节:
游戏的开始当然少不了游戏菜单的展示,这里我们用简单的输出函数暴力展示游戏菜单,达到目的即可。

void menu() {
	printf("***********************************\n");
	printf("********欢迎来到三子棋游戏!*******\n");
	printf("********1.进入游戏         ********\n");
	printf("********0.退出游戏         ********\n");
	printf("***********************************\n");
}

当然菜单作为展示不需要返回值,因此用void关键词。根据选项,我们可以用switch语句进行选择判断,同时游戏是需要循环玩耍的,所以这里我用do…while语句完成,也可以选择while循环、for循环等,只要逻辑通就行

int main() {

	srand((unsigned int)time(NULL));
	int input = 0;
	menu();
	printf("请输入选项:>");
	scanf("%d", &input);
	do
	{
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
		menu();
		printf("请输入选项:>");
		scanf("%d", &input);
	} while (input);
	return 0;
}

这里game()就是进行游戏的主要功能函数,我们进入这个函数

void game() {
	char board[ROW][COL] = {0};
	InitBoard(board, ROW, COL);
	ShowBoard(board, ROW, COL);
	while (1) {
		Player(board, ROW, COL);
		ShowBoard(board, ROW, COL);
		int p = IsWin(board, ROW, COL);
		if (p == 0) {
			printf("平局!游戏结束\n");
			break;
		}
		else if (p == 1) {
			printf("玩家胜利!\n");
			break;
		}
		else if (p == 2) {
			printf("电脑胜利!\n");
			break;
		}
		Computer(board, ROW, COL);
		ShowBoard(board, ROW, COL);
		int c = IsWin(board, ROW, COL);
		if (c == 0) {
			printf("平局!游戏结束\n");
			break;
		}
		else if (c == 1) {
			printf("玩家胜利!\n");
			break;
		}
		else if (c == 2) {
			printf("电脑胜利!\n");
			break;
		}
	}
}

这里首先需要宏定义棋盘长宽,虽然是三子棋,我们也用宏定义长宽,相当于一个拓展吧

#define ROW 3
#define COL 3

InitBoard(board, ROW, COL)这个函数是初始化棋盘,也就是将代表棋盘的二维数组进行初始化,便于后面进行操作,我初始化用空格代替

void InitBoard(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++) {
			board[i][j] = ' ';
		}
	}
}

ShowBoard(board, ROW, COL)是用来展示当前棋盘的下棋情况,游戏期间需要时刻追踪游戏进度,因此玩家和电脑每下一次棋都要调用这个函数

void ShowBoard(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 (j != col - 1) {
				printf(" %c |", board[i][j]);
			}
			else {
				printf(" %c \n", board[i][j]);
			}
		}
		if (i != row - 1) {
			for (j = 0; j < col; j++) {
				if (j != col - 1) {
					printf("---|", board[i][j]);
				}
				else {
					printf("---\n", board[i][j]);
				}
			}
		}
	}
}

Player(board, ROW, COL)是我们玩家下棋函数,需要我们先进行输入下棋位置坐标1~3,再根据棋盘情况进行填充

void Player(char board[ROW][COL], int row, int col) {
	int x = 0;
	int y = 0;
	printf("--------玩家回合--------\n");
	printf("请输入坐标:> ");
	scanf("%d %d", &x, &y);
	while (1)
	{
		if (x > 0 && x <= ROW && y > 0 && y <= COL) {
			if (board[x - 1][y - 1] == ' ') {
				board[x - 1][y - 1] = '*';
				break;
			}
			else {
				printf("该位置已被填充!请重新输入:>");
			}
		}
		else {
			printf("坐标不存在,请重新输入:>");
		}
		scanf("%d %d", &x, &y);
	}
}

Computer(board, ROW, COL)是电脑选手的下棋函数,由于是简单版,所以电脑下棋方式就是采用随机数原则,只要随机到空位置,就下入棋子

void Computer(char board[ROW][COL], int row, int col) {
	int x = rand() % row;
	int y = rand() % col;
	printf("--------电脑回合--------\n");
	int i = 0;
	int j = 0;
	int flag = 0;
	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
			if (board[i][j] == ' ') {
				flag++;
			}
		}
	}
	while (1) {
		if (board[x][y] == ' ') {
			board[x][y] = '#';
			printf("电脑填充位置:> %d %d\n", x + 1, y + 1);
			break;
		}
		else {
			int tmp = 0;
			int tmp1 = 0;
			int tmp2 = 0;
			if (flag == 2) {
				for (i = 0; i < row; i++) {
					for (j = 0; j < col; j++) {
						if (board[i][j] == ' ') {
							if (tmp1 == 1) {
								board[i][j] = '#';
								printf("电脑填充位置:> %d %d\n", i + 1, j + 1);
								break;
							}
							tmp = rand() % 2;
							if (tmp == 0 && tmp1 != 1) {
								board[i][j] = '#';
								tmp2 = 1;
								printf("电脑填充位置:> %d %d\n", i + 1, j + 1);
								break;
							}
							if (tmp == 1) {
								tmp1 = 1;
							}
						}
					}
					if (tmp2 == 1) {
						break;
					}
				}
				break;
			}
			else {
				x = rand() % row;
				y = rand() % col;
			}
		}
	}
}

IsWin(board, ROW, COL)就是判断输赢的函数,每下一次棋就进行判断,玩过三子棋的小伙伴都知道,三子棋输赢就是判断每行每列对角线是否相等,对应到代码就是下面的逻辑

int IsWin(char board[ROW][COL], int row, int col) {
	int i = 0;
	int j = 0;
	char c = ' ';
	char tmp = ' ';
	int flag = 0;
	//行
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL - 1; j++) {
			if (board[i][j] != c && board[i][j] == board[i][j+1]) {
				flag++;
				tmp = board[i][j];
			}
		}
		if (flag == 2) {
			if (tmp == '*') {
				return 1;
			}
			if (tmp == '#') {
				return 2;
			}
		}
		flag = 0;
		tmp = ' ';
	}
	//列
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL - 1; j++) {
			if (board[j][i] != c && board[j][i] == board[j + 1][i]) {
				flag++;
				tmp = board[i][j];
			}
		}
		if (flag == 2) {
			if (tmp == '*') {
				return 1;
			}
			if (tmp == '#') {
				return 2;
			}
		}
		flag = 0;
		tmp = ' ';
	}
	//对角线
	int k = 0;
	for (i = 0, j = 0; i < ROW - 1, j < COL - 1; i++, j++) {
		if (board[i][j] != c && board[i][j] == board[i + 1][j + 1]) {
			flag++;
			tmp = board[i][j];
		}
	}
	if (flag == 2) {
		if (tmp == '*') {
			return 1;
		}
		if (tmp == '#') {
			return 2;
		}
	}
	flag = 0;
	tmp = ' ';
	for ( i = 0, k = COL - 1; i < ROW - 1, k > 0; i++, k--) {
		if (board[k][i] != c && board[k][i] == board[k - 1][i + 1]) {
			flag++;
			tmp = board[k][i];
		}
	}
	if (flag == 2) {
		if (tmp == '*') {
			return 1;
		}
		if (tmp == '#') {
			return 2;
		}
	}
	flag = 0;
	tmp = ' ';
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL; j++) {
			if (board[i][j] != ' ') {
				flag++;
			}
		}
	}
	if (flag == ROW * COL) {
		return 0;
	}
	else {
		return -1;
	}
}

综合上面代码,就能实现一个简单的三子棋游戏啦!!!
简单运行一下如下图结果!
在这里插入图片描述
好久没写过博客了,希望后面能坚持下去,最后感谢阅读啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值