1、课 程 设 计(论 文)题目:用MATLAB语言程序开发凑五子棋游戏 专 业: 信息和计算科学 指导老师: 张大海 学生姓名: 谢艳涛 班级-学号: 信计131-30学生姓名: 黄元福 班级-学号: 信计131-26学生姓名: 辛 安 班级-学号: 信计131-22 11月 摘 要凑五子棋是一个两人对弈纯策略型棋类游戏,应用MATLAB语言编写程序能够在计算机上实现二人对弈凑五子棋功效。二人对弈凑五子棋程序由欢迎界面显示、游戏界面生成、光标移动和落子、判定胜败、悔棋功效、提供音效等子程序组成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。程序经过棋盘和棋子图像生成、二人移
2、子和落子和判定胜败等功效实现,在计算机上实现了二人凑五子棋对弈。 目 录摘 要2第1章:需求分析31.1凑五子棋背景31.2 凑五子棋需求分析和步骤设计4第2章:概要设计72.1 各类头文件和全局变量72.2 画面显示模块8第3章:具体设计113.1 玩家操作模块113.2音效提供模块113.3 胜败判定模块12第4章:调试分析134.1 图形模块13 4.2 玩家操作模块134.3 胜败判定模块14第5章:用户手册14第6章:小组分工15第7章:结论和心得16第8章 :源程序代码16第1章:需求分析1.1凑五子棋背景传统凑五子棋棋具和围棋相同,棋子分为黑白两色,棋盘为1818,棋子放置于棋盘
3、线交叉点上。两人对局,各执一色,轮番下一子,先将横、竖或斜线5个或5个以上同色棋子连成不间断一排者为胜。 因为传统凑五子棋在落子后不能移动或拿掉,所以也能够用纸和笔来进行游戏。1.2 凑五子棋需求分析和步骤设计本程序设计为人和人对弈,一方执黑棋,一方执白棋,轮番走棋,每方全部试图在游戏结束前让自己棋子五子相连,首先实现五子相连一方获胜。程序实施过程中,要求棋盘、棋子时时可见,游戏界面有提醒信息轮到何方下棋,人能够经过按键盘按键移动光标,再点击enter键摆放棋子,而且每落一子全部有系统声音,创新之处是能够提供悔棋功效。1.2.1 程序需求分析依据功效需求,将程序分为画面显示、玩家操作、音效提供
4、、胜败判定五个模块,以下分析各模块需求。画面显示模块:程序开始运行时,显示制作者和给出欢迎及退出界面;游戏开始后要求生成1818棋盘图像,并在棋盘上方显示欢迎信息“欢迎play our凑五子棋”,棋盘下方游戏显示应该轮到甲方或乙方落子,棋盘左右显示双方操作方法,进行过程中,要求实时显示棋盘上已落下棋子,甲方为白球,乙方为白圈;分出胜败后,要求给出游戏结束画面,而且问询用户是否需要继续游戏。玩家操作模块:程序开始时,需玩家确定选择“人人对战”后开始游戏;游戏过程中,两个玩家经过不一样按键移动光标,选择落子;游戏进行过程中,目前玩家下棋后,另一位玩家下棋前,目前玩家能够悔棋。悔棋提醒在棋盘右下方,
5、为按键“b”。游戏结束时,有玩家选择是否开始新游戏。 音效提供模块:玩家每落一子,系统提供音效一声,增加下棋趣味性。胜败判定模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线五子,棋盘下方弹出该色玩家胜出信息。1.2.2程序步骤设计 依据程序需求分析结果,能够得出程序总体结构图图1,程序总体步骤图图2。五子棋游戏凑五子棋模块二:玩家操作模块三:音效提供模块四:胜败判定模块一:画面显示 图1 凑五子棋总体结构图开始制作者展示进入菜单界面N人人对战?退出游戏Y是否继续新游戏?开始游戏ESMATLABY确定退出?b悔棋甲方判定NEnter甲方获胜?退出游戏显示甲方获胜
6、消息Y确定退出?N乙方判定ESMATLABb悔棋YEnterN显示乙方获胜消息乙方获胜?YN 图2 程序总体步骤图第2章:概要设计2.1 各类头文件和全局变量#inmatlablude #inmatlablude#inmatlablude #inmatlablude/使用getmatlabh()函数int startmatlabhoimatlabe; /int winner; /int player; /Q200200= 0;/Q数组统计旗子matlabhar button;/读入键盘输入指令,如2.2 画面显示模块画面显示模块由欢迎界面,游戏棋盘界面,确定是否退出对话框界面,和感谢使用界面组
7、成。 画面显示模块函数以下:void Welmatlabome() /欢迎界面void Draw() /绘画游戏棋盘界面void MATLABlean()/清除运动轨迹void menu_matlabhoose(matlabhar press)/选择是否退出游戏对话框void PutDown()/显示落子函数void goto_xy(int x, int y) /光标移动函数 画面效果图图第3章:具体设计3.1 玩家操作模块棋子移动和落子有键盘上按键控制,本程序选择甲乙双方按键全部为W、S、和回车键,“b”,“ESMATLAB”,分别代表上移、下移、左移、右移光标和落子,悔棋,退出。在光标移动
8、过程中,光标根据玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判定胜败子程序。目前玩家下棋后,另一位玩家下棋前,目前玩家能够悔棋。悔棋提醒在棋盘右下方,为按键“b”。甲乙落子后,程序会为落子处数组元素赋一个特定值(玩家甲棋子赋为1,玩家乙棋子赋为2),用于判定胜败和悔棋。玩家操作模块关键由以下函数组成:void Rematlabord() /统计棋子情况void go_bamatlabk(int x1,int y1)/悔棋函数void Play(matlabhar matlabh)/读取键盘操作 移动光标 下棋和悔棋操作3.2音效提供模块为了提升游戏趣味性,我们为本游戏提供了
9、简单系统音效。程序语句很简单 printf(a);/a表示蜂鸣声3.3 胜败判定模块胜败判定模块是程序关键,该模块设计直接关系到程序运行速率和运行结果正确是否。本函数依据每次落子位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判定是否有相同颜色棋子连成五子,假如成立,游戏就结束,并显示提醒信息,不然继续落子。以下简析本程序步骤:,由获胜条件能够知,经过判定行、列、斜边、反斜边方向上是否有连续5个子即可得出是否获胜结果。在游戏开始时,将棋盘初始化,立即棋盘抽象为一个18*18数组,数组中每个元素数值设为0。甲方落子时,将数组内对应坐标处元素赋值为2;乙方落子时,将数组内对应坐标处元素赋
10、值为1。经过循环扫描棋盘数组,经扫描后,如发觉在行、列、斜边、反斜边方向上有五个连续2,甲方获胜;如发觉在行、列、斜边、反斜边方向上有五个连续1,乙方获胜。胜败判定模块关键由一个函数组成:int Judge() /判定胜败函数第4章:调试分析4.1 图形模块1在图形模块中,因为是第一次使用,所以刚开始时对于棋盘创建位置把握有些欠缺。处理方案:参考书本和谷歌,找出最适宜位置坐标。2. 在构建棋子时候,发觉MATLAB语言中似乎对颜色处理有些错误,当棋谱线颜色为白色时,无法构建黑色棋子,只能画出白色棋子。处理方案:用白圈区分于白球,类似白子和黑子。4.2 玩家操作模块1. 在玩家操作模块中,出现最
11、大问题之一就是棋盘已经有棋子地方还能够覆盖另一个棋子。处理方案:经过在PutDown()函数中添加if条件语句,判定假如所在位置对应数组值不等于0时,不能落子。2. 另一个问题就是之前提到,操作定位框时候会将定位框移到棋盘之外造成溢出。处理方案: 经过if语句判定,假如操作框超出范围则移动到对应相反位置,比如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置。3. 还有一个就是悔棋模块中,经过将现有棋子覆盖和棋盘底色相同颜色来覆盖后,棋谱线条部分也会被覆盖。处理方案:在go_bamatlabk();即悔棋函数。用棋谱线来覆盖棋子(比如: 等)。4.3 胜败判定模块1. 在胜败判定中一直
12、没能想到好措施来数据化判定哪方玩家取得胜利。处理方案:经过参考书籍并加以优化,得出将棋谱做成数组,定义甲方落下为1,乙方落下为2,初始为0,这么即不会造成冲突,也很好处理了判定问题。2. 另一个问题在于一直不能优化代码做到不每次全部扫描整个棋盘来判定胜败。处理方案:至今还未处理,尝试过局部扫描,但失败了。第5章:用户手册1.进入演示程序后,即显示欢迎界面,几秒后,按任何键进入菜单界面,再选择人人对战能够进入主界面开始游戏或选择退出键。2.棋子移动和落子有键盘上按键控制,本程序选择甲乙方全部为、和回车键,分别代表上移、下移、左移、右移光标和落子。在光标移动过程中,光标根据玩家按键移动;在玩家按下
13、落子按键后,程序自动调用棋子显示子程序和判定胜败子程序。3. 在目前玩家按下落子按键后,程序自动调用棋子显示子程序和判定胜败子程序。目前玩家下棋后,另一位玩家下棋前,目前玩家能够悔棋。悔棋提醒在棋盘右下方,为按键“b”(即bamatlabkspamatlabe)。4.游戏中Esmatlab键能够直接退出游戏。5.游戏过程中,假如玩家1或玩家2有一方取得胜利后,程序自动将提醒哪一方取得了胜利,并能够选择是否继续新游戏。6.游戏结束且玩家选择不再继续后,显示谢谢使用界面,再按任意键退出游戏。第6章:小组分工组长:谢艳涛组员:黄元福,辛安具体分工:组员任务分工谢艳涛汇报书写 程序调试 展示结果黄元福
14、胜败判定设计 主函数设计辛安界面制作 程序调试第7章:结论和心得 经过对各子程序设计和优化,本程序完成了凑五子棋软件主体设计和制作,基础达成了使用凑五子棋软件关键要求。然而程序还有部分不足之处,首先,程序界面过于简陋,其次,判定胜后没有显示连成一线棋子是哪些,用户使用不便。最终就是程序法实现人机对战,缺乏可玩性。 第8章 :源程序代码 /凑五子棋小游戏 function = five()global a h m1 n1 m2 n2 t h1 h2 h3 color score hsc ha sshf=figure(resize,off,name,five,. position,360 280
15、560 420,numbertitle,off);ha=axes;set(gcf,menubar,none,color,0.3 0.3 0.3)set(gca,position,0.2300 0.1100 0.7750 0.8150)set(gca,xlim,0,9,ylim,0,9)set(ha,xtick,ytick,box,on)set(ha,color,0.7 0.6,0.6)set(ha,DataAspectRatio,1 1 1,PlotBoxAspectRatio,1 1 1)x=repmat(0;9,1,9);y=1:9;1:9;line(x,y,color,k)line(y,
16、x,color,k)hst=uicontrol(style,text,string,Score,fontsize,30,. units,normal,position,0.02,0.55,0.26,0.14,parent,hf,. ForegroundColor,w,backgroundcolor,0.3 0.3 0.3,. fontweight,bold);hsc=uicontrol(style,text,string,0,fontsize,24,. units,normal,position,0.02,0.4,0.26,0.14,parent,hf,. ForegroundColor,w,
17、backgroundcolor,0.3 0.3 0.3,. fontweight,bold);hbt=uicontrol(style,pushbutton,string,Restart,fontsize,18,. units,normal,position,0.02,0.16,0.26,0.14,parent,hf,. fontweight,bold,callback,restart);color=. 1 1 0; 1 0 1; 0 1 1; 1 0 0; 0 1 0; 0 0 1; 0.7 0.3 0; ;h1=annotation(ellipse,0.04,0.84,0.06,0.08,f
18、acecolor,k);h2=annotation(ellipse,0.12,0.84,0.06,0.08,facecolor,k);h3=annotation(ellipse,0.2,0.84,0.06,0.08,facecolor,k);set(ha,buttondownfcn,select2)initializefunction initialize()global a h m1 n1 m2 n2 t h1 h2 h3 color score hsc ssa=zeros(9);h=zeros(9)*NaN;m1=;n1=;m2=;n2=;score=0;ss=0;k=rs(1:81,5)
19、;t=ceil(rand(1,5)*7);a(k)=t;m,n = ind2sub(9,9,k);y=9.5-m;x=n-0.5;for p=1:5 h(k(p)=line(x(p),y(p),marker,o,markersize,24,. markerfacecolor,color(t(p),:),markeredgecolor,none,. buttondownfcn,select1);endt=ceil(rand(1,3)*7);set(h1,facecolor,color(t(1),:)set(h2,facecolor,color(t(2),:)set(h3,facecolor,co
20、lor(t(3),:)function k=rs(s,n);for m=1:n t=ceil(rand*length(s); k(m)=s(t); s(t)=;endfunction select1(src,eventdata)global a h m1 n1n1=ceil(get(src,xdata);m1=ceil(9-get(src,ydata);set(h(isnan(h),markeredgecolor,none)set(src,markeredgecolor,w)function select2(src,eventdata)global a h m1 n1 m2 n2 t h1 h
21、2 h3 color score hsc ha ssif isempty(m1) | isempty(n1) returnendcp=get(src,currentpoint);n2=ceil(cp(1,1);m2=ceil(9-cp(1,2);if a(m2,n2) returnendb=a;b(m1,n1)=1;b=bwlabel(b,4);if b(m1,n1)=b(m2,n2) returnenda(m2,n2)=a(m1,n1);a(m1,n1)=0;h(m2,n2)=h(m1,n1);h(m1,n1)=NaN;set(h(m2,n2),xdata,n2-0.5,ydata,9.5-
22、m2,markeredgecolor,none)m1=;n1=;judgement;if sum(sum(a)0 & a(m2,n2-left-1)=a(m2,n2) left=left+1;endwhile n2+right+10 & a(m2-up-1,n2)=a(m2,n2) up=up+1;endwhile m2+down+10 & m2-lu-10 & a(m2-lu-1,n2-lu-1)=a(m2,n2) lu=lu+1;endwhile n2+rd+110 & m2+rd+10 & m2+ld+110 & a(m2+ld+1,n2-ld-1)=a(m2,n2) ld=ld+1;e
23、ndwhile n2+ru+10 & a(m2-ru-1,n2+ru+1)=a(m2,n2) ru=ru+1;endif left+right+1=5 b(m2,n2-left:n2+right)=1;endif up+down+1=5 b(m2-up:m2+down,n2)=1;endif lu+rd+1=5 ind=sub2ind(9,9,m2-lu:m2+rd,n2-lu:n2+rd); b(ind)=1;endif ld+ru+1=5 ind=sub2ind(9,9,m2+ld:-1:m2-ru,n2-ld:n2+ru); b(ind)=1;endif sum(sum(b) a(b)=
24、0; delete(h(b); h(b)=NaN; score=score+sum(sum(b); set(hsc,string,num2str(score) ss=1;endfunction newglobal a h m1 n1 m2 n2 t h1 h2 h3 color score hsc hak=rs(find(a),3);a(k)=t;mt,nt = ind2sub(9,9,k);y=9.5-mt;x=nt-0.5;for p=1:3 h(k(p)=line(x(p),y(p),marker,o,markersize,24,. markerfacecolor,color(t(p),
25、:),markeredgecolor,none,. buttondownfcn,select1);endfor p=1:3 m2=mt(p); n2=nt(p); judgement;endif sum(sum(a)=0 hgo=text(1,4.5,Game Over,fontsize,36,fontweight,. bold,parent,ha); pause(3) delete(hgo); delete(h(isnan(h) set(hsc,string,0) initialize; returnendt=ceil(rand(1,3)*7);set(h1,facecolor,color(t(1),:)set(h2,facecolor,color(t(2),:)set(h3,facecolor,color(t(3),:)function restart(src,eventdata)global a h m1 n1 m2 n2 t h1 h2 h3 color score hsc ha ssdelete(h(isnan(h)set(hsc,string,0)initialize;