栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > C/C++/C#

五子棋简单实现、递归

C/C++/C# 更新时间:发布时间: 百科书网 趣学号

五子棋
需要的数据:
1、定义字符数组的棋盘15*15
2、定义变量用于记录落子的位置
3、定一个变量记棋子变量 黑棋‘@’ 白棋‘$’
业务逻辑:
定义数据
是否需要对数据进行初始化
for(;;)
{
1、清理屏幕、显示棋盘
2、落子
判断是否能下,是否合法,不能有其他棋子
否子继续重新落子
3、检查是否五子连珠
是,结束游戏
4、交换角色
}

#include 
#include 
#include 
#include 

//	棋盘数组
char board[15][15];
//	棋子坐标
char key_x = 7,key_y = 7;
//	角色 黑'@' 白'$'
char role = '@';

//	初始化棋盘
void init_board(void)
{
	for(int i=0; i<15; i++)
	{
		for(int j=0; j<15; j++)
		{
			board[i][j] = '*';	
		}
	}
}

//	显示棋盘
void show_board(void)
{
	system("clear");
	for(int i=0; i<15; i++)
	{
		for(int j=0; j<15; j++)
		{
			printf(" %c",board[i][j]);	
		}
		printf("n");
	}
}

//	落子
void get_key(void)
{
	printf("请%c落子",role);
	for(;;)
	{
		printf("33[%hhd;%hhdH",key_x+1,(key_y+1)*2);//位置
		switch(getch())
		{
			case 183:	key_x>0 && key_x--;	break;	
			case 184:	key_x<14 && key_x++;break;	
			case 186:	key_y>0 && key_y--;	break;	
			case 185:	key_y<14 && key_y++;break;
			case 10:	if('*' == board[key_x][key_y])//回车落子
						{
							board[key_x][key_y] = role;
							return;
						}
						break;
		}
	}
}

//	检查是否五子连珠
bool is_win(void)
{
	//	左上+右下
	int cnt = 0;
	//	左上
	for(int x=key_x-1,y=key_y-1; x>=0 && y>=0; x--,y--)
	{
		if(board[x][y] == role)
		{
			cnt++;	
		}
		else
		{
			break;	
		}
	}
	//	右下
	for(int x=key_x+1,y=key_y+1; x<15 && y<15; x++,y++)
	{
		if(board[x][y] == role)
		{
			cnt++;	
		}
		else
		{
			break;	
		}
	}
	if(4 <= cnt)
	{
		return true;
	}

	cnt = 0;
	//	上下(思路同上)
	//	左右
	//	右上+坐下
	return false;
}

int main(int argc,const char* argv[])
{
	init_board();
	for(;;)
	{
		show_board();	
		get_key();
		if(is_win())
		{
			show_board();
			printf("%c胜利n",role);
			return 0;
		}
		//	交换角色
		role = '@'==role?'$':'@';
	}
} 

递归:
函数自己调用自己的 这种行为叫做函数递归,可能产生死循环
递归是可以实现分治的这种算法,把一个复杂的大问题,分解成若干个相同的小问题,知道所有问题全部解决
如何写好递归(全局眼光):
1、写好出口
2、解决一个小问题
3、调用自己
练习一:计算前n项斐波那锲 数列

#include 

//	计算第n个非波那切数列的值
int fibo(int n)
{
	if(1 == n || 2 == n) return 1;

	return fibo(n-1) + fibo(n-2);
}

int main(int argc,const char* argv[])
{
	printf("%dn",fibo(6));
}

递归函数每一次调用都会在栈内存产生一份自己的拷贝,直到执行到达出口,才会释放这一层递归函数,因此与循环相比递归非常耗费内存、速度很慢,如果能用循环解决的问题就不要使用递归
递归的优缺点:
1、好理解、思路清晰(不要跟着思考)
2、很好地解决非线性问题
3、耗内存、速度很慢

练习二:使用递归模拟汉诺塔的移动过程

#include 

void hanio(int n,char s,char m,char e)
{
	if(1 == n)
	{
		printf("1 from %c to %cn",s,e);
		return;
	}
	hanio(n-1,s,e,m);
	printf("%d from %c to %cn",n,s,e);
	hanio(n-1,m,s,e);
}

int main(int argc,const char* argv[])
{
	hanio(8,'A','B','C');
}

个人感受:递归比较难使用,会不由自主的跟着逻辑下去,然后就不知道怎么实现了

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1033555.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号