MATLAB课程设计.docx
《MATLAB课程设计.docx》由会员分享,可在线阅读,更多相关《MATLAB课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
MATLAB课程设计
课程设计〔论文〕
题目:
用MATLAB语言程序开发凑五子棋游戏
专业:
信息与计算科学指导教师:
大海
学生:
艳涛班级-学号:
信计131-30
学生:
黄元福班级-学号:
信计131-26
学生:
辛安班级-学号:
信计131-22
2016年11月
摘要
凑五子棋是一种两人对弈的纯策略型棋类游戏,应用MATLAB语言编写程序可以在计算机上实现二人对弈凑五子棋功能。
二人对弈凑五子棋程序由欢迎界面显示、游戏界面生成、光标移动与落子、判断胜负、悔棋功能、提供音效等子程序构成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。
程序通过棋盘和棋子图像生成、二人移子与落子和判断胜负等功能的实现,在计算机上实现了二人凑五子棋对弈。
第1章:
需求分析
传统凑五子棋的棋具与围棋一样,棋子分为黑白两色,棋盘为18×18,棋子放置于棋盘线交叉点上。
两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不连续的一排者为胜。
因为传统凑五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进展游戏。
1.2凑五子棋需求分析和流程设计
本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏完毕前让自己的棋子五子相连,首先实现五子相连的一方获胜。
程序执行过程中,要求棋盘、棋子时时可见,游戏界面有提示信息轮到何方下棋,人可以通过按键盘按键移动光标,再点击enter键摆放棋子,并且每落一子都有系统声音,创新之处是可以提供悔棋功能。
1.2.1程序需求分析
根据功能需求,将程序分为画面显示、玩家操作、音效提供、胜负判断五个模块,以下分析各模块的需求。
画面显示模块:
程序开始运行时,显示制作者和给出欢迎与退出界面;游戏开始后要求生成18×18的棋盘图像,并在棋盘上方显示欢迎信息“欢迎playour凑五子棋〞,棋盘下方游戏显示应该轮到甲方或者乙方落子,棋盘左右显示双方操作方式,进展过程中,要时显示棋盘上已落下的棋子,甲方为白球,乙方为白圈;分出胜负后,要求给出游戏完毕画面,并且询问用户是否需要继续游戏。
玩家操作模块:
程序开始时,需玩家确定选择“人人对战〞后开始游戏;游戏过程中,两个玩家通过不同的按键移动光标,选择落子;游戏进展过程中,当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。
悔棋提示在棋盘右下方,为按键“b〞。
游戏完毕时,有玩家选择是否开始新游戏。
音效提供模块:
玩家每落一子,系统提供音效一声,增加下棋的趣味性。
胜负判断模块:
实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,棋盘下方弹出该色玩家胜出信息。
根据程序需求分析结果,可以得出程序的总体结构图如图1,程序总体流程图如图2。
凑五子棋
图1凑五子棋总体结构图
Y
图2程序总体流程图
第2章:
概要设计
2.1各类头文件和全局变量
#inmatlablude
#inmatlablude
#inmatlablude
#inmatlablude//使用getmatlabh()函数
intstartmatlabhoimatlabe;//
intwinner;//
intplayer;//
Q[200][200]={0};//Q数组记录旗子
matlabharbutton;//读入键盘输入的指令,如→
2.2画面显示模块
画面显示模块由欢迎界面,游戏棋盘界面,确认是否退出对话框界面,以与感使用界面组成。
画面显示模块函数如下:
voidWelmatlabome()//欢迎界面
voidDraw()//绘画游戏棋盘界面
voidMATLABlean()//去除—→运动的轨迹
voidmenu_matlabhoose(matlabharpress)//选择是否退出游戏对话框
voidPutDown()//显示落子函数
voidgoto_xy(intx,inty)//光标移动函数
画面效果图如图
第3章:
详细设计
3.1玩家操作模块
棋子的移动与落子有键盘上按键控制,本程序选取甲乙双方按键都为W、S、↑、↓、←、→和回车键,“b〞,“ESMATLAB〞,分别代表上移、下移、左移、右移光标和落子,悔棋,退出。
在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。
当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。
悔棋提示在棋盘右下方,为按键“b〞。
甲乙的落子后,程序会为落子处的数组元素赋一个特定值〔玩家甲的棋子赋为1,玩家乙的棋子赋为2〕,用于判定胜负和悔棋。
玩家操作模块主要由以下函数构成:
voidRematlabord()//记录棋子的情况
voidgo_bamatlabk(intx1,inty1)//悔棋函数
voidPlay(matlabharmatlabh)//读取键盘的操作移动光标下棋和悔棋操作
为了提高游戏的趣味性,我们为本游戏提供了简单系统音效。
程序语句很简单printf("\a");//'\a'表示蜂鸣声
3.3胜负判断模块
胜负判断模块是程序的关键,该模块的设计直接关系到程序的运行速率和运行结果的正确与否。
本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有一样颜色的棋子连成五子,如果成立,游戏就完毕,并显示提示信息,否如此继续落子。
以下简析本程序流程:
由获胜条件可以知,通过判断行、列、斜边、反斜边方向上是否有连续的5个子即可得出是否获胜结果。
在游戏开始时,将棋盘初始化,即将棋盘抽象为一个18*18的数组,数组中每个元素数值设为0。
甲方落子时,将数组相应坐标处元素赋值为2;乙方落子时,将数组相应坐标处元素赋值为1。
通过循环扫描棋盘数组,经扫描后,如发现在行、列、斜边、反斜边方向上有五个连续的2,甲方获胜;如发现在行、列、斜边、反斜边方向上有五个连续的1,乙方获胜。
胜负判断模块主要由一个函数构成:
intJudge()//判断胜负函数
第4章:
调试分析
4.1图形模块
1.在图形模块中,因为是第一次使用,所以刚开始时对于棋盘创建的位置把握有些欠缺。
解决方案:
参考书本以与google,找出最适宜的位置坐标。
2.在构建棋子时候,发现MATLAB语言中似乎对颜色的处理有些错误,当棋谱线的颜色为白色时,无法构建黑色棋子,只能画出白色棋子。
解决方案:
用白圈区别于白球,类似白子和黑子。
4.2玩家操作模块
1.在玩家操作模块中,出现的最大问题之一就是棋盘已经有棋子的地方还可以覆盖另一个棋子。
解决方案:
通过在PutDown()函数中添加if条件语句,判定如果所在位置对应的数组值不等于0时,不能落子。
2.另一个问题就是之前提到的,操作定位框的时候会将定位框移到棋盘之外造成溢出。
解决方案:
通过if语句判定,如果操作框超出围如此移动到对应相反位置,例如移动棋盘最上端,假如继续向上移动,如此移动至棋盘最下端对应位置。
3.还有一个就是悔棋模块中,通过将现有棋子覆盖与棋盘底色一样的颜色来覆盖后,棋谱线条局部也会被覆盖。
解决方案:
在go_bamatlabk();即悔棋函数。
用棋谱线来覆盖棋子〔例如:
┌└├等〕。
4.3胜负判断模块
1.在胜负判断中一直没能想到好的方法来数据化判断哪方玩家获得胜利。
解决方案:
通过参考书籍并加以优化,得出将棋谱做成数组,定义甲方落下为1,乙方落下为2,初始为0,这样即不会造成冲突,也很好的解决了判断问题。
2.另一个问题在于一直不能优化代码做到不每次都扫描整个棋盘来判断胜负。
解决方案:
至今尚未解决,尝试过局部扫描,但失败了。
第5章:
用户手册
1.进入演示程序后,即显示欢迎界面,几秒后,按任何键进入菜单界面,再选择人人对战可以进入主界面开始游戏或者选择退出键。
2.棋子的移动与落子有键盘上按键控制,本程序选取甲乙方都为↑、↓、←、→和回车键,分别代表上移、下移、左移、右移光标和落子。
在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。
3.在当前玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。
当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。
悔棋提示在棋盘右下方,为按键“b〞〔即bamatlabkspamatlabe〕。
4.游戏中Esmatlab键可以直接退出游戏。
5.游戏过程中,如果玩家1或者玩家2有一方获得胜利后,程序自动将提示哪一方获得了胜利,并可以选择是否继续新游戏。
6.游戏完毕且玩家选择不再继续后,显示使用界面,再按任意键退出游戏。
第6章:
小组分工
组长:
艳涛
组员:
黄元福,辛安
具体分工:
组员
任务分工
艳涛
报告书写程序调试展示成果
黄元福
胜负判断设计主函数设计
辛安
界面制作程序调试
第7章:
结论与心得
通过对各子程序的设计与优化,本程序完成了凑五子棋软件的主体的设计与制作,根本达到了使用凑五子棋软件的核心要求。
然而程序还有一些不足之处,首先,程序的界面过于简陋,其次,判断胜后没有显示连成一线的棋子是哪些,用户使用不便。
最后就是程序法实现人机对战,缺乏可玩性。
第8章:
源程序代码
//凑五子棋小游戏
function[]=five()
globalahm1n1m2n2th1h2h3colorscorehschass
hf=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.11000.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',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','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,'buttondownf',select2)
initialize
functioninitialize()
globalahm1n1m2n2th1h2h3colorscorehscss
a=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:
5
h(k(p))=line(x(p),y(p),'marker','o','markersize',24,...
'markerfacecolor',color(t(p),:
),'markeredgecolor','none',...
'buttondownf',select1);
end
t=ceil(rand(1,3)*7);
set(h1,'facecolor',color(t
(1),:
))
set(h2,'facecolor',color(t
(2),:
))
set(h3,'facecolor',color(t(3),:
))
function[k]=rs(s,n);
form=1:
n
t=ceil(rand*length(s));
k(m)=s(t);
s(t)=[];
end
functionselect1(src,eventdata)
globalahm1n1
n1=ceil(get(src,'xdata'));
m1=ceil(9-get(src,'ydata'));
set(h(~isnan(h)),'markeredgecolor','none')
set(src,'markeredgecolor','w')
functionselect2(src,eventdata)
globalahm1n1m2n2th1h2h3colorscorehschass
ifisempty(m1)||isempty(n1)
return
end
cp=get(src,'currentpoint');
n2=ceil(cp(1,1));
m2=ceil(9-cp(1,2));
ifa(m2,n2)
return
end
b=~a;
b(m1,n1)=1;
b=bwlabel(b,4);
ifb(m1,n1)~=b(m2,n2)
return
end
a(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-m2,'markeredgecolor','none')
m1=[];
n1=[];
judgement;
ifsum(sum(~a))<3
hgo=text(1,4.5,'GameOver','fontsize',36,'fontweight',...
'bold','parent',src);
pause(3)
delete(hgo);
delete(h(~isnan(h)))
set(hsc,'string','0')
initialize;
return
end
if~ss
new;
end
functionjudgement
globalahm1n1m2n2th1h2h3colorscorehschass
b=logical(zeros(9,9));
ss=0;
left=0;
right=0;
up=0;
down=0;
lu=0;
rd=0;
ld=0;
ru=0;
whilen2-left-1>0&&a(m2,n2-left-1)==a(m2,n2)
left=left+1;
end
whilen2+right+1<10&&a(m2,n2+right+1)==a(m2,n2)
right=right+1;
end
whilem2-up-1>0&&a(m2-up-1,n2)==a(m2,n2)
up=up+1;
end
whilem2+down+1<10&&a(m2+down+1,n2)==a(m2,n2)
down=down+1;
end
whilen2-lu-1>0&&m2-lu-1>0&&a(m2-lu-1,n2-lu-1)==a(m2,n2)
lu=lu+1;
end
whilen2+rd+1<10&&m2+rd+1<10&&a(m2+rd+1,n2+rd+1)==a(m2,n2)
rd=rd+1;
end
whilen2-ld-1>0&&m2+ld+1<10&&a(m2+ld+1,n2-ld-1)==a(m2,n2)
ld=ld+1;
end
whilen2+ru+1<10&&m2-ru-1>0&&a(m2-ru-1,n2+ru+1)==a(m2,n2)
ru=ru+1;
end
ifleft+right+1>=5
b(m2,n2-left:
n2+right)=1;
end
ifup+down+1>=5
b(m2-up:
m2+down,n2)=1;
end
iflu+rd+1>=5
ind=sub2ind([9,9],m2-lu:
m2+rd,n2-lu:
n2+rd);
b(ind)=1;
end
ifld+ru+1>=5
ind=sub2ind([9,9],m2+ld:
-1:
m2-ru,n2-ld:
n2+ru);
b(ind)=1;
end
ifsum(sum(b))
a(b)=0;
delete(h(b));
h(b)=NaN;
score=score+sum(sum(b));
set(hsc,'string',num2str(score))
ss=1;
end
functionnew
globalahm1n1m2n2th1h2h3colorscorehscha
k=rs(find(~a),3);
a(k)=t;
[mt,nt]=ind2sub([9,9],k);
y=9.5-mt;
x=nt-0.5;
forp=1:
3
h(k(p))=line(x(p),y(p),'marker','o','markersize',24,...
'markerfacecolor',color(t(p),:
),'markeredgecolor','none',...
'buttondownf',select1);
end
forp=1:
3
m2=mt(p);
n2=nt(p);
judgement;
end
ifsum(sum(~a))==0
hgo=text(1,4.5,'GameOver','fontsize',36,'fontweight',...
'bold','parent',ha);
pause(3)
delete(hgo);
delete(h(~isnan(h)))
set(hsc,'string','0')
initialize;
return
end
t=ceil(rand(1,3)*7);
set(h1,'facecolor',color(t
(1),:
))
set(h2,'facecolor',color(t
(2),:
))
set(h3,'facecolor',color(t(3),:
))
functionrestart(src,eventdata)
globalahm1n1m2n2th1h2h3colorscorehschass
delete(h(~isnan(h)))
set(hsc,'string','0')
initialize;