中国智能象棋实验报告C#程序Word格式文档下载.docx
《中国智能象棋实验报告C#程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《中国智能象棋实验报告C#程序Word格式文档下载.docx(8页珍藏版)》请在冰点文库上搜索。
intindex=this.CountIndex(point);
if(index>
=0&
&
index<
45)
return"
up"
;
else
{if(index>
=45&
90)
return"
down"
二、class2继承于class1,也是一个自定义类,记录了旗盘位置特点类,规定了各个旗子的走法。
没有考虑所有情况,而只考虑了真的情况;
能够避免作蔽,程序规定必须按每个旗子的走法走旗。
旗子判断步伐时,为了提高执行效率,只判断旗子可以走的情况。
自己周围的规则点是不是在旗盘上;
如果周围的规则点在旗盘上,则该点是否是自己的旗子,如果是,则不允许走。
首先判断各个棋的走法是否合理之前,都要先判断这个棋子能不能走。
既先求标志起点信息的一维数组的索引,再求标志终点信息的一维数组的索引,如果起点和终点是同一个点,则允许放回旗子,重新选其它路,如果起点和终点是同一边的旗子,则不能走
(一)、判断马的走法是否合理,
除去以上几种情况,其余终点都不能落旗
1、当马向上跳时有两种跳法(左上日和右上日),起点上面没有旗子,也就是不"
挡马腿"
时可以往上走旗:
if(this.GetNextPoint(fromPoint,-2,1)==toPoint||this.GetNextPoint(fromPoint,-2,-1)==toPoint)
if(this.have[this.CountIndex(this.GetNextPoint(fromPoint,-1,0))]==false)
2、同上,只是变为向下跳马,不"
时可以往下走:
this.GetNextPoint(fromPoint,2,1)
this.GetNextPoint(fromPoint,2,-1)
this.CountIndex(this.GetNextPoint(fromPoint,1,0))]==false)
3、同上,只是变为向右跳马,不"
时可以往右走:
this.GetNextPoint(fromPoint,1,2)
this.GetNextPoint(fromPoint,-1,2)
this.CountIndex(this.GetNextPoint(fromPoint,0,1))]==false)
4、同上,只是变为向左跳马
this.GetNextPoint(fromPoint,-1,-2)
this.GetNextPoint(fromPoint,1,-2)==toPoint)
(二)、断兵/卒的走法是否合理
要先判断起点是在旗盘上方,还是下方,终点是在旗盘上方,还是下方。
假如起始点是蓝兵,起点和终点都在下面或起点在下面终点在上面时this.GetNextPoint(fromPoint,-1,0),如果终点是起点的上面一个点,则返回真
如果起点和终点都在上面时有以下几种情况:
过河后可以往上走:
this.GetNextPoint(fromPoint,-1,0)
过河后可以往右走:
(this.GetNextPoint(fromPoint,0,1)
过河后可以往左走:
this.GetNextPoint(fromPoint,0,-1)
假如起始点是红兵,规则同上蓝兵,不过是过河后往下走时是this.GetNextPoint(fromPoint,1,0)
(三)、判断車的走法是否合理
1、起点和终点在同一条垂直直线上,
起点在终点下面,判断起点终点之间有无旗子:
for(inti=-1;
this.GetNextPoint(fromPoint,i,0)!
=toPoint;
i--)
起点在终点上面,判断起点终点之间有无旗子:
for(inti=1;
i++)
2、起点和终点在同一条水平直线上
起点在终点左边判断起点终点之间有无旗子:
for(intj=1;
this.GetNextPoint(fromPoint,0,j)!
j++)
起点在终点右边
(四)、判断炮的走法是否合理
1、起点和终点在同一垂直线上
起点在终点下面,先判断起点终点之间旗子数量,如果起点和终点之间的旗子数大于1,则不能落旗;
起点和终点之间无旗子,且终点也无旗子,则可以在终点落旗;
起点和终点之间仅有一个旗而且终点有旗子且是对方的旗子,炮就可以吃掉对方的棋子。
if(number_QiZi>
1)
还有起点在终点下面、起点在终点右边、起点在终点左边这三种情况,编程方法同上。
(五)、判断象的走法是否合理
如果起点和终点所在边不相同,如一个在河上,一个在河下,则不能落旗,即各边的象不能过河.象的四种走法:
当象向右下方跳时右下田,起点右下一个点上没有旗子,也就是不挡象腿时可以往上走旗:
if(this.GetNextPoint(fromPoint,2,2)==toPoint)
this.GetNextPoint(fromPoint,1,1))]==false
左下田:
(fromPoint,2,-2)fromPoint,1,-1))]==false
右上田:
(fromPoint,-2,2)(fromPoint,-1,1))]==false)
左上田:
(fromPoint,-2,-2)(fromPoint,-1,-1))]==false)
(六)、判断士的走法是否合理
如果起点和终点所在边不相同,如一个在河上,一个在河下,则不能落旗,即各边的士不能过河.控制士的活动范围:
if(index!
=3&
index!
=5&
=13&
=21&
=23&
=66)
=68&
=76&
=84&
=86)
returnfalse;
左上方一点跳:
(fromPoint,-1,-1)
左下方一点跳:
fromPoint,1,-1)
(七)判断将/帅的走法是否合理
if(GenEatGen)将与帅相望则可以直接吃掉对方,需要移动棋子来解除将对帅,控制将帅的活动范围:
=4&
=12&
=14&
=22&
=23)if(index!
=66&
=67&
=75&
=76
=77&
=85&
往左方一点走:
this.GetNextPoint(fromPoint,0,-1)==toPoint
往右方一点走:
this.GetNextPoint(fromPoint,0,1)==toPoint
往上方一点走:
this.GetNextPoint(fromPoint,-1,0)==toPoint
往下方一点走:
this.GetNextPoint(fromPoint,1,0)==toPoint
三、Class3类主要是对悔旗操作,较困难的一个类,极具有技巧性;
先用activeIndex起流动指针作用,tailIndex始终指向尾部既是刚走完的最后一步旗的索引。
先初始化各数组和索引,再判断activeIndex和tailIndex的值,根据它们值的大小来将tailIndex变为activeIndex。
(this.activeIndex>
this.tailIndex-1)
this.tailIndex--;
this.activeIndex=this.tailIndex;
(this.activeIndex<
this.tailIndex)
this.activeIndex++
if(this.activeIndex>
this.tailIndex)
this.activeIndex=this.tailIndex;
还要防止一开始就点后退:
if(this.activeIndex<
0)
return0;
if(this.activeIndex>
=this.tailIndex)
this.activeIndex=this.tailIndex-1;
if(this.activeIndex<
=-1)
return0;
四、Class4走完一步旗后,判断是否将军;
走完一步判断是否一方胜利。
功能比较完整。
一方被将军后如能找到自己的棋子来解除将军,则继续下棋;
如果一方不能找到棋子来解除将军,则这方就输棋了。
如果帅将隔河相望,则也算是将军:
if(ShuaiSymmetryJiang())
{shanShuo=true;
GenEatGen=true;
}
红帅被将军:
index=a.GetIndexByPictureIndex(4);
if(index==-1)return;
if(b.have[i]&
b.who[i]=="
blue"
b.AcceptJudge(b.allPoint[i],p,false))
{blueToRed=true;
}
表示蓝方胜:
if(index==-1)
表示红方胜:
index=a.GetIndexByPictureIndex(27);
if(index==-1)
五、Class5增加键盘支持功能,使鼠标和键盘操作互斥。
键盘能够独立完成鼠标独立的功能;
而且对鼠标左右键的互斥性和键盘与鼠标的互斥性支持较好。
定义键盘的上键、下键、左键、右键来控制棋子的上下左右走动。
p1=a.GetNearPoint(currentPoint.X,currentPoint.Y);
p2=a.GetNextPoint(p1,-1,0)
if(p2.X!
=-1)
returnp2;
returna.GetNextPoint(p1,9,0);
六、Class6实现游戏中随时能够设置断点,随时能够读取断点功能。
不但能够恢复断点,而且还能在相应的断点执行退旗等操作,即能回到断点处重新开始游戏。
在本自定义类中序列化Form2中的数组和变量和类;
序列化Form2中pictureBoxStatus数组;
序列化Form2中类Class2a中的变量和数组;
序列化Form2中Class3huiQi中的变量/数组和类实例数组;
序列化Form2中类Class4jiangJun中的变量/数组/类实例还有Class2b的变量/数组;
序列化Form2中类Class5keyBoard中的变量。
反序列化Form2中pictureBoxStatus数组;
反序列化Form2中Class2a中的变量和数组;
反序列化Form2中Class3huiQi中的变量/数组和类实例数组;
反序列化Form2中类Class4jiangJun中的变量/数组/类实例还有Class2b的变量/数组;
反序列化Form2中类Class5keyBoard中的变量。
七、Class8实现电脑自动分析走旗。
可以实现双人模式与单人模式切换,红方可以在任意时刻由电脑下或由人下。
不过就是有点不是很有技巧性。
电脑下棋程序分为防守和进攻。
寻找有没有直接吃掉对方将帅的旗子的旗子,帅被将军,移动自己非帅旗子解除将军或者帅自己走动来解除将军;
要随时看有没有可吃的旗子或者是能够将对方军的棋子:
if(b.who[i]=="
red"
b.who[j]=="
b.AcceptJudge(b.allPoint[i],b.allPoint[j],false))。
防守时避开一方旗子:
b.AcceptJudge(b.allPoint[i],b.allPoint[j],false)&
run);
杀死正踩旗头的旗子:
b.AcceptJudge(b.allPoint[i],
b.allPoint[index],false));
保护被对方旗子踩头的旗子。
八、Class9用于同步或者异步地播放音乐。
用一个swith,case语句来播放各种音效,像开始、后退、下棋、悔棋、将军、吃棋、胜利、移棋等等。
九、Windows应用程序使用图形界面,一般有一个窗口(Form),采用事件驱动方式工作。
自定义类Form1以Form类为基类。
Form类是.Net系统中定义的窗体类,Form类对象具有Windows应用程序窗口的最基本功能,有标题栏、系统菜单、最大化按钮、最小化按钮和关闭按钮、用户区。
Form类对象还是一个容器,在Form窗体中可以放置其它控件,例如菜单控件,工具条控件等等;
System.Application类中的静态方法Run负责完成一个应用程序的初始化,运行,终止等功能,其参数是本程序使用的窗体Form1类对象,Run方法还负责从操作系统接受事件,并把事件送到窗体中响应。
窗体关闭,方法Run退出,Windows应用程序结束。
可以为Form1类定义构造函数,在构造函数中做一些初始化的工作,例如修改Form1标题栏中的标题。
还可以在Form1中定义控件类的对象,这些控件将在Form1的用户区显示出来,换句话讲,在Form1中生成控件对象,也就是把控件放到窗体中。
Form类主要是绘出界面,进行一些简单的初始化操作,panel1_Paint画旗盘,先确定每个方格的宽和高,画一行方格再往下移动动坐标,画下一行方格;
最后移动坐标,画下方旗盘g.DrawRectangle(pen1,startX,startY,width,height);
point[Index]=newPoint(startX,startY);
Index++;
startX+=width;