您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > matlab编程(五子棋)
functionfive()M文件的一种类型,以function开启的函数文件,另一种是把一系列命令结合在一起的一般M文件figure(1)创建一个新的图形对象axis([012012]);坐标轴范围控制命令,axis([xminxmaxyminymax])用于设置图表各坐标轴的刻度范围holdon图形保持功能,当前坐标轴和图形都将保持,此后绘制的图形都将添加在这个图形之上,并且自动调整坐标轴的范围axisoff取消坐标轴背景,在运行的图中不显示坐标fori=1:11a:b:c第一个为起始值,第二个为增量(增量为1,冒号省略),第三个为结束值line([111],[ii]);画网格line([1,2],[3,4])将画出(1,3)到(2,4)的一条直线line([ii],[111]);endaxisequal横纵坐标使用相同的刻度(使每一个格子成为正方形)qishou=1;判断棋手的颜色,开始的时候是红色,取0时是黑色boardstatus=zeros(10);棋盘状态gt矩阵,取0为空,取1为黑,取2为红zeros(10)将画出10*10的零阵,代表棋盘上的100个位置while1holdonposflag=1;用于判断下的棋是否有效,取1说明下的棋无效,要重新下whileposflag[xpos,ypos]=ginput(1);能从当前的坐标中读取n个点并返回这n个点的x,y坐标,均为nx1向量,程序运行时,在界面鼠标会以一个十字线移动,便是ginput(x)的功能xpos=0.5*(floor(xpos)+ceil(xpos));x,y为圆心,floor(x)地板函数,即舍去正小数至最近整数ypos=0.5*(floor(ypos)+ceil(ypos));ceil(x)天花板函数,即加入正小数至最近整数,例如x=9.5,floo(x)=9,ceil(x)=10ifxpos=0.5||xpos=11||ypos=0.5||ypos=11点到棋盘外了,回到上面的循环continueendforn=1:10判断棋子是否下到边界,若在边线上,判断无效,继续ifxpos==n||ypos==ncontinueendrx=floor(xpos);boardstatus是10*10零阵从1*1开始,所以用floor函数ry=floor(ypos);ifboardstatus(rx,ry)==1||boardstatus(rx,ry)==2该位置已经有棋子continue;回到上面的循环endposflag=0;跳出循环endifqishou==1drawthego(xpos,ypos,qishou);boardstatus(rx,ry)=1;此空为红棋qishou=0;轮到黑棋下elsedrawthego(xpos,ypos,qishou);boardstatus(rx,ry)=2;此空位黑棋qishou=1;轮到红棋下endifiswin(boardstatus,rx,ry)==1ifqishou==1winmsg='黑棋连成了五颗,黑棋胜!';elsewinmsg='红棋连成了五颗,红棋胜!';endifiswin(boardstatus,rx,ry)==2winmsg='和棋';msgbox(winmsg)msgbox(Message)创建一个对话框,根据figure窗体大小自动将Message换行。Message可以是一个字符串向量、字符串矩阵或者元胞数组,弹出赢家是红方或黑方的或和棋的对话框returnendaxis([012012]);坐标轴范围控制命令,axis([xminxmaxyminymax])用于设置图表各坐标轴的刻度范围axisequal横纵坐标使用相同的刻度(使每个格子是正方形)endfigure(1)创建一个新的图形对象axis([010010]);坐标轴范围控制命令,axis([xminxmaxyminymax])用于设置图表各坐标轴的刻度范围axisequal横纵坐标使用相同的刻度(使每个格子为正方形)【上三行为无效语句在程序中无作用】functiondrawthego(x,y,flag)在(x,y)处画一个棋子flag取1时画红棋flag取0时画黑棋t=0:pi/100:2*pi;画最外面一层的圆周,x,y是圆心0.5为半径,其中增量只要足够小就行不必非取pi/100,若想要画到格子的点上,只需将圆心移到格点坐标rx=x+0.5*cos(t);ry=y+0.5*sin(t);ifflag==1fill(rx,ry,'r');fill([x1,x2,x3,x4],[y1,y2,y3,y4],'k')[x1,x2,x3,x4],[y1,y2,y3,y4]区域内的颜色填充为黑色,'k'表示黑色r是红色,flag取1画红色,flag取0画黑色elsefill(rx,ry,'k');endfunctionw=iswin(board,x,y)判断是否赢棋w=0;ifisempty(find(board)==0)棋盘上下满棋了,判为和棋,find(A)计算一个数组,它包含数组A中非零元素的索引【此if循环判断和棋有误,find(A)函数返回的是行列向量】,应该统计棋子个数,若为棋盘的最大容量就和棋w=2;return;end修改如下:在刚下棋的后面判断flag=board(x,y);刚下的棋sum=0;fori=1:10forj=1:10ifboardstatus(i,j)==1||boardstatus(i,j)==2该位置已经有棋子sum=sum+1;ifsum==100w=2;return;k=0;统计连在一起的棋的个数fori=x:10统计从此子开始,横向到右边界的同色个数ifboard(i,y)~=flag判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就跳出循环breakendk=k+1;endifk=5w=1;returnendfori=x-1:-1:1统计从此子开始,横向到左边界的同色个数ifboard(i,y)~=flag判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就跳出循环break;endk=k+1;endifk=5w=1;returnendk=0;fori=y:10统计从此子开始,纵向到上边界的同色个数ifboard(x,i)~=flag判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就跳出循环break;endk=k+1;endifk=5w=1;returnendfori=y-1:-1:1统计从此子开始,纵向到下边界的同色个数ifboard(x,i)~=flag判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就跳出循环break;endk=k+1;endifk=5w=1;returnendk=0;统计主对角线,斜向上同色子的个数fori=0:10ifx+i10breakendify+i10break;endifboard(x+i,y+i)~=flag判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就跳出循环break;endk=k+1;endifk=5w=1;returnendfori=1:10统计主对角线,斜向下同色子的个数ifx-i0break;endify-i0break;endifboard(x-i,y-i)~=flag判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就跳出循环break;endk=k+1;endifk=5w=1;returnendk=0;统计副对角线,斜向上同色子的个数fori=0:10ifx-i0break;endify+i10break;endifboard(x-i,y+i)~=flag判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就跳出循环break;endk=k+1;endifk=5w=1;returnendfori=1:10统计副对角线,斜向下同色子的个数ifx+i10break;endify-i0break;endifboard(x+i,y-i)~=flag判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就跳出循环break;endk=k+1;endifk=5w=1;returnend
本文标题:matlab编程(五子棋)
链接地址:https://www.777doc.com/doc-7110202 .html