MATLAB课程设计_第1页
MATLAB课程设计_第2页
MATLAB课程设计_第3页
MATLAB课程设计_第4页
MATLAB课程设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计(论文)题目:用.MATLA萤宣程度五发.浚卫壬棋游戏.专业:信.息.与让篡科学.,指导教师:.张公.海学生姓名:谢艳涛班级-学号:信计131-30学生姓名:黄元福班级-学号:信计131-26学生姓名:辛安班级-学号:信计131-222016年11月摘要凑五子棋是一种两人对弈的纯策略型棋类游戏,应用MATLASg言编写程序可以在计算机上实现二人对弈凑五子棋功能。二人对弈凑五子棋程序由欢迎界面显示、游戏界面生成、光标移动与落子、判断胜负、悔棋功能、提供音效等子程序构成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。程序通过棋盘和棋子图像生成、二人移子与落子和判断胜负

2、等功能的实现,在计算机上实现了二人凑五子棋对弈。摘要错误!未定义书签。第1章:需求分析错误!未定义书签。1.1凑五子棋背景11.2凑五子棋需求分析和流程设计1第2章:概要设计42.1各类头文件和全局变量42.2画面显示模块5第3章:详细设计53.1玩家操作模块53.2音效提供模块63.3胜负判断模块6第4章:调试分析74.1图形模块74.2玩家操作模块84.3胜负判断模块8第5章:用户手册9第6章:小组分工10第7章:结论与心得10第8章:源程序代码11第1章:需求分析1.1凑五子棋背景传统凑五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为18X18,棋子放置于棋盘线交叉点上。两人对局,各执一

3、色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。因为传统凑五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。1.2凑五子棋需求分析和流程设计本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让白己的棋子五子相连,首先实现五子相连的一方获胜。程序执行过程中,要求棋盘、棋子时时可见,游戏界面有提示信息轮到何方下棋,人可以通过按键盘按键移动光标,再点击enter键摆放棋子,并且每落一子都有系统声音,创新之处是可以提供悔棋功能。1.2.1程序需求分析根据功能需求,将程序分为圆面显示、玩家操作、音效提供、胜负判断五个模块,以下分析各

4、模块的需求圆面显示模块:程序开始运行时,显示制作者和给出欢迎及退出界面;游戏开始后要求生成18X18的棋盘图像,并在棋盘上方显示欢迎信息“欢迎playour凑五子棋”,棋盘下方游戏显示应该轮到甲方或者乙方落子,棋盘左右显示双方操作方式,进行过程中,要求实时显示棋盘上已落下的棋子,甲方为白球,乙方为白圈;分出胜负后,要求给出游戏结束画面,并且询问用户是否需要继续游戏。玩家操作模块:程序开始时,需玩家确定选择“人人对战”后开始游戏;游戏过程中,两个玩家通过不同的按键移动光标,选择落子;游戏进行过程中,当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。悔棋提示在棋盘右下方,为按键“b”。游戏结束时

5、,有玩家选择是否开始新游戏。音效提供模块:玩家每落一子,系统提供音效一声,增加下棋的趣味性。胜负判断模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,棋盘下方弹出该色玩家胜出信息。根据程序需求分析结果,可以得出程序的总体结构图如图1,程序总体流程图如图2。凑五子棋五子棋游戏模块一:画面显示模块二:玩家操作模块三:首效提供模块四:胜负判断制作者展进入菜单界人人对Ente甲方获图1凑五子棋总体结构图Y.14l乙,悔判Ente退出游确认退显示甲方获胜确认退曰1是jI否I继续新游II_I乙方获显示乙方获胜匚图2程序总体流程图第2章:概要设计2.1各类头文件和全局

6、变H#inmatlablude#inmatlablude#inmatlablude#inmatlablude/使用getmatlabh()函数intstartmatlabhoimatlabe;/intwinner;/intplayer;/读入键盘输入Q200200=0;/Q数组记录旗子matlabharbutton;的指令,如-2.2画面显示模块画面显示模块由欢迎界面,游戏棋盘界面,确认是否退出对话框界面,以及感谢使用界面组成。画面显示模块函数如下:voidWelmatlabome()/欢迎界面voidDraw()/绘画游戏棋盘界面voidMATLABlean()/清除一-运动的轨迹voidm

7、enu_matlabhoose(matlabharpress)/选择是否退出游戏对话框voidPutDown()/显示落子函数voidgoto_xy(intx,inty)/光标移动函数画面效果图如图第3章:详细设计3.1玩家操作模块棋子的移动与落子有键盘上按键控制,本程序选取甲乙双方按键都为W、S、f、(、J、7和回车键,b”,“ESMATLAB分另U代表上移、下移、左移、右移光标和落子,悔棋,退出。在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序白动调用棋子显示子程序和判断胜负子程序。当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。悔棋提示在棋盘右下方,为按键“b”。

8、甲乙的落子后,程序会为落子处的数组元素赋一个特定值(玩家甲的棋子赋为1,玩家乙的棋子赋为2),用于判定胜负和悔棋。玩家操作模块主要由以下函数构成:voidRematlabord()/记录棋子的情况voidgo_bamatlabk(intx1,inty1)悔棋函数voidPlay(matlabharmatlabh)读取键盘的操作移动光标下棋和悔棋操作3.2音效提供模块为了提高游戏的趣味性,我们为本游戏提供了简单系统音效序语句很简单printf(a);/a蜂鸣声3.3胜负判断模块胜负判断模块是程序的关键,该模块的设计直接关系到程序的运行速率和运行结果的正确与否。本函数根据每次落子的位置,分别向上、

9、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息,否则继续落子以下简析本程序流程:,由获胜条件可以知,通过判断行、列、斜边、反斜边方向上是否有连续的5个子即可得出是否获胜结果。在游戏开始时,将棋盘初始化,即将棋盘抽象为一个18*18的数组,数组中每个元素数值设为0。甲方落子时,将数组内相应坐标处元素赋值为2;乙方落子时,将数组内相应坐标处元素赋值为1。通过循环扫描棋盘数组,经扫描后,如发现在行、列、斜边、反斜边方向上有五个连续的2,甲方获胜;如发现在行、列、斜边、反斜边方向上有五个连续的1,乙方获胜。胜负判断模块主要由一个函数构成

10、:intJudge()/判断胜负函数第4章:调试分析4.1图形模块1. 在图形模块中,因为是第一次使用,所以刚开始时对于棋盘创建的位置把握有些欠缺。解决方案:参考书本以及google,找出最合适的位置坐标。2. 在构建棋子时候,发现MATLA晤言中似乎对颜色的处理有些错误,当棋谱线的颜色为白色时,无法构建黑色棋子,只能画出白色棋子。解决方案:用白圈区别于白球,类似白子和黑子。4.2玩家操作模块1. 在玩家操作模块中,出现的最大问题之一就是棋盘已经有棋子的地方还可以覆盖另一个棋子。解决方案:通过在PutDown()函数中添加if条件语句,判定如果所在位置对应的数组值不等于0时,不能落子。2. 另

11、一个问题就是之前提到的,操作定位框的时候会将定位框移到棋盘之外造成溢出。解决方案:通过if语句判定,如果操作框超出范围则移动到对应相反位置,例如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置。3. 还有一个就是悔棋模块中,通过将现有棋子覆盖与棋盘底色相同的颜色来覆盖后,棋谱线条部分也会被覆盖。解决方案:在go_bamatlabk();即悔棋函数。用棋谱线来覆盖棋子(例如:L卜等)。4.3胜负判断模块1. 在胜负判断中一直没能想到好的办法来数据化判断哪方玩家获得胜利解决方案:通过参考书籍并加以优化,得出将棋谱做成数组,定义甲方落下为1,乙方落下为2,初始为0,这样即不会造成冲突,也很

12、好的解决了判断问题。2. 另一个问题在于一直不能优化代码做到不每次都扫描整个棋盘来判断胜负。解决方案:至今尚未解决,尝试过局部扫描,但失败了。第5章:用户手册1. 进入演示程序后,即显示欢迎界面,几秒后,按任何键进入菜单界面,再选择人人对战可以进入主界面开始游戏或者选择退出键。2. 棋子的移动与落子有键盘上按键控制,本程序选取甲乙方都为f7和回车键,分别代表上移、下移、左移、右移光标和落子。在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序白动调用棋子显示子程序和判断胜负子程序。3. 在当前玩家按下落子按键后,程序白动调用棋子显示子程序和判断胜负子程序。当前玩家下棋后,另一位

13、玩家下棋前,当前玩家可以悔棋。悔棋提示在棋盘右下方,为按键“b”(即bamatlabkspamatlabe)。4. 游戏中Esmatlab键可以直接退出游戏。5. 游戏过程中,如果玩家1或者玩家2有一方获得胜利后,程序自动将提示哪一方获得了胜利,并可以选择是否继续新游戏。6. 游戏结束且玩家选择不再继续后,显示谢谢使用界面,再按任意键退出游戏。第6章:小组分工组长:谢艳涛组员:黄元福,辛安具体分工:组员任务分工谢艳涛报告书写程序调试展示成果黄兀福胜负判断设计主函数设计界面制作程序调试第7章:结论与心得通过对各子程序的设计与优化,本程序完成了凑五子棋软件的主体的设计与制作,基本达到了使用凑五子棋

14、软件的核心要求。然而程序还有一些不足之处,首先,程序的界面过于简陋,其次,判断胜后没有显示连成一线的棋子是哪些,用户使用不便。最后就是程序法实现人机对战,缺乏可玩性。第8章:源程序代码/凑五子棋小游戏function=five()globalahmln1m2n2thlh2h3colorscorehschasshf=figure(resize,off,name,five,.position,360280560420,numbertitle,off);ha=axes;set(gcf,menubar,none,color,0.30.30.3)set(gca,position,0.23000.1100

15、0.77500.8150)set(gca,xlim,0,9,ylim,0,9)set(ha,xtick,ytick,box,on)set(ha,color,0.70.6,0.6)set(ha,DataAspectRatio,111,PlotBoxAspectRatio,111)x=repmat(0;9,1,9);y=1:9;1:9;line(x,y,color,k)line(y,x,color,k)hst=uicontrol(style,text,string,Score,fontsize,30,.units,normal,position,0.02,0.55,0.26,0.14,parent

16、,hf,.ForegroundColor,w,backgroundcolor,0.30.30.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,backgroundcolor,0.30.30.3,.fontweight,bold);hbt=uicontrol(style,pushbutton,string,Restart,fontsize,18,.units,normal,

17、position,0.02,0.16,0.26,0.14,parent,hf,.fontweight,bold,callback,restart);color=.110;101;011;100;010;001;0.70.30;h1=annotation(ellipse,0.04,0.84,0.06,0.08,facecolor,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,se

18、lect2)initializefunctioninitialize()globalahm1n1m2n2th1h2h3colorscorehscssa=zeros(9);h=zeros(9)*NaN;m1=;n1=;m2=;n2=;score=0;ss=0;k=rs(1:81,5);t=ceil(rand(1,5)*7);a(k)=t;m,n=ind2sub(9,9,k);y=9.5-m;x=n-0.5;forp=1:5h(k(p)=line(x(p),y(p),marker,o,markersize,24,.markerfacecolor,color(t(p),:),markeredgeco

19、lor,none,.buttondownfcn,select1);endt=ceil(rand(1,3)*7);set(h1,facecolor,color(t(1),:)set(h2,facecolor,color(t(2),:)set(h3,facecolor,color(t(3),:)functionk=rs(s,n);form=1:nt=ceil(rand*length(s);s(t)=;endfunctionselect1(src,eventdata)globalahm1n1n1=ceil(get(src,xdata);m1=ceil(9-get(src,ydata);set(h(i

20、snan(h),markeredgecolor,none)set(src,markeredgecolor,w)functionselect2(src,eventdata)globalahm1n1m2n2th1h2h3colorscorehschassifisempty(m1)|isempty(n1)returnendcp=get(src,currentpoint);n2=ceil(cp(1,1);m2=ceil(9-cp(1,2);ifa(m2,n2)returnendb=a;b(m1,n1)=1;b=bwlabel(b,4);ifb(m1,n1)=b(m2,n2)returnenda(m2,

21、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-m2,markeredgecolor,none)m1=;n1=;judgement;ifsum(sum(a)0&a(m2,n2-left-1)=a(m2,n2)left=left+1;endwhilen2+right+10&a(m2-up-1,n2)=a(m2,n2)up=up+1;endwhilem2+down+10&m2-lu-10&a(m2-lu-1,n2-lu-1)=a(m2,n2)lu=lu+1;endw

22、hilen2+rd+110&m2+rd+10&m2+ld+110&a(m2+ld+1,n2-ld-1)=a(m2,n2)ld=ld+1;endwhilen2+ru+10&a(m2-ru-1,n2+ru+1)=a(m2,n2)ru=ru+1;endifleft+right+1=5b(m2,n2-left:n2+right)=1;endifup+down+1=5b(m2-up:m2+down,n2)=1;endiflu+rd+1=5ind=sub2ind(9,9,m2-lu:m2+rd,n2-lu:n2+rd);b(ind)=1;endifld+ru+1=5ind=sub2ind(9,9,m2+ld:-1:m2-ru,n2-ld:n2+ru);b(ind)=1;endifsum(sum(b)a(b)=0;d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论