注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我有一片天

和夏花一起绚烂

 
 
 

日志

 
 

【分享】Matlab仿真贪吃蛇  

2011-05-12 12:24:22|  分类: 分享帖 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
转前说明:
此篇文章来自http://longer.spaces.eepw.com.cn/articles/trackback/item/48622, 还没时间来验证是否可以运行,运行过的朋友给我留言哦~


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)程序虽然很长,但是动画效果看起来很单调,有待进一步思考,丰富动画的内容。
  评论这张
 
阅读(746)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018