中国象棋博弈系统设计分析.docx
- 文档编号:24062036
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:58
- 大小:836.79KB
中国象棋博弈系统设计分析.docx
《中国象棋博弈系统设计分析.docx》由会员分享,可在线阅读,更多相关《中国象棋博弈系统设计分析.docx(58页珍藏版)》请在冰豆网上搜索。
中国象棋博弈系统设计分析
中国象棋对弈系统
XXXX
【摘要】象棋是我们国家特有的一项棋类益智游戏,中国象棋在中国有着三千多年的历史,属于二人对抗性游戏的一种。
由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。
随着科技的不断进步,人们不再局限于现实中在棋盘上双人面对面对弈,象棋的“下法”也在改变。
网络上流传的关于象棋的小游戏自然而然也就多了起来。
从开始的键盘控制走棋到之后的鼠标控制走棋。
人们对这个系统的需求越来越高了,现在人们已经不满足于手动的控制进行游戏了,随着语音识别的出现人们更倾向与语音操作实现走棋了。
语音是现下最先进的操控方式,他可以不通过手动控制就能够实现我们之前手动操作的任务,就如之前说的能简单就简单。
这是我们现下的最终状态了,能少动手就少动手,能不动手就更好的理念之下我们着手了这次的中国象棋游戏编程,我们采用了Microsoft Speech SDK来实现了我们的语音操作功能来实现了最新的走棋功能。
【关键词】中国象棋;语音操控;打谱,悔棋;
1概述
1.1项目背景
总所周知,随着互联网技术迅猛的发展,在各行各业得到了很广泛的应用。
同时,随着时代的进步,产业的发展,生活质量的提高,人们的业余时间在很大方面的空闲了出来,各种各样建立在互联网基础上的游戏也是不断的出现,在人们空余的时间填充他们的生活,网络游戏是一类,但是网络游戏要具备有网络的情况下进行操作,在这种条件受限的情况下,单机游戏的推广更是休闲娱乐一族玩家们的主流,而且贴近生活所设计的单机游戏更是大众的喜爱。
中国象棋这类的游戏第一,贴近生活,从小耳濡目染的游戏,更是深受大众的喜爱,成为许多人在平时闲暇时间娱乐消遣的一款游戏,为了满足广大玩家的需求,扩大中国象棋的应用范围是针对目前社会形式可以进行的一项,所以针对网上象棋这类游戏的开发对于我们作为计算机科学与技术专业的学生,更是我们应该是重点去面对的一项。
1.2系统简介
整个系统采用C#语言编写,之所以使用C#,因为C#在带来对应用程序的快速开发能力的同时,并没有牺牲C与C++程序员所关心的各种特性。
它忠实地继承了C和C++的优点。
里面包括简洁的语法。
精心地面向对象设计、与Web的紧密结合、完整的安全性与错误处理、版本处理技术、灵活性与兼容性等。
在整个系统功能中有最基本的新建一个棋盘,新建棋盘相当于我们对弈时的重新开局,如果中间出现胜负,或者有人中途离场改变对弈对手等等,使用新建棋盘来解决。
系统的走棋是最基本的对弈操作。
系统的悔棋功能实现的是对上一个走棋步骤的访问,使棋盘回到上一个走棋时的状态。
系统的语言识别包括对走棋中间落棋的语音播报等等。
这几个是系统最基本功能的实现。
整个系统运行过程较为流畅,可以实现基本的双方对弈操作。
1.3开发环境
计算机可使用WindowsXP/Windows7/Windows8系统运行,这些系统都是个人电脑上最忌泵具备的系统,针对开发过程中使用的软件所支持的硬件条件,这些是开发系统的必须前提。
编码使用Visualstudio2010软件进行编码,Visualstudio2010是一个很强大的软件,他是集合最基本的所有编程语言为一体的一个软件,使用Visualstudio2010的最大意义在于它的简易操作性,和对错误点的及时提示功能,Visualstudio2010让整个系统在开发的过程中少走了很多弯路,很多问题漏洞都能很快的发现和解决。
使用Panel绘画软件进行棋盘的绘制,Panel绘画软件是一款针对性很强的软件,对于绘画这一块有着相当方便的操作界面,使得整个棋盘的绘制没有花费过多时间。
1.4主要技术
主要使用了堆栈技术,堆栈是一种抽象数据结构,其操作机理是后进先出。
当你把新条目推进堆栈时,已经在堆栈内的任何条目都会压到堆栈的深处。
同样的,把一个条目从堆栈移出则会让堆栈内的其他条目都向堆栈的顶部移动。
只有堆栈最顶端的条目能从堆栈中取出,条目离开堆栈的顺序和它们被推进堆栈的顺序一样。
类的定义,类实际上就是抽象的概念,把某些具有类似或者相同属性的东西归整一起,类的定义包括对系统中各个类型的设置和命名,以及在类定义下对他们功能进行编写。
SpeechSDK的使用,这是一个微软开发的实现语音识别的语音引擎,利用它提供的接口,我们可以用任何语言编写一种语音识别软件或者文字转换声音文件的软件。
1.5小组分工
我们小组主要分工如下:
小组成员XX主要负责走棋,悔棋等功能代码生成这一部分,对于这一部分应该是整个开发系统最困难的一部分,针对每一个步骤的构思,紧密的连接性等等,都要从整体上面进行考虑。
小组成员XX主要负责棋盘的绘制和基本界面的设计,这一块属于系统基本用户界面设计模块,对于整个界面的设计第一个要考虑用户的惯性视觉,怎么样的界面和棋盘会让人觉得贴近生活,而且对于一些细节的东西也要进行考虑设计。
小组成员XX主要负责检验和修改系统和后期的文档整合,检验和修改系统漏洞需要通过在运行测试中发现的问题进行改进,文档的整合,要根据每个组员在整个系统编写过程中的一些想法和重要部分信息进行整
2需求分析
2.1用户分析
2.1.1系统定位
具有语音功能简单的单机象棋小游戏。
2.1.2用户面临的问题
需要一个简单的双人对弈棋局;
需要我们实现悔棋功能和打谱的功能操作;
需要我们实现简单的语音识别操作
2.1.3系统的运行环境
用户需求要在XP、WIN7、WIN8系统上运行。
2.1.4时间约束与资源约束
系统需要在2015年6月22日前完成,需要用C#来完成象棋的简单操作功能。
2.2用户设计流程
2.2.1用户的观察与分析
这是一个中国象棋对弈系统,可以采取人人单机对弈。
需要有棋盘棋子的局面、鼠标响应控制棋子移动、通过语音识别放置棋子。
用户可以根据自己的需要悔棋,用户还可以选择打谱,把对弈双方之前的棋局一步一步还原,还原时可以在将棋局动态显示并使用语音合成将每一步的操作度出来。
2.2.2设计
图.1初步—系统结构图
图.2中国象棋游戏活动图
2.3任务分析
(1)首先我们要绘制出整体的框架布局
(2)开始着手在Panel框体中间把棋盘的绘制写出来,将棋盘绘制出来
(3)在绘制好的棋盘中写入棋子的放置语句,将棋子摆放到绘制好了的棋盘上
(4)实现棋局开始行走后棋局能够按照活动图的流程进行
(5)继而在可以实现基本的走棋功能之后我们能够在原本的基础上实现悔棋功能
(6)利用悔棋功能的功能栈来实现打谱的功能,利用下棋的文字信息来实现语音合成的读谱功能。
图.3中国象棋用例图
图.4中国象棋状态图
图.5中国象棋序列图
图.6中国象棋活动图
3概要设计
3.1界面设计原则
用户界面可以分为命令行界面、图形界面和多通道用户界面三种基本界面。
命令界面:
这是第一人机界面,在我们的中国象棋对弈程序中有选择棋子、复选棋子替换原先选中棋子、重新放置选中棋子、悔棋让棋子回到上一个状态位置。
图形界面:
可以看作是第二人机界面,是基于图形方式的人机界面。
由于引入了图片的话可以大量的减少中国象棋系统中绘制中国象棋棋盘的庞大的代码量,减少程序的代码复杂度。
多通道用户界面:
进一步综合采用了语音、视觉、设备和交互技术,使用户利用多个通道的实现人机交互。
更好的的捕捉到用户的行为方式和动作与想法。
3.2设计模型
图.7中国象棋设置LOTOS图
实现的中国象棋基本功能简化图应当如上述LOTOS图所示,形成一个简单的功能结构模块,在这个简述设计中我们可以看出我们实现的基础功能都有下棋悔棋和打谱三项功能模块。
图.8象棋棋盘设计模型
图.9象棋棋子放置模型
图.10象棋残局模型
3.3.系统描述
我们的中国象棋系统中实现了棋盘和棋子的布局,我们的布局实现操作采用的是命令行界面设计的方式来实现的,通过代码来绘制棋盘,之后在采用循环语句将棋子一一摆放在棋盘上实现棋盘和棋子的布局。
实现了棋盘和棋子的布局之后我们开始着手棋局中棋子的规则的描述,通过定义类定义出七种类型的棋子,每种棋子有着自己的走棋规则,完善了规则之后我们就要考虑棋局的走势了。
中国象棋是双方对弈的一种游戏,一人一步。
所以我们在主界面中加入了规则,这就实现了基本的下棋功能了。
能实现下棋之后就是简单的悔棋,和回放式的打谱功能。
3.4使用的交互技术
在中国象棋系统中我们使用了语音交互技术实现了语音合成功能。
在下棋落子的时候会读出象棋的行走路径。
还使用到了笔交互技术来实现了棋盘和棋子的绘制。
使用循环语句达成利用笔交互技术的使用来绘制基础棋盘。
使用基本交互技术来实现了背景音乐的播放棋子的定位选择以及帮助信息等框架。
。
4详细设计与实现
4.1界面设计:
使用panel控件(绘制棋盘)、menuStrip控件(菜单栏)、axWindowsMediaPlayer(用于播放mp3背景音乐)、time控件(用于记录红黑各方的用时)等。
图.11初始界面设计
4.2棋盘的绘制:
4.2.1竖线的绘制代码:
(利用DrawLine函数绘制棋盘的竖向线以及红黑双方的交叉线,需注意竖线在楚河汉界处有中断)
#region创建绘画对象
#region竖向线
//两边的竖向线
g.DrawLine(p,point.X,point.Y,point.X,point.Y+wei*9);
g.DrawLine(p,point.X+wei*8,point.Y,point.X+wei*8,point.Y+wei*9);
//上半边的竖向线
for(inti=1;i<=7;i++)
{
g.DrawLine(p,point.X+wei*i,point.Y,point.X+wei*i,point.Y+wei*4);
}
//下半边的竖向线
for(inti=1;i<=7;i++)
{
g.DrawLine(p,point.X+wei*i,point.Y+wei*5,point.X+wei*i,point.Y+wei*9);
}
#endregion
//两边的交叉线
g.DrawLine(p,point.X+wei*3,point.Y,point.X+wei*5,point.Y+wei*2);
g.DrawLine(p,point.X+wei*5,point.Y,point.X+wei*3,point.Y+wei*2);
g.DrawLine(p,point.X+wei*3,point.Y+wei*9,point.X+wei*5,point.Y+wei*7);
g.DrawLine(p,point.X+wei*5,point.Y+wei*9,point.X+wei*3,point.X+wei*7);
4.2.2横线的绘制代码:
(利用DrawLine函数绘制棋盘的横向线)
#region创建绘画对象
intwei=50;
Pointpoint=newPoint(25,25);
Graphicsg=this.panel1.CreateGraphics();
Penp=newPen(Color.Black,2);
//横向线
for(inti=0;i<=9;i++)
{
g.DrawLine(p,point.X,point.Y+wei*i,point.X+wei*8,point.Y+wei*i);
}
4.2.3兵处折线的绘制:
(利用DrawLine函数绘制兵处的折线)
#region"兵"的折线
for(inti=Convert.ToInt16(wei*0.1);i { //右上角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*2.7),point.X+i,point.Y+Convert.ToInt16(wei *2.9)); //右下角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*3.1),point.X+i,point.Y+Convert.ToInt16(wei *3.3)); //右上角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*2.9),point.X+i+Convert.ToInt16(wei*0.2), point.Y+Convert.ToInt16(wei*2.9)); //右下角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*3.1),point.X+i+Convert.ToInt16(wei*0.2), point.Y+Convert.ToInt16(wei*3.1)); //右上角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*5.7),point.X+i,point.Y+Convert.ToInt16(wei *5.9)); //右下角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*6.1),point.X+i,point.Y+Convert.ToInt16(wei *6.3)); //右上角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*5.9),point.X+i+Convert.ToInt16(wei*0.2), point.Y+Convert.ToInt16(wei*5.9)); //右下角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*6.1),point.X+i+Convert.ToInt16(wei*0.2), point.Y+Convert.ToInt16(wei*6.1)); } for(inti=Convert.ToInt16(wei*1.9);i { //左上角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*2.7),point.X+i,point.Y+Convert.ToInt16(wei *2.9)); //左下角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*3.1),point.X+i,point.Y+Convert.ToInt16(wei *3.3)); //左上角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*2.9),point.X+i-Convert.ToInt16(wei*0.2), point.Y+Convert.ToInt16(wei*2.9)); //左下角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*3.1),point.X+i-Convert.ToInt16(wei*0.2), point.Y+Convert.ToInt16(wei*3.1)); //左上角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*5.7),point.X+i,point.Y+Convert.ToInt16(wei *5.9)); //左下角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*6.1),point.X+i,point.Y+Convert.ToInt16(wei *6.3)); //左上角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*5.9),point.X+i-Convert.ToInt16(wei*0.2), point.Y+Convert.ToInt16(wei*5.9)); //左下角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*6.1),point.X+i-Convert.ToInt16(wei*0.2), point.Y+Convert.ToInt16(wei*6.1)); } #endregion 4.2.4炮处折线的绘制: (利用DrawLine函数绘制炮处的折线) #region炮的绘制线 for(inti=Convert.ToInt16(wei*1.1);i { //上方右上角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*1.7),point.X+i,point.Y+Convert.ToInt16(wei*1.9)); //上方右上角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*1.9),point.X+i+Convert.ToInt16(wei*0.2),point.Y+Convert.ToInt16(wei*1.9)); ////上方右下角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*2.1),point.X+i,point.Y+Convert.ToInt16(wei*2.3)); //上方右下角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*2.1),point.X+i+Convert.ToInt16(wei*0.2),point.Y+Convert.ToInt16(wei*2.1)); //下方右上角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*6.7),point.X+i,point.Y+Convert.ToInt16(wei*6.9)); //下方右上角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*6.9),point.X+i+Convert.ToInt16(wei*0.2),point.Y+Convert.ToInt16(wei*6.9)); //下方右下角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*7.1),point.X+i,point.Y+Convert.ToInt16(wei*7.3)); //下方右下角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*7.1),point.X+i+Convert.ToInt16(wei*0.2),point.Y+Convert.ToInt16(wei*7.1)); } for(inti=Convert.ToInt16(wei*0.9);i { //上方左上角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*1.7),point.X+i,point.Y+Convert.ToInt16(wei*1.9)); //上方左上角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*1.9),point.X+i-Convert.ToInt16(wei*0.2),point.Y+Convert.ToInt16(wei*1.9)); //上方左下角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*2.1),point.X+i,point.Y+Convert.ToInt16(wei*2.3)); //上方左下角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*2.1),point.X+i-Convert.ToInt16(wei*0.2),point.Y+Convert.ToInt16(wei*2.1)); //下方左下角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*7.1),point.X+i,point.Y+Convert.ToInt16(wei*7.3)); //下方左下角、横线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*7.1),point.X+i-Convert.ToInt16(wei*0.2),point.Y+Convert.ToInt16(wei*7.1)); //下方左上角、纵线 g.DrawLine(p,point.X+i,point.Y+Convert.ToInt16(wei*6.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国象棋 博弈 系统 设计 分析