"); //-->
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)程序虽然很长,但是动画效果看起来很单调,有待进一步思考,丰富动画的内容。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。