新闻  |   论坛  |   博客  |   在线研讨会
MATLAB仿真“贪吃的小蛇”
0750long | 2009-05-08 19:01:41    阅读:2933   发布文章

MATLAB仿真“贪吃的小蛇”

  snake.m
  snake_set;
  snake_run;
  snake_run.m
  %设计贪吃蛇的运动路线
  D=1;
  while w<1;
  app=get(gcf,'CurrentKey');
  direction;
  filll(T(1,1:end),T(2,1:end),[0.7 0.8 0.9]);
  xv=T(1,1)+real(D);
  yv=T(2,1)+imag(D);
  xv=mod(xv,N);
  yv=mod(yv,N-1);
  pu=[xv;yv];
  qt=T(1,1:end)+T(2,1:end)*i;
  qt=qt-pu(1)-pu(2)*i;
  %设计贪吃蛇游戏“game over”
  if min(abs(qt))<0.2;
  set(hf,'string','Game over')
  set(tx,'string','the snake is already dead')
  break;
  break;
  end
  if xv+yv*i==Z;
  T=[pu,T];
  K=K+1;
  set(hd,'string',num2str(K))
  S=S+1;
  Z=round((N-1)*rand(1))+round((N-2)*rand(1))*i;
  py=T(1,1:end)+T(2,1:end)*i-Z;
  while min(abs(py))<0.2
  Z=round((N-1)*rand(1))+round((N-2)*rand(1))*i;
  py=T(1,1:end)+T(2,1:end)*i-Z;
  end
  filll(real(Z),imag(Z),'y'); %设置食物
  else
  T(:,2:end)=T(:,1:end-1);
  T(:,1)=pu;
  end
  filll(T(1,1:end),T(2,1:end),[0.4 0.3 0.5]);
  if St==0;
  break;
  break;
  end
  pause(Tp);
  end
  chooseTp.m
  if Tp==0.2;
  set(Ht,'string','easy');
  elseif Tp==0.15;
  set(Ht,'string','normal');
  else
  set(Ht,'string','hard');
  end
  direction.m
  switch app
  case 'leftarrow';
  D=-1;
  case 'rightarrow';
  D=1;
  case 'uparrow';
  D=i;
  case 'downarrow';
  D=-i;
  otherwise
  end
  filll.m
  function filll(x,y,C);
  plot(x+0.5,y+0.5,'s','MarkerFaceColor',C,'MarkerEdgeColor',C,'EraseMode','none')
  looks.m
  function [mm,nn]=looks(mt,nt,M,N,Zk);
  mm=mt;nn=nt;m0=mt;n0=nt;
  [mm,nn]=lookssss(mt,nt,M,N,Zk,mm,nn,m0,n0);
  function [mm,nn]=lookssss(mt,nt,M,N,Zk,mm,nn,m0,n0);
  dm=[-1,-1,-1,0,0,1,1,1];
  dn=[-1,0,1,-1,1,-1,0,1];
  mtn=mt+dm;ntn=nt+dn;
  ntn(mtn<0.5|mtn>M+0.5)=[];
  mtn(mtn<0.5|mtn>M+0.5)=[];
  mtn(ntn<0.5|ntn>N+0.5)=[];
  ntn(ntn<0.5|ntn>N+0.5)=[];
  Sn=sub2ind([M,N],mtn,ntn);
  L=abs((mt-m0)+(nt-n0)*i);
  if sum(Zk(Sn))<0.5 & length(Sn)>3;
  mm=[mm,mtn];nn=[nn,ntn];
  for k="1:length"(ntn);
  Lt=abs((mtn(k)-m0)+(ntn-n0)*i);
  if Lt>L;
  [mm,nn]=lookssss(mtn(k),ntn(k),M,N,Zk,mm,nn,m0,n0);
  end
  end
  end
  snake_set.m
  clc
  close all %实验前清空在运行的指令和程序
  w=0;
  St=1;
  K=6;
  S=6;
  Tp=0.2;
  app='rightarrow';
  figure('MenuBar','none'); %在图形窗口不设置菜单栏
  Hq=uimenu(gcf,'label','help'); %在图形窗口制作顶层菜单help下拉菜单栏
  uimenu(Hq,'label','about this game','callback','!about.txt')%在图形窗口的help菜单下创建about this game下拉菜单
  uimenu(Hq,'label','Help for playing','callback','!help.txt;'); %在图形窗口的help菜单下创建Help for playing下拉菜单
  Kh=uimenu(gcf,'label','choose a difficulty'); %在图形窗口制作顶层菜单choose a difficulty顶层菜单项
  uimenu(Kh,'label','easy','callback','Tp=0.2;chooseTp;'); %在图形窗口的choose a difficulty菜单下创建easy下拉菜单
  uimenu(Kh,'label','normal','callback','Tp=0.15;chooseTp;'); %在图形窗口的choose a difficulty菜单下创建normal下拉菜单
  uimenu(Kh,'label','hard','callback','Tp=0.1;chooseTp;'); %在图形窗口的choose a difficulty菜单下创建hard下拉菜单
  set(gcf,'color',[0.7 0.8 0.9]) %设置图形窗口背景颜色
  Ht=uicontrol(gcf,'style','text',...
  'unit','normalized','position',[0.03,0.93,0.12,0.05],...
  'BackgroundColor',[0.7 0.8 0.4],'ForegroundColor','w',...
  'string','easy','fontsize',14); %在图形窗口生创建一个静态文本控件来显示“游戏难易程度“并设置其属性
  hold on %保持当前图形及坐标所有特性
  %用直线把定义的坐标区间划分成1600小区间
  N=40;
  for k="0:N";
  h=line([0,N],[k,k]);
  set(h,'color',[0.1 0.2 0.3])
  h=line([k,k],[0,N-1]);
  set(h,'color',[0.1 0.2 0.3])
  end
  axis square%将每个小区间定义成正方形、
  %---------------------------------------
  set(gca,'Position',[-0.07 0.11 0.775 0.815]) %设置当前轴对象的位置大小
  set(gcf,'Position',[34 177 921 501])%设置整个游戏图像界面的位置和大小
  axis off %关闭所有轴标注,标记
  %设置贪吃蛇的初始位置
  x=2*N/8:3*N/8;
  y=N/2*ones(1,length(x));
  filll(x,y, [0.4 0.3 0.5]);
  %-------------------------------------
  %设置第一个食物的位置
  xc=N*3/10;
  yc=N*6/10;
  Z=xc+yc*i;
  filll(xc,yc, 'y');
  %--------------------------
  T=[x;y];
  T=fliplr(T);
  set(gcf,'KeyPressFcn','app=get(gcf,''CurrentKey'');direction;') %设置蛇的运动方向
  % 在图形窗口生创建一个静态文本控件来显示“移动上下左右键来控制方向“并设置其属性
  uicontrol(gcf,'style','text',...
  'unit','normalized','position',[0.71,0.40,0.3,0.07],...
  'BackgroundColor', [0.4 0.7 0.3],'ForegroundColor','b',...
  'string','移动上下左右键来控制方向',...
  'fontsize',15);
  %------------------------------------------------
  % 在图形窗口生创建一个静态文本控件来显示“cancel “并设置其属性
  uicontrol(gcf,'style','push',...
  'unit','normalized','position',[0.61,0.60,0.07,0.07],...
  'BackgroundColor','r','ForegroundColor','black',...
  'string','取消','callback',...
  'St=0;set(gcf,''Visible'',''off'')','fontsize',14);
  %-------------------------------
  %在图形窗口生创建一个静态文本控件来显示“stop“并设置其属性
  uicontrol(gcf,'style','push',...
  'unit','normalized','position',[0.61,0.50,0.07,0.07],...
  'BackgroundColor','g','ForegroundColor','black',...
  'string','停止','callback','St=0;','fontsize',14);
  %---------------------------------------
  % 在图形窗口生创建一个静态文本控件来显示“Start “并设置其属性
  uicontrol(gcf,'style','push',...
  'unit','normalized','position',[0.61,0.40,0.07,0.07],...
  'BackgroundColor','g','ForegroundColor','black',...
  'string','开始','callback','St=1;snake_run;','fontsize',14);
  %---------------------------------------------
  %在图形窗口生创建一个静态文本控件来显示“over again “并设置其属性
  aaa=uicontrol(gcf,'style','push',...
  'unit','normalized','position',[0.61,0.30,0.10,0.07],...
  'BackgroundColor','g','ForegroundColor','black',...
  'string','重新开始','callback','snake','fontsize',14);
  %-----------------------------------------------
  %在图形窗口生创建一个静态文本控件来显示“state of the snake “并设置其属性
  uicontrol(gcf,'style','edit',...
  'unit','normalized','position',[0.62,0.87,0.17,0.06],...
  'BackgroundColor', [0.4 0.7 0.3],'ForegroundColor','black',...
  'string','贪吃蛇的状态','fontsize',14);
  %----------------------------------------------
  %在图形窗口生创建一个静态文本控件来显示“Walking “并设置其属性
  hf=uicontrol(gcf,'style','edit',...
  'unit','normalized','position',[0.62,0.80,0.17,0.06],...
  'BackgroundColor',[0.7 0.7 0.7],'ForegroundColor','black',...
  'string','运行','fontsize',14)
  %-------------------------------------------------
  %在图形窗口生创建一个静态文本控件来显示“length of the snake “并设置其属性
  uicontrol(gcf,'style','edit',...
  'unit','normalized','position',[0.80,0.87,0.17,0.06],...
  'BackgroundColor',[0.4 0.7 0.3],'ForegroundColor','black',...
  'string',' 贪吃蛇的长度','fontsize',14); %-------------------------------------------------
  %在图形窗口生创建一个静态文本控件来显示“贪吃蛇的长度 “并设置其属性
  hd=uicontrol(gcf,'style','edit',...
  'unit','normalized','position',[0.80,0.80,0.17,0.06],...
  'BackgroundColor', [0.7 0.7 0.7],'ForegroundColor','black',...
  'string',num2str(K),'fontsize',14); %-------------------------------------------------
  %在图形窗口生创建一个静态文本控件来显示“the snake is walking “并设置其属性
  tx=uicontrol(gcf,'style','text',...
  'unit','normalized','position',[0.71,0.70,0.26,0.07],...
  'BackgroundColor', [0.7 0.7 0.7],'ForegroundColor','r',...
  'string','','fontsize',14);
  本程序根据mm手机上的snake游戏改编,欢迎大家调试,并给出改进意见!
  运行snake.m文件就可开始这个游戏了; 点击"cancel"按钮可以退出程序; 点击"Stop"按钮可以使程序暂停;点击"Start"按钮可以开始执行程序;按钮"Up","left","Down","right"可以控制方向;"OVer again"按钮可以重新开始程序;在fig的左上方显示状态蛇的长度。
  一.游戏运行方法
  (1). 该游戏是由7个m文件和2个txt文档组成,将他们放在一个文件夹下,只要运行snake.m,即点开snake.m,在debug运行就进入游戏,该有会自动调用其他6个m文件,
  (2). 用键盘中的方向键控制贪吃蛇的运动方向、
  二.系统总体设计
  (1). 先设计游戏界面,先设计界面的主菜单栏,主菜单有两项是“help”和“choose a diffcult”在“choose a diffcult”有三个子菜单是用来控制贪吃蛇的速度的
  (2). 在图形窗口生创建十一个静态文本控件,来分别显示游戏的运行状态,如贪吃蛇的长度, 游戏难易程度,贪吃蛇的状态,游戏的控制键(包括取消,停止,开始,重新开始)。还要设计贪吃蛇和食物的初始状态。
  三.游戏规则:
  (1)方向键的控制方向与当前蛇的运动方向相反则犯规,游戏结束
  (2)贪吃蛇不能撞到游戏界面的边缘,否则犯规,游戏结束,但是本游戏的缺陷也在此处,无法实现这条规则
  四.系统改进意见
  (1)start控件无法重新开始游戏,有高手请改进一下
  (2)贪吃蛇撞到方格的边缘是应该游戏结束,不应该是穿过,请高手给为当贪吃蛇撞墙身亡;
  (3)程序虽然很长,但是动画效果看起来很单调,有待进一步思考,丰富动画的内容。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客