三子棋游戏【C语言实现】保姆级教程,小白也能看懂,冲就对了❗❗❗

发布于:2022-11-09 ⋅ 阅读:(729) ⋅ 点赞:(0)

前言

❤️ 铁汁们大家好,欢迎大家来到出小月的博客里, 🤗🤗🤗之前呢,我分享了C语言的函数篇。。。。今天呢,给大家分享一个很经典的小游戏“三子棋小游戏”,这个小游戏系统地把之前学的循环语句,还有函数都结合起来了,希望大家看完我这篇文章都能够“涨芝士”,感觉小月写的还不错的话,记得👍🏻点赞加关注😘鼓励一下博主哦,不然下次可找不到我啦❗❗


作者简介

❤️ 作者的gitee:出小月
❤️ 作者的主页:出小月的《程序员历险记》
❤️专栏:《C语言》,《数据结构初阶》
😊希望大家都能够:好好学习,天天编程❗❗❗


一、🤗三子棋的最终页面

在这里插入图片描述

二、🤗三子棋步骤分析

1.菜单

在这里插入图片描述
🐷展示一个页面,提示用户,你选择1就进入游戏,你要是选择0就退出游戏,主要是为了更美观❗❗❗

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

2.总体框架

🐷根据菜单提示,1就进入游戏,0就退出游戏。
🐻因此我输入一个0或者1,然后用switch语句,我输入1就进入game()中开始玩游戏,玩完游戏还可以回到菜单页面继续输入1或者0继续玩;
🦒输入0就直接break结束switch循环语句重新进入do-while循环输入1或者0,但是我想要的是输入0就会退出,也就是结束do-while循环,那什么时候do-while循环结束呢❓❓就是while()里面的条件为假时,我们都知道0就是假,因此直接把input放到条件就行;
🐹如果我输的不是1也不是0呢,就会提示“您选择错误”,继续回到菜单页面继续输入1或者0继续玩。

void test()
{
	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);
}

3、游戏内容

🐷首先,我定义一个ROW行,COL列的二维数组(三子棋中ROW=COL=3),然后初始化棋盘都为空格,再打印初始化完的棋盘(这里打印应该打印出棋盘的边框)
🐻然后玩家下棋,下完棋我得判断一下是否赢了?
🦒怎么判断谁输谁赢呢❓❓❓这里我规定‘*’代表玩家赢,‘#’代表电脑赢,‘Q’(quit)平局,‘C’(continue)游戏继续。
🐹如果ret的返回值是‘C’,就继续让电脑下棋,电脑下完棋,判断谁输谁赢。

void game()
{
	char board[ROW][COL];
	char ret = 0;
	init_board(board, ROW, COL);
	print_board(board, ROW, COL);
	while (1)
	{
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'c')
		{
			break;
		}
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'c')
		{
			break;
		}
	}
	if (ret == '*')
		printf("玩家赢\n");
	else if (ret == '#')
		printf("电脑赢\n");
	else if (ret == 'q')
		printf("平局\n");
}

4、初始化棋盘

🐷把整个二维数组置空

void init_board(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		int j = 0;
		for ( j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

5、打印棋盘

在这里插入图片描述
🐷首先最外层有个循环,然后有两个小循环:第一个循环打印【‘字符’+‘|’】打印三次(其中加个条件时’|'只打印两次)这打印的是一行;第二个循环【‘- - - ’+‘|’】打印三次(其中加个条件时‘|’只打印两次)这打印的也是一行;最外层循环把第一个小循环循环三次,把第二个小循环循环两次

void print_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");
		}
	}
}

6、玩家下棋

🐷玩家输入要下的坐标,如果这个坐标合法,并且为空,就把‘*’放上面,然后break跳出while循环。
🐻如果玩家输入的坐标不合法,就重新输入;如果坐标合法但是被占用也要重新输入。

void player_move(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋:\n");
	while (1)
	{
		printf("请输入要下棋的坐标:");
		int x = 0;
		int y = 0;
		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");
		}
	}
}

7、电脑下棋

🐻电脑下棋就是随机生成下标,如果这个位置为空就放上‘#’

void computer_move(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋\n");
	while (1)
	{
		int x = rand() % row;//如果row是3,那么x就是0-2;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

8、判断输赢

🐻判断三行是否一样,判断三列是否一样,判断对角线是否一样?
这里判断对角线这里如果不是三子棋呢?是十字棋呢?难道要一个一个判断吗?大家先思考一下,下篇文章会提到❗❗❗

char is_win(char board[ROW][COL], int row, int col)
{
	//判断三行
	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 j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j]==board[2][j]&&board[0][j]!=' ')
			return board[0][j];
	}
	//判断对角线
	if (board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[0][0]!=' ')
	{
		return board[0][0];
	}
	if (board[0][2]==board[1][1]&&board[1][1]==board[2][0]&&board[0][2]!=' ')
	{
		return board[0][0];
	}
	if (is_full(board, row, col) == 1)
	{
		return 'q';
	}
	return 'c';
}

9、判断键盘是否满

🐻如果棋盘满了,就是平局;

static int is_full( char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int  j = 0; j < col; j++)
		{
			if (board[i][j]==' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

总结

❤️❤️❤️今天的分享就到这里了,给大家留了一个问题,大家可以思考思考,如果实在不明白,关注小月,下篇文章会出详解。。。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到