wince下的五子棋项目书.doc_第1页
wince下的五子棋项目书.doc_第2页
wince下的五子棋项目书.doc_第3页
wince下的五子棋项目书.doc_第4页
wince下的五子棋项目书.doc_第5页
免费预览已结束,剩余27页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务分配文档编写 其它时间作者完成任务2010/12/15李硕林选定人机对弈五子棋作为本学期期末项目,并完成需求分析和整体的程序设计架构2010/12/28李硕林跟具体程序代码和运行界面,完成wince模拟器上图片资源、集成环境等资源在文档上的添加2011/01/03李硕林根据最后完成的五子棋游戏,对文档进行最后的修改PPT制作 其它时间作者完成任务2011/01/04李硕林五子棋需求、环境、简要说明以及代码思想代码编写 其它时间作者五子棋架构任务分配2010/12/17李硕林想出用基于对话框做五子棋,并且完成整个游戏的程序架构,只需添加模块代码2010/12/28李硕林完成对话框模块、五子棋类和AI的添加2011/01/02李硕林程序最后的修改目录 任务分配2第一章 五子棋游戏软件需求说明书41.1 引言41.2 流程51.3 说明5第二章 五子棋游戏需求分析报告62.1 引言62.2 平台和任务62.3 功能需求62.4 游戏概述62.5 运行环境描述7第三章 五子棋游戏设计书83.1 硬件环境搭建83.2 软件环境搭建93.2.1wince的移植93.2.2pc机安装集成环境以及与硬件的互连103.3 模拟器上游戏界面及说明11第四章 五子棋程序设计书154.1 架构设计154.2 对话框编程基本知识分析164.2.1 SDK基础知识164.2.2 MFC基础知识164.2.3 对话框基础知识174.3 模块一 五子棋对话框程序数据结构设计184.4 模块二 五子棋类及AI设计194.4.1 获胜记录数据结构204.4.2 下棋记录数据结构204.4.3 五子棋类数据结构224.4.4 对话框与五子棋类的交互244.4.5 五子棋类重难点分析25第五章 测试报告29第六章 五子棋游戏的使用手册30参考文献32结束语33五子棋游戏文档(项目作者:李硕林) 4项目指导老师:文光明第一章 五子棋游戏软件需求说明书1.1 引言游戏软件是当今世界发展最迅速,最有影响力,最有潜力与活力的领域之一?游戏软件深受广大青年人喜爱,而且在发达国家中老年人也有大部分喜欢游戏的,因此游戏软件在很大程度上给予绝大部分人精神上的娱乐?第二次世界大战以后,电子计算机技术得到了突飞猛进的发展?先是由晶体管代替了笨重的真空管,后来出现了集成电路和大规模集成电路,使电子子计算机一代一代实现更新,同时软件技术也发展迅速?在美国,集中了许多计算机软件的设计人才,他们工作之余,时常喜爱编一种能与人斗智的“游戏”,以此来锻炼编程的能力?这种“游戏”花样繁多,但其特点都是利用计算机软件事先设计好的“分析”?“判断”能力反过来与人较量?由于不断修改更新,使计算机的“智力”水平与人难分高低?到了90年代,游戏软件已经为世界各国的人使用,BLACKISLAND和Blizzard.这两个强大的游戏制作组起到了巨大的带动作用,还有中国的洛河工作室在国内也起到了巨大作用,他们让很多很多人喜欢上了游戏软件,打开了这个市场。如今游戏软件产业已经受到了广泛的关注,它年轻有潜力而且吸引人,让人们日益丰富的生活需求得以满足。五子棋游戏更是吸引着不同年龄段的人群,无论男女老少都可以玩,都喜欢玩,而当前微型计算机已经是在广大人群中流行着,用电脑来下五子棋更是一种时尚。五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有“女娲造人,伏羲做棋”一说,增山海经中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。”李善注引三国魏邯郸淳艺经中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。可见,五子棋颇有渊源。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来,可以说五子棋是我们的国粹之一了。所以呢,五子棋游戏,可以说是永不过时的。随着科技的发展,在嵌入式设备上的娱乐也是需求越来越大,我们决定在嵌入式产品上开发一款五子棋游戏。1.2 流程1.3 说明1、研发的人机对弈五子棋游戏只能在wince平台上运行2、功能分析见第二章第二章 五子棋游戏需求分析报告2.1 引言人类之所以不断在进步,是因为我们人类一直不断的在思考,五子棋游戏程序的开发符合人类进步也是促进人类进步的一大动力之一。五子棋游戏程序让人们方便快捷的可以下五子棋,让人们在何时都能通过下棋来提高逻辑思维能力,同时也培养儿童的兴趣以及爱好,让孩子更加聪明。同时,五子棋游戏程序的开发也使得五子棋这个游戏得到了广泛的推广,让世界各地的人们知道五子棋,玩上五子棋,这已经不是局限。五子棋游戏程序使得越来越多的人喜欢上了五子棋,热爱下五子棋,它是具有很好的带动性的。所以,五子棋游戏的需求还是很大的。2.2 平台和任务1、s3c2410开发板为硬件平台2、wince为软件平台3、在wince上运行五子棋游戏2.3 功能需求1、人机对弈2、新建游戏开始3、赢了消息框提示4、输了消息框提示5、悔棋功能2.4 游戏概述1.绘制十五行十五列的棋盘:首先是每行每列的距离都是一样的,并且棋盘上面有五个黑圆点,用于棋盘的开始。2.棋盘上面落子:点击鼠标以后,会在相应位置落下棋子,如果确定能下子,那么就在那个矩形位置加载位图资源,然后让它显示。3.黑白双方轮流落子:黑方落子以后就要轮到白方,交替进行,这是下棋的基本要求,因此我们就要弄一个互斥事件进去,让他们交替的落子。不能落在相同位置:当我们落子时,会不小心落到相同位置上去,那么就要出现提示,不能落在相同位置上,需要重新落子,实现的设想是当这个点已经绘制过棋子以后,我们就要给一个布尔变量,让它为假,那么只能在它为真时才能绘制棋子,否则就要重新落子到别的地方去。4.判断输赢:当五个相同颜色子都连在了一起的时候,我们就要判其为赢,这五个子可以在横竖方向上连起,也可以在斜方向上连起。5.重新开始游戏就是把棋盘上的子全部清空,回复到一开始的时候的状态,重置之前所有的数据。认输的功能就是在判断输赢功能的基础上添加的,让玩家对自己没信心的时候使用。退出游戏的功能就是直接把窗口关闭就可以了。 6. 人性化的各种消息框提示。2.5 运行环境描述由于硬件设备欠缺,暂时只在支持开发板的wince模拟器上运行第三章 五子棋游戏设计书3.1 硬件环境搭建所需硬件设备:1、pc机2、S3C2410开发箱环境搭建流程如下:1、打开开发箱 2、打开pc机,运行相关软件3、实验箱并口线、网线与电脑相连,实验箱连上电源3.2 软件环境搭建3.2.1 wince的移植1. 建立新的pb工程2. 选择适当的CPU3. 选择一个合适的模板4. 勾选必要的组件5. 选择合适的网络组件,去掉设备不支持的设备组件6. 为工程添加设备驱动7. 添加BSP板载驱动8. 添加开发和应用程序支持9. 设置各CPU语言和编译设置10. 修改注册表11. 编译自己的WinCE12. 打包制作SDK13. 安装SDK,配置SDK目录14. 下载winCE到开发箱 超级终端中将会出现以下画面 下载完成后开发箱中的WinCE将会自动启动3.2.2 pc机安装集成环境以及与硬件的互连1. 在PC中安装微软同步软件2. 把USB线连接开发箱和PC机,系统将提示找到设备,选择从指定位置安装3. 指定BSP目录下的DRIVERSUSBFUNCTION目录,完成USB驱动的安装4. 驱动安装完毕后,微软同步软件将自动与设备进行连接5. 打到EVC或者PB5中的远程连接工具,可以连接到开发箱中进行各相关操作。EVC界面如下:3.3 模拟器上游戏界面及说明 图一、为开发板而制作的模拟器 图二、刚运行时的游戏界面 图三、新建游戏界面 图四、赢棋时界面 图五、输棋时界面 图六、按下悔棋按钮时的悔棋提示备注:人方为黑子,电脑方为白子,人先下子,紧跟着电脑自动下子,最后不论哪方赢了,都将棋子颜色变成红色,以提示是哪五子连成一线了第四章 五子棋程序设计书4.1 架构设计 我们要设计一个界面式的游戏,要求最好是能用wince开发,那我们用SDK编写五子棋,还是基于MFC?此时,首先想到的是用MFC的对话框。好吧,就让我们基于对话框做一个人机对弈的五子棋吧。下面我就来剖析一下它的架构。 4.2 对话框编程基本知识分析4.2.1 SDK基础知识SDK编程,通常包括以下几个部分:1. 设计窗口类2. 注册窗口类3. 创建窗口4. 显示并更新窗口5. 编写消息循环6. 编写窗口过程函数而MFC跟SDK编程有点区别,SDK是C语言版本的,而MFC是C+版本的。既然是C+写的,那肯定得体现它的优势。当然是C+的面向对象思想,得把SDK的API封装才行。所以接下来,稍微分析一下SDK的封装及MFC的消息映射机制。4.2.2 MFC基础知识SDK的入口函数是WinMain函数,而在MFC中似乎找不到入口函数。其实不然,MFC把它封装了,在哪呢?先让我们看一下MFC的一些继承图: 窗口设计和注册在MFC源代码WINCORE.CPP文件当中的AfxEndDerRegisterClass全局函数完成,而窗口的创建在上图的CWnd类中的CreateEx函数中完成。再接着看一张图: 在上图CwinApp的子类里面会实现窗口的显示和更新,而在MFC源代码THRDCORE.CPP文件中你会发现CWinThread类中有个函数Run,分析源代码可以知道,它内部就封装了我们win32里面的消息循环。4.2.3 对话框基础知识此时我们已经完成了从win32到mfc的过度。接下来,我将围绕这学期文老师要我们做的项目来展开。我做的是人机对弈五子棋游戏,是基于对话框的。现在我将一步一步分析功能的实现。(具体细节及数据结构设计,将在后面分析,暂分析对话框架构)首先,那得新建一个基于MFC对话框的工程,对话框工程里面有两个很重要的类:xxxApp类和xxxDlg类。然后再逐一分析xxxApp类和xxxDlg类。1. xxxApp类:主线程类,实现个资源的初始化和消息的发送。就比如这个五子棋项目,我们可以在其函数InitInstance中实现一些初始化功能。在这个函数中还可以加载五子棋的对话框类。2. xxxDlg类:实现五子棋界面的各个功能。A. 对话框的初始化,在OnInitDialog这个函数中,我们将实现加载棋盘、各颜色棋子资源还有标题栏、按钮的初始化。B. 消息事件的捕获。在我们的五子棋游戏当中,对话框类要实现对鼠标按下、弹起事件,按钮事件,重画事件等的实现。4.3 模块一 五子棋对话框程序数据结构设计在有了上面的对话框编程基本知识分析之后,现在我来分析,这次人机对弈五子棋的对话框编程部分CAdbonWZQApp类:五子棋主类。CAdbonWZQDlg类:五子棋对话框类。其数据结构设计如下:class CAdbonWZQDlg : public CDialog/ Constructionpublic:CAdbonWZQDlg(CWnd* pParent = NULL);/ standard constructor/ Dialog Data/AFX_DATA(CAdbonWZQDlg)enum IDD = IDD_ADBONWZQ_DIALOG ;/CButton*m_back;/CButton*m_new;/ NOTE: the ClassWizard will add data members here/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAdbonWZQDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:void loadfile();CString runpath;CDC2 qp; /CDC2类在以下将会介绍,就是一个DCCDC2 qzh;CDC2 qzb;CDC2 mask;CDC2 dead;wzq twzq; /这是一个五子棋类,里面包含了AI算法,后面我将重点介绍CDC m_HenMemDC;HICON m_hIcon; /自定义图标句柄/ Generated message map functions/AFX_MSG(CAdbonWZQDlg)virtual BOOL OnInitDialog(); /初始化对话框afx_msg void OnButnew(); /新建一五子棋游戏afx_msg void OnButback(); /悔棋事件afx_msg void OnLButtonDown(UINT nFlags, CPoint point); /鼠标左键按下事件afx_msg void OnLButtonUp(UINT nFlags, CPoint point); /鼠标左键释放事件afx_msg void OnPaint(); /重画事件/AFX_MSGDECLARE_MESSAGE_MAP();在看上面的类中发现一个不知道的类CDC2类,现在我将介绍它的数据结构和功能:1. 数据结构定义如下:class CDC2 : public CDC public:CDC2();virtual CDC2();CSize GetSize();void SetSize(CSize size);CSize msize;2. 功能:获得DC大小(长和宽)和设置其大小4.4 模块二 五子棋类及AI设计终于到我们这个五子棋的核心部分了,先让我们看一下五子棋类设计的框架图:上面的悔棋记录是用一个结构体数组保存,获胜记录是用一个结构体保存。好,现在就先让我们看一下他的数据结构吧4.4.1 获胜记录数据结构struct wzwin/获胜int winner;/0 没有获胜 1 白 2 黑int nx1;/五连的坐标int nx2;int ny1;int ny2;4.4.2 下棋记录数据结构struct wzsave/下棋记录bool used;/是否使用bool color;/颜色int ix;/坐标int iy;现在就让我一一解释上面框架图当中的属性和行为吧1. 各颜色棋子句柄 各颜色棋子和棋盘的属性2. 双方棋局的保存 双方棋子位置都保存在一个三维数组里面3. 棋盘地图的存储 保存棋盘当前状况4. 人机属性 表示现在该到人还是电脑下棋了5. 电脑预测属性 是AI算法里面的,对人下棋的各种可能性评估,并且预测到几步以后6. 当前模式属性 0人-机 1机-人 2对翌7. 悔棋记录 通过三维数组保存每下一步的步骤(下一步就有一个棋盘,所以用三维数组)8. 是否可以悔棋属性 包括悔棋标识和方法9. 获胜记录 保存到上面提到的那个结构体里面1. 绘图 包括画棋子和重绘整个棋盘2. 下棋 包括悔棋操作和调用AI算法外部函数实现智能下棋4.4.3 五子棋类数据结构通过上面的一一解释,我相信,大家都对这个五子棋有了很深的理解。好,下面就让我们,看一下五子棋类数据结构的定义吧。class wzq public:wzq(CDC2*tqp,CDC2*tqzh,CDC2*tqzb,CDC2*tmask,CDC2*dead,CDC*dc);wzq();virtual wzq();void NewGame();/新游戏/初始化void DrawQZ(int nx,int ny,bool style);/画棋子void SetDc(CDC2*tqp,CDC2*tqzh,CDC2*tqzb,CDC2*tmask,CDC2*dead,CDC*dc);/设置DCvoid draw();/当需要重画时调用/绘图private:bool userAd(int nx,int ny);/黑色下子bool userBd(int nx,int ny);/白色下子public:bool downzi(int nx,int ny);/外部调用此函数下子bool bewinner2(bool style,int nx,int ny);/判断胜败/下棋bool goback();/悔棋void setback(int nx,int ny,bool style);/记录bool getbackble()return nowd2机 1机-人 2对翌bool backable ;/是否悔棋 0=N 1=Yprotected:private:CDC2*qp;/棋盘dcCDC2*qzh;/黑子dcCDC2*qzb;/白子dcCDC2*mask;/屏蔽dcCDC2*dead;/红子CDC*dc;/窗口dcunsigned char user15154;/储存棋局unsigned char pc15154;/储存棋局char map1515;/储存棋盘地图unsigned char nicest21515;char trygo1515;bool dcseted;int nowd2;int aitype2;wzsave wzs225;至此,相信大家看了这数据结构之后,肯定对五子棋类的思想,已经有了很深的了解。在开始那,我已经把基于对话框的五子棋编程已经交代清楚了。到目前为止,就差对话框与五子棋的交互这些操作了。好,接下来,我就讲述一下,对话框与五子棋的交互。4.4.4 对话框与五子棋类的交互还是先然我们看一下它的框图吧4.4.5 五子棋类重难点分析4.4.5.1 怎么判断已经赢棋了现在,人通过鼠标在棋盘上的落子,还有电脑的自动落子,已经可以在棋盘上进行棋子的显示了,但要怎么判断这盘棋是否已经赢了。在项目中,我写在五子棋类的bewinner2函数中。现在我就剖析它实现判断是否赢棋的思想。首先,整个棋盘的当前下子状态是保存在map这个二维数组当中。第二,落子的时候它将传递一个坐标(棋盘map上的坐标)。第三,进行判断。1、方向判断五子棋连成一线,有四个方向,水平、竖直、从左上角到右下角、从左下角到右上角。现在我们只要判断这四个方向是否有连续的五个棋子就可以了。如果有的话,那就赢了。否则,还没赢棋,还得继续下子。2、连续五个棋子的判断因为在落子的时候有个在当前棋盘上的坐标,我们就以当前下子点为出发点。当前下子点的左边五个棋子和当前下子点的右边五个棋子,即水平方向。当前下子点上边的五个棋子和当前下子点下边的五个棋子,即竖直方向。以此类推,看分别在四个方向(每个方向11个棋子)是否有连续的五个子,有那就赢了。下面,就以源代码来分析bool wzq:bewinner2(bool style,int nx,int ny)/赢了,返回1,没赢返回0/参数 style,代表当前下子的是哪一方/参数nx和ny,代表当前落子点在棋盘上的坐标int tx1=0,tx2=0,ty1=0,ty2=0;int yx1=0,yx2=0,yy1=0,yy2=0;int st=(int)style+1;for (int x1=-5 ; x1=5) /连续棋子个数大于等于5twinner.winner =st; /获胜记录保存twinner.nx1= nx+yx1;twinner.nx2 =nx+yx1+5;twinner.ny1 =ny;twinner.ny2 =ny;return true; /返回1,表明此时已经赢棋了else tx1=0;if (mapnxny+x1=st) /竖直ty1+;if (ty1=1)yy1=x1;if (ty1=5) /连续棋子个数大于等于5twinner.winner =st; /获胜记录保存twinner.nx1= nx;twinner.nx2 =nx;twinner.ny1 =ny+yy1;twinner.ny2 =ny+yy1+5;return true; /返回1,表明此时已经赢棋了else ty1=0;if (mapnx+x1ny+x1=st) /从左上角到右下角tx2+;if (tx2=1)yx2=x1;if (tx2=5) /连续棋子个数大于等于5twinner.winner =st; /获胜记录保存twinner.nx1= nx+yx2;twinner.nx2 =nx+yx2+5;twinner.ny1 =ny+yx2;twinner.ny2 =ny+yx2+5;return true; /返回1,表明此时已经赢棋了elsetx2=0;if (mapnx+x1ny-x1=st) /从左下角到右上角ty2+;if (ty2=1)yy2=x1;if (ty2=5) /连续棋子个数大于等于5twinner.winner =st; /获胜记录保存twinner.nx1= nx+yy2;twinner.nx2 =nx+yy2+5;twinner.ny1 =ny-yy2;twinner.ny2 =ny-yy2-5;return true; /返回1,表明此时已经赢棋了else ty2=0;return false; /返回0,表明现在还没赢棋4.4.5.2 电脑怎么寻找最佳下棋位置上面讲了如何判断是否赢棋,现在讲一下电脑如何找到最佳下棋位置。找到过程如下图所示:在源代码里面有个AiGo函数,此函数用于电脑下棋。现在分析一下过程。(以下函数都摘自五子棋类里的成员函数,搞不清楚的,看上面介绍的类的设计或者源代码)首先,外部调用downzi函数,此函数的功能是电脑自动下子,若需更新显示棋子,只需重画棋盘。第二,downzi函数根据模式(成员变量Model),当它不是人下子的时候就调用AiGo函数第三,AiGo函数里面需调用getaitype函数,即获得搜索深度,因为构建博弈树的时候,需要设置搜索深度。第四,在AiGo函数里调用getmax函数(获得最佳下棋点,返回棋盘坐标),传进一个搜索深度参数。第五,getmax函数通过nicest2二维数组,查看赢棋状况。第六,预测函数checkgo通过user(前面介绍的三维数组)来标记胜败第七,上面图的局面评估,得利用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论