Win32游戏制作之---五子棋的设计(一)

想必每个人都玩过五子棋,其实对于我而言,五子棋是小时候玩的最多的棋类游戏,当然小时候也爱玩象棋以及国际象棋之类的,不过由于五子棋比较简单,所以就先实现一个简单的人机五子棋。最近我就在想如今学会了一点编程之后是不是应该把以前小时候特备爱玩的游戏实现一下,毕竟那是一种珍贵的回忆!

好了其他的不多说了,进入到我们的正题,首先呢,我准备分两次实现这个五子棋的内容,因为在制作好之后,个人感觉自己对于AI落子的算法的实现写得不够好,也思考了好久,感觉还是没有达到预期的效果,虽说最近放假了,但是学校又有事情,因此这次就简单地先把界面实现,以及把其中的一些游戏逻辑函数,游戏判断函数先贴出来,之后再仔细想一想如何实现AI的算法,使得AI更加智能化,能够提升游戏的乐趣,否则老是玩家赢的话,这样的游戏做出来是很失败的!

首先先简单地介绍一下,主要实现了以下几个函数:

//游戏函数
BOOL IsBlackOrWhite();                                        //随机生成,判断谁是黑子或者白子
//游戏中的检测函数
void ResetGame();                                             //重新开始资源清理
BOOL TimeOut();                                               //判断超时函数
BOOL Change_pos();                                            //将屏幕上的坐标转化为棋盘上的坐标
BOOL Change_y();                                              //与上面函数共同组成转化函数
BOOL IsHaveChess(PlayerChess &pCh);                           //判断要落点位置有无其他棋子(玩家)
BOOL IsHaveChess(ComputerChess &cCh);                         //判断要落点位置有无其他棋子(电脑)
void RegretPace();                                            //悔棋函数(只能悔棋三次)
void Computer_play();                                         //电脑落子
BOOL CheckWin();                                              //判断玩家赢还是电脑赢

先在这里说明一下,其中电脑落子函数,以及判断输赢的函数这次感觉写的不够好,AI的算法还是很低级的,只要稍微会玩一下的玩家只要不大意根本输不了,因此这样的AI算法还是很失败的,因此准备再想一想一个更好地AI算法,不过哪怕自己再怎么想,终究还是敌不过人脑的!

这里进一步说明一下这几个函数,其中坐标转化函数的作用主要就是将鼠标点击的位置转化为棋盘上的规定位置,否则如果鼠标往哪点就会生成棋子的话,那么画面就一点也不整洁了。

还有一个判断超时的函数,一般来讲在网络上玩的这些棋类游戏都会有时间检测,用来判断其是否超时。在这次我是15秒如果没有落子的话就强制玩家落子,而落子的位置是根据此时你鼠标所在的位置最近的一个坐标点的位置。也不知道这样做好不好,不过个人感觉还是比强制随机落子的效果要好一些!

接下来就看一看内部的实现代码,由于代码全部给出的话太占篇幅了,因此我只给出有关游戏之中几个重要函数的代码,生成窗口这样的代码就不贴出来的,封装在了一个小小的游戏引擎之中!当然如果需要源代码的话,可以在后面留下邮箱或者私信我!

BOOL IsBlackOrWhite()                                        //判断是黑子还是白子
{
	int result = 0;
	result = rand() % 2;
	if (0 == result)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

void ResetGame()                                            //重新开始资源清理
{
	g_isinGame = FALSE;
	g_iBlackNum = 0;
	g_iWhiteNum = 0;
	if (IsBlackOrWhite())
	{
		int i = 0;
		g_PlayerColor = BLACK;
		for (i = 0; i < CHESS_COUNT; i++)
		{
			pChess[i].color = BLACK;
			pChess[i].isExist = false;
			cChess[i].color = WHITE;
			cChess[i].isExist = false;
		}
	}
	else
	{
		int i = 0;
		g_PlayerColor = WHITE;
		for (i = 0; i < CHESS_COUNT; i++)
		{
			pChess[i].color = WHITE;
			pChess[i].isExist = false;
			cChess[i].color = BLACK;
			cChess[i].isExist = false;
		}
	}
}

BOOL TimeOut()                                               //判断超时函数
{
	g_tNow = GetTickCount();
	//判断是否为第一次落子
	if (BLACK == g_PlayerColor)
	{
		if (g_iBlackNum == 0)
		{
			return FALSE;
		}
	}
	else
	{
		if (g_iWhiteNum == 0 && g_iBlackNum == 0)
		{
			return FALSE;
		}
	}
	if ((g_tNow - g_tPre > 20000)&&(g_isinGame == TRUE))
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

//判断要落点位置有无其他棋子
BOOL IsHaveChess(PlayerChess &pCh)
{
	BOOL flag = FALSE;
	if (BLACK == g_PlayerColor)                        //先判断玩家棋子颜色
	{
		for (int i = 0; i < g_iBlackNum; i++)
		{
			 if ((pCh.x == pChess[i].x) && (pCh.y == pChess[i].y))
			{
				flag = TRUE;
			 }
		 }
 		for (int i = 0; i < g_iWhiteNum; i++)
		{
			if ((pCh.x == cChess[i].x) && (pCh.y == cChess[i].y))
			 {
				flag = TRUE;
			 }
		}
	}
	else                                               //玩家为白子的判断
	 {
		for (int i = 0; i < g_iWhiteNum; i++)
		 {
			if ((pCh.x == pChess[i].x) && (pCh.y == pChess[i].y))
			{
				flag = TRUE;
 			}
		}
		for (int i = 0; i < g_iBlackNum; i++)
		{
			 if ((pCh.x == cChess[i].x) && (pCh.y == cChess[i].y))
			{
				flag = TRUE;
			 }
		}
	}
	return flag;
}
BOOL IsHaveChess(ComputerChess &cCh)
{
	BOOL flag = FALSE;
	 if (BLACK == g_PlayerColor)                        //先判断玩家棋子颜色
	{
		for (int i = 0; i < g_iBlackNum; i++)
		 {
			 if ((cCh.x == pChess[i].x) && (cCh.y == pChess[i].y))
			 {
				 flag = TRUE;
			 }
		}
		 for (int i = 0; i < g_iWhiteNum; i++)
		{
 			if ((cCh.x == cChess[i].x) && (cCh.y == cChess[i].y))
			{
				flag = TRUE;
 			}
		}
	}
	 else                                               //玩家为白子的判断
	{
		for (int i = 0; i < g_iWhiteNum; i++)
		 {
			if ((cCh.x == pChess[i].x) && (cCh.y == pChess[i].y))
			{
				 flag = TRUE;
			}
 		}
		for (int i = 0; i < g_iBlackNum; i++)
		{
 			if ((cCh.x == cChess[i].x) && (cCh.y == cChess[i].y))
			{
 				flag = TRUE;
 			}
 		}
	}
	return flag;
}
//悔棋函数(只能悔棋三次)
void RegretPace()
{
	if (BLACK == g_PlayerColor)                                //判断玩家棋子的颜色
	 {
		if (0 == g_iBlackNum)           //玩家棋子颜色的个数,从而判断玩家是否可以悔棋
		{
			 MessageBeep(MB_ICONEXCLAMATION);  //棋子数为0,无法悔棋,发出警告声
		}
		else
 		{
			pChess[g_iBlackNum - 1].isExist = FALSE;   //清除该棋子
			g_iBlackNum--;                             //黑棋个数减一
 		}
	}
	else
	 {
		if (0 == g_iWhiteNum)          //玩家棋子颜色的个数,从而判断玩家是否可以悔棋
		 {
			MessageBeep(MB_ICONEXCLAMATION);  //棋子数为0,无法悔棋,发出警告声
		 }
 		else
 		{
 			pChess[g_iWhiteNum - 1].isExist = FALSE;   //清除该棋子
			 g_iWhiteNum--;                             //白棋个数减一
		}
 	}
	g_PaceCount--;
}

当然这里面还是有几个函数比较占空间,但是都是一些很简单的操作,就没有给出来。更重要的就是里面还有电脑的算法没有一个更好地方案。在后续的文章之中肯定会对AI的算法有一定地深入了解,当然在这里为了测试的需要,我简单地给出了一个随机落子的方法。

//电脑落子
void Computer_play()
{
	if (BLACK == g_PlayerColor)                      //通过判断玩家棋子颜色,从而知道电脑棋子的颜色
	{
		for (int i = 0; i < CHESS_COUNT; i++)
		{
			if (!cChess[i].isExist)
			{
				while (true)
				{
					g_iX = rand() % 674;
					g_iY = rand() % 660 + 40;
					if (Change_pos())
					{
						cChess[i].x = g_ichessX;
						cChess[i].y = g_ichessY;
						if (!IsHaveChess(cChess[i]))           //判断新棋子要落子的位置有无其他棋子
						{
							cChess[i].isExist = true;
							g_iWhiteNum++;
							break;
						}
					}
				}
				break;
			}
		}
	}
	else
	{
		for (int i = 0; i < CHESS_COUNT; i++)
		{
			if (!cChess[i].isExist)
			{
				while (true)
				{
					g_iX = rand() % 674;
					g_iY = rand() % 660 + 40;
					if (Change_pos())
					{
						cChess[i].x = g_ichessX;
						cChess[i].y = g_ichessY;
						if (!IsHaveChess(cChess[i]))           //判断新棋子要落子的位置有无其他棋子
						{
							cChess[i].isExist = true;
							g_iBlackNum++;
							break;
						}
					}
				}
				break;
			}
		}
	}
}

好了,由于这次没有实现这个游戏最核心的部分,AI的算法实现,因此这次就说到这,之后肯定会针对AI(人工智能)的算法给出实现,当然如果可以的话最好实现一个网络编程用来实现人人对战,当然这个可能实现起来比较难,不过AI的算法之后肯定会实现的!

最后来看一下截图,当然个人美工做的差,请不要见怪哦!

首先是最初的界面,当然这里由于时间原因,没有能够做多级页面,请大家见谅!

接下来来看一下运行过程之中的画面,不过需要点击开始按钮,否则游戏状态切换不过去!

当然这里的AI是自动随机落子的,所以看上去下的很没有规律。同时也可以进行悔棋以及认输功能,不过失败场数会加1。如下图:

最终总结一下,这只是一个最基本的五子棋,由于暂时还没有想到更好的AI算法,因此后续还会继续五子棋的编写,里面的AI算法在下一篇文章之中会给出来,暂时还在测试阶段。

时间: 2024-10-12 01:37:52

Win32游戏制作之---五子棋的设计(一)的相关文章

张左峰的分享 网页游戏制作技术 加密的设计思路与手段

网页游戏制作技术 加密的设计思路与手段 必备工具:Doswf 好朋友Laan开发,请自行百度搜索 今天太晚了,明天再更新内容...咔咔咔

Win32游戏制作之---FreakOut

记得自己小时候曾经玩过这个小游戏,如今长大了,有了一定的知识就可以实现一些小时候未曾想过的事情,或者说梦想去做的事情!虽然这次实现的小游戏比较简单,但是也算游戏吧,比较自己还不是这方面的大神. 如果想要用Win32项目制作一个小游戏,那么首先你要对对C/C++语言熟悉,对Windows编程有一定的了解.其实还有一点就是你在开始制作小游戏之前,你要知道你的游戏的逻辑结构.对于一般的小游戏结构可以用下图的结构表示. Game_main()是游戏的主体函数,不过它在主事件循环每次处理windows消息

Win32游戏制作之---Bizzard

之前写了一片关于游戏引擎设计的文章,今天就用游戏引擎来实现一个小游戏(其实不算是严格意义上的游戏),主要就是为了感受游戏引擎给游戏设计带来的便利,而并不是游戏本身,使用游戏引擎之后你会发现,游戏设计会简便很多.它给你提供一个框架,而你所需要做的就是往里面填内容. 多得不说了,下面来看游戏引擎在游戏之中具体的使用. 先来想一想怎么在原来的游戏引擎上面填写内容,你需要在原来的基础上再新建一个游戏头文件以及游戏实现文件,关于游戏引擎上一篇内容已经讲过了,那么这一次只需要往里面填内容即可. 先来看看头文

Win32游戏制作之---SwordsMan

前言   今天是NBA总决赛的最后一场,还是抢七大战,伟大的James终于圆梦了,比赛之中突然发现詹姆斯胡子都有点白了,原来原先那些陪伴自己众多篮球明星都已经老了,Kobe也退役了,他们每个人都有梦想并且为之奋斗,詹姆斯为了自己的梦想奋斗了这么多年才圆梦,那么自己也应该努力实现自己心中的梦想,当然只是想实现自己心中的一个小小的梦想而已,不是每个人都可以说出为自己家乡带来总冠军那样的豪言壮语. ---这句话送给伟大的詹姆斯,也送给我自己,更送给所有在梦想道路上前进的人 前段时间由于忙着准备学校的考

游戏制作流程【转】

作为创意产业最具发展潜力的行业——游戏行业,它的发展俨然超过所有人的预想.国家政策大力扶持,游戏市场发展势头迅猛,网游收入规模超越传统三大娱乐产业:电影票房.电视娱乐节目和音像制品. 与此同时,国内网游制作水准也在不断提升,<完美世界>.<梦幻西游>等众多高水平网游逐渐夺回被国外网游占据的市场份额.国产网游的逐步成熟,中国网 游市场的前景一片大好,让很多喜欢游戏的人都想进入游戏行业,但对大多数人来说这一领域还是陌生.空白的.这些高水准的网游是如何制作出来的?怎么才能成 为一名优秀的

程序设计C语言二级考试教程 Java基础视频教程 安卓软件开发教程 Unity3D游戏制作入门教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

游戏制作大致流程粗谈之五

这一次的文章来介绍一下游戏制作非常重要的工具之一游戏引擎 游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件.这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始.大部分都支持多种操作平台,如Linux.Mac OS X.微软Windows.游戏引擎包含以下系统:渲染引擎(即"渲染器",含二维图像引擎和三维图像引擎).物理引擎.碰撞检测系统.音效.脚本引擎.电脑动画.人工智能.网络引擎以及场

游戏制作之路:一个对我来说可实现的High-end的Mac/iOS游戏制作大概计划

对于学习一些东西,我比较习惯任务驱动式的学习,也就是说,要事先订好一个目标,要做什么东西,达到什么效果,然后根据自己了解的知识作一个可以实现这个目标的计划. 现在要学的是游戏制作,而且是High-end的3D游戏制作.如前文 游戏制作之路:游戏引擎选择.Mac下和Windows下UnrealEngine 4体验对比.文档及其他 所说的,我已经选择了UE4这个画面最顶级的引擎,它即使是在iOS上,画面也是最高端的,可以参考 Zen Garden 这个Demo.然后我也大概确认了可行性,现在要解决的

Web版2048游戏制作

写在前面 工作之余参与了<慕课网2048游戏制作>的学习视频,视频断断续续看完了,游戏也制作成功了.因为其他的事情也没来的及总结,一拖时间也就过去了,整理磁盘的时候发现了2048源码,思考一下还是将之push到github上了(后面贴出),也顺便写篇总结,回顾一下,同时也谢谢liuyubobobo老师的授课. 不过源码在手,不运行下玩玩,怎么说的过去呢,哈哈!下面是游戏截图. 大图是PC端运行的效果,小图则是在iphone5s上的运行效果(Chrome浏览器debug,具体如何做参考文章:ht