【入门级小游戏】C语言数组函数:解析三(N)子棋

这篇具有很好参考价值的文章主要介绍了【入门级小游戏】C语言数组函数:解析三(N)子棋。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【入门级小游戏】C语言数组函数:解析三(N)子棋,0基础学习,C,c语言,c++,算法

C语言也学习一段时间了,为了巩固我们学习的知识,今天我们写一个三子棋的小游戏。这对初学者是个大工程,跟着我一起开始吧。

一.逻辑思维梳理

我们今天写的是三子棋小游戏,说到游戏肯定就有很多模块组成,所以为了提升游戏的可维护性和移植性
,我们应该采用模块化编写程序,将不同的版块分装在不同文件下。
【入门级小游戏】C语言数组函数:解析三(N)子棋,0基础学习,C,c语言,c++,算法
上图为不同文件的任务,接下来我们就开始逐步讲解我们三字棋的实现。

二.代码板块的实现

1.游戏主逻辑实现

在c语言程序中 最重要的就是main函数,所以我们现在main函数中引用test函数,实现代码分装 使得我们的编写更有层次。
接下来我们开始实现test函数。 在游戏的开始界面我们应该需要一个入口 可以选择玩游戏 或者退出游戏。do while循环可以很好的实现我们的需求。

void test()
{
	int i = 0;
	do
	{
		menu();
		printf("请选择>");
		scanf("%d", &i);
		switch (i)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择:>\n");
			break;
		}
	} while (i);
}

switch在游戏界面选择中非常实用,在上图的代码逻辑实现中我们又引用了菜单meua函数和游戏主体函数game。
meua菜单需要实现一个界面 提供玩游戏和 退出游戏的人两个选择 代码和效果图如下

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

【入门级小游戏】C语言数组函数:解析三(N)子棋,0基础学习,C,c语言,c++,算法
接下来我们着重讲解game函数。

2.棋盘的打印的数组的创建

在菜单选择开始游戏后我们进入到游戏后,我们应该可以看到三子棋的棋盘。在打印棋盘前,我们应该创建一个二维数组对应三子棋盘上的9个位置 接受棋子。

#define ROW 3
#define COL 3

首先我们.h文件中定义好数组的行和列,而不是直接对数组规定行和列,这样有利于后续我们对三子棋升级优化

	char board[ROW][COL];//创建3*3数组存放字符

接着我们创建一个二维数组,用来接受存放旗子。
【入门级小游戏】C语言数组函数:解析三(N)子棋,0基础学习,C,c语言,c++,算法

这是我们想要实现的棋盘效果,但是我们并没有对数组board初始化,所以数组中默认储存的是0,这就达不到上图的效果。
所以在打印棋盘之前,我们应当先对棋盘初始化,将数组的元素都定义为空格。
我们在test中引用函数 Int_board(board, ROW, COL);
在game.h声明函数后 在game.c文件中编写这个函数。

void Int_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个部分
【入门级小游戏】C语言数组函数:解析三(N)子棋,0基础学习,C,c语言,c++,算法
具体的解释,我们依据代码窥探``

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

上面我们吧棋盘分为了三个部分,所以在整个打印代码段 都是被一个for套嵌的。之后只要编写一部分的打印就可以了。

2.玩家下棋的实现

在编写玩家下棋的代码部分时 我们需要注意一下几点:
1.数组接受玩家下的棋子
2.判断玩家坐标输入是否合法
3.玩家输入坐标后 将棋盘打印出来

void player_move(char board[ROW][COL], int row, int  col)
{
	printf("玩家下棋\n");
	while (1)
	{
		printf("玩家输入坐标:>");
		int a, b;
		scanf("%d %d", &a, &b);
		if (a >= 1 && a <= row && b >= 1 && b <= col)
		{
			if (board[a - 1][b - 1] == ' ')
			{
				board[a - 1][b - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标已被占用\n");
			}
		}
		else
		{
			printf("坐标非法\n");
		}
	}
}

当玩家scanf输入坐标后,应该要判断坐标输入是否合法,如果玩家输入的坐标已经被占用或者超出了二维数组的范围,就应该循环再次进入玩家输入坐标的地方,知道坐标输入正确break跳出循环。
当玩家正确输入坐标后,我们要讲新的棋盘打印出来。所以我们需要再次在test.c文件中引用 Print_board(board, ROW, COL); 函数。

3.电脑随机下棋的实现
void comper_move(char board[ROW][COL], int row, int  col)
{
	srand((unsigned int)time(NULL));
	while (1)
	{
		printf("电脑下棋\n");
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

这里需要注意的是电脑随机坐标应该如何生成,还是运用我们熟知的rand函数,srand函数他们需要引用头文件**#include <stdio.h>**,rand函数借助srand种子由time强制转化为unsigned int类型时间戳生成的随机数应该不能超过二维数组行列的范围,所以我们写了

		int x = rand() % row;
		int y = rand() % col;

这里我们有个结论可以 理解记忆一下
【入门级小游戏】C语言数组函数:解析三(N)子棋,0基础学习,C,c语言,c++,算法
接着我们再将电脑随机下的棋 再打印出来。

4.判断输赢

游戏的结果判断 我们现在test.c文件中编写出逻辑 再去编写具体函数
在这里我们规定 输赢平局的返回值
【入门级小游戏】C语言数组函数:解析三(N)子棋,0基础学习,C,c语言,c++,算法

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");

用ret接受 is_win函数的返回值
接下来我们主要编写is_win函数 以及对他的优化升级
【入门级小游戏】C语言数组函数:解析三(N)子棋,0基础学习,C,c语言,c++,算法
在三子棋中有这几种赢法

static int 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 0;
		}
	}
	return 1;
}

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

我们将所有情况列举出来 再写出平局的情况将 字符返回到ret
判断游戏是否需要继续。

三.分析优化和升级

在上面判断三子棋是否输赢时,我们是将所有的情况都一一列举出来。这样就限制的游戏的升级 所以我们能不能优化is_win函数呢?

char is_win(char board[ROW][COL], int row, int col)
{
	int flag1 = 0;///玩家棋数
	int flag2 = 0;//电脑棋数
	int i, j;
	for (i = 0; i < row; i++)///行  计算
	{
		flag1 = flag2 = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == '*')
			{
				flag1++;
			}
			if (board[i][j] == '#')
			{
				flag2++;
			}
		}
		if (flag1 == col)///修改怎么应该实现N子棋
		{
			return '*';
		}
		if (flag2 == col)///修改怎么应该实现N子棋
		{
			return '#';
		}
	} 
	for (j = 0; j < col; j++)///列  计算
	{
		flag1 = flag2 = 0;
		for (i = 0; i < row; i++)
		{
			if (board[i][j] == '*')
			{
				flag1++;
			}
			if (board[i][j] == '#')
			{
				flag2++;
			}
		}
		if (flag1 == col)///修改怎么应该实现N子棋
		{
			return '*';
		}
		if (flag2 == col)///修改怎么应该实现N子棋
		{
			return '#';
		}
	}
	flag1 = flag2 = 0;

	for (i = 0, j = 0; i < row, j < col; i++, j++)//正对角线
	{
		if (board[i][j] == '*')
		{
			flag1++;
		}
		if (board[i][j] == '#')
		{
			flag2++;
		}
	}
	if (flag1 == col)///修改怎么应该实现N子棋
	{
		return '*';
	}
	if (flag2 == col)///修改怎么应该实现N子棋
	{
		return '#';
	}	
	flag1 = flag2 = 0;
	for (i = 0, j = col-1; i<row, j >=0; i++, j--)//逆对角线
	{
		if (board[i][j] == '*')
		{
			flag1++;
		}
		if (board[i][j] == '#')
		{
			flag2++;
		}
	}
	if (flag1 == col)///修改怎么应该实现N子棋
	{
		return '*';
	}
	if (flag2 == col)///修改怎么应该实现N子棋
	{
		return '#';
	}
	if (is_full(board, row, col) == 1)
	{
		return 'Q';
	}

	//继续
	//没有玩家或者电脑赢,也没有平局,游戏继续
	return 'C';
}

上图我用计数器写了 判断棋盘输赢的代码,虽看起来没有原来简单,但是如果升级到N子棋时,这种写法就比较方便
【入门级小游戏】C语言数组函数:解析三(N)子棋,0基础学习,C,c语言,c++,算法
在我玩了七七九十九局后 感觉这个电脑实在太蠢了,所以我们还有什么方法能将电脑下棋更智能些呢? 我们在下篇讲解。

关于三子棋游戏的分享就到这里。
感谢相遇,共同进步。文章来源地址https://www.toymoban.com/news/detail-808502.html

到了这里,关于【入门级小游戏】C语言数组函数:解析三(N)子棋的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用c++实现五子棋小游戏

    五子棋是一款经典小游戏,今天我们就用c++实现简单的五子棋小游戏 目录 用到的算法: 思路分析 定义变量  开始写代码   完整代码  结果图: 合法移动的判断: isValidMove 函数通过检查指定位置是否在棋盘范围内,并且该位置是否为空位来确定是否为合法的移动。 获胜条

    2024年02月07日
    浏览(54)
  • Java实现五子棋小游戏(附源码)

      铜9铁10已经结束了,但还是有很多Java程序员没有找到工作或者成功跳槽,跳槽成功的也只是从一个坑中,跳入另一个坑中…… ​ 在LZ看来,真正有意义的就业与跳槽,是要进入到一个有绝对潜力的行业或者薪资能实现爆炸式增长的。这件事不容易,但也没有想象的遥不可

    2024年02月08日
    浏览(56)
  • Android Studio实现五子棋小游戏

    五子棋是一种两人对弈的策略型棋类游戏,本次五子棋小游戏具有人机对战和人人对战两种玩法。人机对战可以单人挑战AI,实时记录比赛得分,AI是根据棋盘上每个点的得分进行决策,人人对战采用轮流下棋方式进行对决,下棋过程中会记录当前棋子的颜色。可以在下棋过程

    2024年02月08日
    浏览(45)
  • python项目分享 python五子棋小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 五子棋小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: htt

    2024年02月03日
    浏览(47)
  • 五子棋小游戏 java版(代码+详细注释)

    游戏展示         这周闲来无事,再来写个五子棋小游戏。基本功能都实现了,包括人人对战、人机对战。界面布局和功能都写的还行,没做到很优秀,但也不算差。如有需要,做个java初学者的课程设计或者自己写着玩玩也都是不错的(非常简单,小白照着就能写出来)。

    2024年02月07日
    浏览(47)
  • python项目分享 - python五子棋小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 五子棋小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: htt

    2024年02月03日
    浏览(61)
  • Java实现五子棋小游戏(附思路讲解,全部代码,游戏截图)

    本文章是如何实现一个单机版双人五子棋小游戏,通过Swing技术进行可视操作. 个人简介: 🤦‍♂️个人主页:码云不秃头. 😜本人是一名大三学生,马上就要变成考研狗啦,通过一学期对Java学习,经过老师的教学,实现单机版的双人五子棋小游戏,大家互相学习,也同时为了完成我的实

    2024年02月07日
    浏览(48)
  • c语言项目——三子棋小游戏(带详细讲解解析)

    三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。 两个玩家,一个打圈(◯),一个打

    2024年02月09日
    浏览(47)
  • python项目分享 - 五子棋小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 五子棋小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: htt

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包