您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 中国象棋游戏开发设计报告
中国象棋游戏开发设计报告班级:小组编号:小组成员:指导老师:一、开发的目的和意义面向对象程序设计作为一门软件设计的课程,具有极强的实践性,要求学生具备灵活应用理论知识的能力及面向对象程序设计技能的基础。通过游戏开发,学生能了解C++面向对象的设计方法与技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则,培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。还能够了解并通过使用MFC,掌握一种可视化编程的方法,并通过游戏的开发加深对可视化编程的理解。同时,可以提高运用C++编程语言解决实际问题的能力。棋牌游戏属于休闲类游戏,具有上手快、游戏时间短的特点,更利于用户进行放松休闲,为人们所喜爱,特别是棋类游戏,方便、快捷、操作简单,在休闲娱乐中占主要位置。中国象棋作为中国自古以来的经典棋牌游戏之一,一直都是人之间的较量,将中国象棋制作成游戏,可以实现人与计算机之间的对弈。而且人工智能是综合性很强的一门边缘学科,它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作。开发出了计算机象棋游戏,以后不仅仅可以进行休闲游戏,还能锻炼自己的智力和象棋技术,更加方便了人们的日常生活。二、功能描述和分析(用户需求分析)2.1开发背景我们周围有许多同学喜欢下象棋,尤其是男同学,希望能有人可以和自己下象棋,但这种意愿常因为受到条件的限制而难以如愿,比如说需要身边刚好有现成的棋盘棋子,比如说需要是同样懂得中国象棋的对手,但是大家都知道我们这所大学男性同学占少数,即便是条件都满足了,还要考虑这位对手是否有何自己下棋的心情。这时,如果有一台计算机,一个能够支持人机对弈的程序,上面的问题迎刃而解。而我们小组的这个想起游戏设计,正是希望能够做出一款拥有良好性能,良好的智能,能够满足大多数爱好象棋的同学的需求中国象棋人机对弈程序。2.2用户需求分析一款能够与用户对弈,满足用户需求的中国象棋程序,需要有棋盘棋子的局面、鼠标响应控制棋子移动、棋子的走法规则、人机对弈的搜索算法、避免异常引入的多线程、胜负判断,具体分析如下:2.2.1棋盘棋子的局面作为中国象棋的这项游戏,其必不可少的是就是棋子和棋盘,没有这两个部分,想起功能无法实现,不仅仅如此,如果,仅仅有棋子和棋盘,而没有将两者结合起来,那么,也将无法实现中国象棋的游戏功能,所以,棋子和棋盘的设计在这个游戏设计中至关重要。2.2.2鼠标响应在对弈中,棋子是必须可以移动的,不然游戏无法进行。因此,鼠标左键点击是必不可少的一部分。2.2.3棋子的功能分析:中国象棋中各色的象棋棋子的功能使象棋具有了真正的趣味性,中国象棋的棋子的类型大致分为:帅(将)、士、象、马、车、炮、兵(卒)等几个类型。帅(将):红方中的帅和黑方中的将的功能相同,都是只能在九宫格中进行横向和竖向的移动,每次移动一格,并且不能移动超出九宫格,帅和将不能见面。士:士在整片棋盘中,和帅的移动范围类似,也是只能在九宫格中移动,不过士的移动方向是对角线,并且每次只能在一个格子中移动。象:象的走法遵循“象走田”的原则,不能绊象腿。马:马的走法遵循“马走日”的原则,不能绊马腿。车:在整块棋盘中,车可以横向或纵向3移动任意格。炮:每次移动和车的类似,但是在吃对方棋子的时候必须中间有且只能有一个棋子的间隔。兵(卒):红方的兵和黑方的卒的功能相同,特点是只能向对方前进,而不能后退,过河之前不能横向移动,过河之后可以横向移动,不管是前进还是横向移动,每次都只能移动一格。2.2.4良好的人机对弈要实现人机的对弈,搜索算法是很重要的一部分。关于棋类对弈程序中的搜索算法,已有成熟的Alpha-Beta搜索算法。我们在程序中直接借鉴了Alpha-Beta搜索算法并辅以历史启发。Alpha-Beta搜索算法:在中国象棋里,双方棋手获得相同的棋盘信息。他们轮流走棋,目的就是吃掉对方的将或帅,或者避免自己的将或帅被吃。搜索算法的搜索过程很漫长,因此对搜索算法进行简化是有必要的。2.2.5多线程的必要性由于程序在进行搜索时会占用大量的CPU时间,因而阻塞了位于同一线程内的其他指令,使之无法正常工作,因而引入了多线程的思想另外开一个线程,让各程序分开于多个线程。就可以解决程序异常的问题了,因此,多线程思想的引入是有必要的。2.2.6判断胜负游戏需要判断最后由谁胜出三、采用的开发工具和技术,开发环境,适用环境开发工具:VisualC++MFC工程;开发环境:win7;适用环境:windows系统;四、小组成员分工初始化、局面设计部分(贺景);判断胜负、棋子走法部分(邹京甫);鼠标响应、绘图部分(吴鑫);搜索引擎部分等由组员共同完成。五、具体开发方法和过程5.1初始化部分OnInitDialog()负责的是对话框的初始化。可以把有关中国象棋的棋局初始化情况也放在了这里面。初始化的内容包括:对引擎部分所用到的变量的初始化。包括对棋盘上的棋子位置进行初始化(棋盘数组的初始化),对搜索深度、当前走棋方标志、棋局是否结束标志等的初始化;对棋盘、棋子的贴图位置(即棋盘、棋子在程序中实际显示位置)的初始化;对程序辅助部分所用到的一些变量的初始化。棋盘、棋子样式的默认形式,以及着法名称列表的初始化等。1.对棋盘的初始化memcpy(m_byChessBoard,InitChessBoard,90);2.对棋盘、棋子的贴图位置(即棋盘、棋子在程序中实际显示位置)的初始化;MemDC.SelectObject(&pOldBmp);//恢复内存Dc的原位图3.对程序辅助部分所用到的一些变量的初始化棋盘、棋子样式的默认形式,下棋模式的默认选择,以及着法名称列表的初始化等。初始化部分的代码如下:BOOLCChessDlg::OnInitDialog(){CDialog::OnInitDialog();//AddAbout...menuitemtosystemmenu.//IDM_ABOUTBOXmustbeinthesystemcommandrange.ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){CStringstrAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu-AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}SetIcon(m_hIcon,TRUE);//SetbigiconSetIcon(m_hIcon,FALSE);//Setsmallicon//彩色进度条设置m_progressThink.SetStartColor(RGB(0xFF,0xFF,0x00));//黄色m_progressThink.SetEndColor(RGB(0x00,0x93,0x00));//绿色m_progressThink.SetBkColor(RGB(0xE6,0xE6,0xFA));//淡紫色m_progressThink.SetTextColor(RGB(0,0,255));m_progressThink.ShowPercent(1);m_tooltip.Create(this);m_tooltip.Activate(1);m_Chessman.Create(IDB_CHESSMAN,36,14,RGB(0,255,0));//创建含有棋子图形的ImgList,用于绘制棋子//下面这段代码取棋盘图形的宽,高BITMAPBitMap;m_BoardBmp.LoadBitmap(IDB_CHESSBOARD);m_BoardBmp.GetBitmap(&BitMap);//取BitMap对象m_nBoardWidth=BitMap.bmWidth;//棋盘宽度m_nBoardHeight=BitMap.bmHeight;//棋盘高度m_BoardBmp.DeleteObject();memcpy(m_byChessBoard,InitChessBoard,90);//初始化棋盘memcpy(m_byShowChessBoard,InitChessBoard,90);memcpy(m_byBackupChessBoard,InitChessBoard,90);m_pSE-SetSearchDepth(3);//设定搜索层数为3m_pSE-SetMoveGenerator(m_pMG);//给搜索引擎设定走法产生器m_pSE-SetEveluator(m_pEvel);//给搜索引擎设定估值核心m_pSE-SetUserChessColor(m_nUserChessColor);//设定用户为黑方或红方m_pSE-SetThinkProgress(&m_progressThink);//设定进度条m_MoveChess.nChessID=NOCHESS;//将移动的棋子清空returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}5.2局面设计游戏设计中,我们的象棋棋盘采用的是直接加载位图生成棋盘,图片的大小是宽度377*高度417,棋盘上每个格子的大小:39*39,图片格式为:BMP。棋子部分是通过加载位图实现的,图片的大小是:宽度32*高度32,图片的格式也是BMP。我们用一个10*9的数组来存储棋盘上的信息,数组的每个元素存储棋盘上是否有棋子。棋盘的初始情形如下所示(图1是整个棋盘与棋子的局面图):constBYTEInitChessBoard[10][9]={{B_CAR,B_HORSE,B_ELEPHANT,B_BISHOP,B_KING,B_BISHOP,B_ELEPHANT,B_HORSE,B_CAR},{NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS},{NOCHESS,B_CANON,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,B_CANON,NOCHESS},{B_PAWN,NOCHESS,B_PAWN,NOCHESS,B_PAWN,NOCHESS,B_PAWN,NOCHESS,B_PAWN},{NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS},//楚河//汉界{NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS},{R_PAWN,NOCHESS,R_PAWN,NOCHESS,R_PAWN,NOCHESS,R_PAWN,NOCHESS,R_PAWN},{NOCHESS,R_CANON,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,R_CANON,NOCHESS},{NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS,NOCHESS},{R_CAR,R_HORSE,R_ELEPHANT,R_BISHOP,R_KING,R_BISHOP,R_ELEPHANT,R_HORSE,R_CAR}};图1局面设计图棋子的定义:#defineNOCHESS0//没有棋子#defineB_KING1//黑帅#defineB_CAR2//黑车#defineB_HORSE3//黑马#defineB_CANON4//黑炮#defineB_
本文标题:中国象棋游戏开发设计报告
链接地址:https://www.777doc.com/doc-7219411 .html