中国象棋游戏开发设计报告.docx

上传人:b****2 文档编号:1830987 上传时间:2022-10-24 格式:DOCX 页数:20 大小:489.47KB
下载 相关 举报
中国象棋游戏开发设计报告.docx_第1页
第1页 / 共20页
中国象棋游戏开发设计报告.docx_第2页
第2页 / 共20页
中国象棋游戏开发设计报告.docx_第3页
第3页 / 共20页
中国象棋游戏开发设计报告.docx_第4页
第4页 / 共20页
中国象棋游戏开发设计报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

中国象棋游戏开发设计报告.docx

《中国象棋游戏开发设计报告.docx》由会员分享,可在线阅读,更多相关《中国象棋游戏开发设计报告.docx(20页珍藏版)》请在冰豆网上搜索。

中国象棋游戏开发设计报告.docx

中国象棋游戏开发设计报告

中国象棋游戏开发设计报告

Lt

D

中国象棋游戏开发设计报告

 

班级:

小组编号:

小组成员:

指导老师:

一、开发的目的和意义

面向对象程序设计作为一门软件设计的课程,具有极强的实践性,要求学生具备灵活应用理论知识的能力及面向对象程序设计技能的根底。

通过游戏开发,学生能了解C++面向对象的设计方法与技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原那么,培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。

还能够了解并通过使用MFC,掌握一种可视化编程的方法,并通过游戏的开发加深对可视化编程的理解。

同时,可以提高运用C++编程语言解决实际问题的能力。

棋牌游戏属于休闲类游戏,具有上手快、游戏时间短的特点,更利于用户进行放松休闲,为人们所喜爱,特别是棋类游戏,方便、快捷、操作简单,在休闲娱乐中占主要位置。

中国象棋作为中国自古以来的经典棋牌游戏之一,一直都是人之间的较量,将中国象棋制作成游戏,可以实现人与计算机之间的对弈。

而且人工智能是综合性很强的一门边缘学科,它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作。

开发出了计算机象棋游戏,以后不仅仅可以进行休闲游戏,还能锻炼自己的智力和象棋技术,更加方便了人们的日常生活。

二、功能描述和分析〔用户需求分析〕

2.1开发背景

我们周围有许多同学喜欢下象棋,尤其是男同学,希望能有人可以和自己下象棋,但这种意愿常因为受到条件的限制而难以如愿,比方说需要身边刚好有现成的棋盘棋子,比方说需要是同样懂得中国象棋的对手,但是大家都知道我们这所大学男性同学占少数,即便是条件都满足了,还要考虑这位对手是否有何自己下棋的心情。

这时,如果有一台计算机,一个能够支持人机对弈的程序,上面的问题迎刃而解。

而我们小组的这个想起游戏设计,正是希望能够做出一款拥有良好性能,良好的智能,能够满足大多数爱好象棋的同学的需求中国象棋人机对弈程序。

2.2用户需求分析

一款能够与用户对弈,满足用户需求的中国象棋程序,需要有棋盘棋子的局面、鼠标响应控制棋子移动、棋子的走法规那么、人机对弈的搜索算法、防止异常引入的多线程、胜负判断,具体分析如下:

棋盘棋子的局面

作为中国象棋的这项游戏,其必不可少的是就是棋子和棋盘,没有这两个局部,想起功能无法实现,不仅仅如此,如果,仅仅有棋子和棋盘,而没有将两者结合起来,那么,也将无法实现中国象棋的游戏功能,所以,棋子和棋盘的设计在这个游戏设计中至关重要。

鼠标响应

在对弈中,棋子是必须可以移动的,不然游戏无法进行。

因此,鼠标左键点击是必不可少的一局部。

棋子的功能分析:

中国象棋中各色的象棋棋子的功能使象棋具有了真正的趣味性,中国象棋的棋子的类型大致分为:

帅〔将〕、士、象、马、车、炮、兵〔卒〕等几个类型。

帅〔将〕:

红方中的帅和黑方中的将的功能相同,都是只能在九宫格中进行横向和竖向的移动,每次移动一格,并且不能移动超出九宫格,帅和将不能见面。

士:

士在整片棋盘中,和帅的移动范围类似,也是只能在九宫格中移动,不过士的移动方向是对角线,并且每次只能在一个格子中移动。

象:

象的走法遵循“象走田〞的原那么,不能绊象腿。

马:

马的走法遵循“马走日〞的原那么,不能绊马腿。

车:

在整块棋盘中,车可以横向或纵向3移动任意格。

炮:

每次移动和车的类似,但是在吃对方棋子的时候必须中间有且只能有一个棋子的间隔。

兵〔卒〕:

红方的兵和黑方的卒的功能相同,特点是只能向对方前进,而不能后退,过河之前不能横向移动,过河之后可以横向移动,不管是前进还是横向移动,每次都只能移动一格。

良好的人机对弈

要实现人机的对弈,搜索算法是很重要的一局部。

关于棋类对弈程序中的搜索算法,已有成熟的Alpha-Beta搜索算法。

我们在程序中直接借鉴了Alpha-Beta搜索算法并辅以历史启发。

Alpha-Beta搜索算法:

在中国象棋里,双方棋手获得相同的棋盘信息。

他们轮流走棋,目的就是吃掉对方的将或帅,或者防止自己的将或帅被吃。

搜索算法的搜索过程很漫长,因此对搜索算法进行简化是有必要的。

多线程的必要性

由于程序在进行搜索时会占用大量的CPU时间,因而阻塞了位于同一线程内的其他指令,使之无法正常工作,因而引入了多线程的思想另外开一个线程,让各程序分开于多个线程。

就可以解决程序异常的问题了,因此,多线程思想的引入是有必要的。

判断胜负

游戏需要判断最后由谁胜出

三、采用的开发工具和技术,开发环境,适用环境

开发工具:

VisualC++MFC工程;

开发环境:

win7;

适用环境:

windows系统;

四、小组成员分工

初始化、局面设计局部〔贺景〕;

判断胜负、棋子走法局部〔邹京甫〕;

鼠标响应、绘图局部〔吴鑫〕;

搜索引擎局部等由组员共同完成。

五、具体开发方法和过程

5.1初始化局部

OnInitDialog()负责的是对话框的初始化。

可以把有关中国象棋的棋局初始化情况也放在了这里面。

初始化的内容包括:

对引擎局部所用到的变量的初始化。

包括对棋盘上的棋子位置进行初始化〔棋盘数组的初始化〕,对搜索深度、当前走棋方标志、棋局是否结束标志等的初始化;

对棋盘、棋子的贴图位置〔即棋盘、棋子在程序中实际显示位置〕的初始化;

对程序辅助局部所用到的一些变量的初始化。

棋盘、棋子样式的默认形式,以及着法名称列表的初始化等。

1.对棋盘的初始化memcpy(m_byChessBoard,InitChessBoard,90);

2.对棋盘、棋子的贴图位置〔即棋盘、棋子在程序中实际显示位置〕的初始化;MemDC.SelectObject(&pOldBmp);//恢复内存Dc的原位图

3.对程序辅助局部所用到的一些变量的初始化

棋盘、棋子样式的默认形式,下棋模式的默认选择,以及着法名称列表的初始化等。

初始化局部的代码如下:

BOOLCChessDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//Add"About..."menuitemtosystemmenu.

//IDM_ABOUTBOXmustbeinthesystemcommandrange.

ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<0xF000);

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);//Setbigicon

SetIcon(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);//设定搜索层数为3

m_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},

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1