logo资料库

matlab编程(五子棋).doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
function five() M文件的一种类型,以function开启的函数文件,另一种是把一系列命 令结合在一起的一般M文件 figure(1) axis([0 12 0 12]); 创建一个新的图形对象 坐标轴范围控制命令,axis([xmin xmax ymin ymax])用于设 置图表各坐标轴的刻度范围 图形保持功能,当前坐标轴和图形都将保持,此后绘制的图形都将添加在这个图形 之上,并且自动调整坐标轴的范围 取消坐标轴背景,在运行的图中不显示坐标 a:b:c第一个为起始值,第二个为增量(增量为1,冒号省略),第三个为 结束值 line([1 11],[i i]); line([i i],[1 11]); 画网格line([1,2],[3,4])将画出(1,3)到(2,4)的一条直 线 hold on axis off for i = 1:11 横纵坐标使用相同的刻度(使每一个格子成为正方形) 判断棋手的颜色,开始的时候是红色,取0时是黑色 棋盘状态gt矩阵,取0为空,取1为黑,取2为红zeros(10) 将画出10*10的零阵,代表棋盘上的100个位置 end axis equal qishou = 1; boardstatus = zeros(10); while 1 hold on posflag = 1; while posflag 用于判断下的棋是否有效,取1说明下的棋无效,要重新下 [xpos,ypos] = ginput(1); 能从当前的坐标中读取n个点并返回这n个点的x,y 坐标,均为n x1向量,程序运行时,在界面鼠标会 以一个十字线移动,便是ginput(x)的功能 xpos = 0.5*(floor(xpos)+ceil(xpos)); ypos = 0.5*(floor(ypos)+ceil(ypos)); x,y为圆心,floor(x)地板函数, 即舍去正小数至最近整数 ceil(x)天花板函数,即加入正 小数至最近整数,例如x=9.5, floo(x)=9,ceil(x)=10 点到棋盘外了,回到上 面的循环 if xpos<=0.5||xpos>=11||ypos<=0.5||ypos>=11 end if qishou==1 drawthego(xpos,ypos,qishou); boardstatus(rx,ry)=1; qishou = 0; drawthego(xpos,ypos,qishou); boardstatus(rx,ry)=2; 轮到黑棋下 else 此空为红棋 此空位黑棋 continue end for n=1:10 continue if xpos==n||ypos==n 判断棋子是否下到边界,若在边线上,判断无效,继续 end rx = floor(xpos); ry = floor(ypos); if boardstatus(rx,ry)==1||boardstatus(rx,ry)==2 continue; end posflag = 0; 回到上面的循环 跳出循环 boardstatus是10*10零阵从1*1开始,所以用floor函数 该位置已经有棋子
qishou = 1; 轮到红棋下 end if iswin(boardstatus,rx,ry)==1 if qishou==1 else end winmsg = '黑棋连成了五颗,黑棋胜!'; winmsg = '红棋连成了五颗,红棋胜!'; if iswin(boardstatus,rx,ry)==2 winmsg = '和棋'; msgbox(winmsg) msgbox(Message) 创建一个对话框,根据figure窗体大小 自动将Message换行。Message可以是一个字符串向量、字符 串矩阵或者元胞数组,弹出赢家是红方或黑方的或和棋的对话 框 坐标轴范围控制命令,axis([xmin xmax ymin ymax])用 于设置图表各坐标轴的刻度范围 横纵坐标使用相同的刻度(使每个格子是正方形) return end axis([0 12 0 12]); axis equal end figure(1) axis([0 10 0 10]); 创建一个新的图形对象 坐标轴范围控制命令,axis([xmin xmax ymin ymax])用于设 置图表各坐标轴的刻度范围 axis equal 横纵坐标使用相同的刻度(使每个格子为正方形)【上三行为无效语句在程序 中无作用】 function drawthego(x,y,flag) 在(x,y)处画一个棋子 flag取1时画红棋 flag取0 时画黑棋 画最外面一层的圆周,x,y是圆心0.5为半径,其中增量只要足够 小就行不必非取pi/100,若想要画到格子的点上,只需将圆心移到 格点坐标 t = 0:pi/100:2*pi; rx = x+0.5*cos(t); ry = y+0.5*sin(t); if flag==1 fill(rx,ry,'r'); fill(rx,ry,'k'); else end function w = iswin(board,x,y) w = 0; if isempty(find(board)==0) w=2; return; end 修改如下:在刚下棋的后面判断 flag = board(x,y); sum=0; for i=1:10 for j=1:10 刚下的棋 fill([x1,x2,x3,x4],[y1,y2,y3,y4],'k') [x1,x2,x3,x4],[y1,y2,y3,y4]区域内的颜色填充为黑色, 'k'表示黑色r是红色,flag取1画红色,flag取0画黑色 判断是否赢棋 棋盘上下满棋了,判为和棋,find(A)计算一个数组, 它包含数组A中非零元素的索引【此if循环判断和棋有 误,find(A)函数返回的是行列向量】,应该统计棋子 个数,若为棋盘的最大容量就和棋
if boardstatus(i,j)==1||boardstatus(i,j)==2 该位置已经有棋子 sum=sum+1; 统计连在一起的棋的个数 统计从此子开始,横向到右边界的同色个数 if board(i,y)~=flag 判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就 跳出循环 end for i = x-1:-1:1 if board(i,y)~=flag 统计从此子开始,横向到左边界的同色个数 判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就 跳出循环 if sum==100 w=2; return; k = 0; for i = x:10 break end k = k+1; end if k>=5 w=1; return break; end k = k+1; end if k>=5 w=1; return end k = 0; for i = y:10 break; end k = k+1; end if k>=5 w=1; return break; end k = k+1; end if k>=5 w=1; return end k = 0; for i = 0:10 if x+i>10 统计从此子开始,纵向到上边界的同色个数 if board(x,i)~=flag 判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就 跳出循环 end for i = y-1:-1:1 if board(x,i)~=flag 统计从此子开始,纵向到下边界的同色个数 判断在此过程中,棋子与刚下的棋的颜色是否一样,不一样就 跳出循环 统计主对角线,斜向上同色子的个数
break end if y+i>10 break; end if board(x+i,y+i)~=flag break; end k = k+1; end if k>=5 w=1; return end for i = 1:10 if x-i<0 break; end if y-i<0 break; end if board(x-i,y-i)~=flag 统计主对角线,斜向下同色子的个数 判断在此过程中,棋子与刚下的棋的颜色是否一样,不 一样就跳出循环 判断在此过程中,棋子与刚下的棋的颜色是否一样,不 一样就跳出循环 break; end k = k+1; end if k>=5 w=1; return end break; end k = k+1; end if k>=5 w=1; return end for i = 1:10 if x+i>10 break; end 统计副对角线,斜向上同色子的个数 k = 0; for i = 0:10 if x-i<0 break; end if y+i>10 break; end if board(x-i,y+i)~=flag 判断在此过程中,棋子与刚下的棋的颜色是否一样,不 一样就跳出循环 统计副对角线,斜向下同色子的个数
if y-i<0 break; end if board(x+i,y-i)~=flag break; end k = k+1; end if k>=5 w=1; return end 判断在此过程中,棋子与刚下的棋的颜色是否一样,不 一样就跳出循环
分享到:
收藏