贪吃蛇游戏的说明.docx
《贪吃蛇游戏的说明.docx》由会员分享,可在线阅读,更多相关《贪吃蛇游戏的说明.docx(15页珍藏版)》请在冰点文库上搜索。
贪吃蛇游戏的说明
贪吃蛇游戏说明
一、游戏简介
主要功能:
(1)通过游戏设置的等级设置进入游戏,在游戏过程中可以选择速度快慢程度来选择游戏的难易度。
(2)可以选择有边界阻碍和无边界阻碍的。
界面功能:
(3)游戏的的窗口菜单是自定义的,简单设计了几个菜单项,方便选择开始游戏,离开游戏,速度快慢,有无边界。
(4)在游戏界面的右下方有一个显示当前的得分情况,方便便用户来了解自己的战绩。
操作功能:
其中游戏的主操作键是↓↑→←。
不仅可以通过菜单来进行操作,还可以通过快捷键开操作(crtrl+N---NewGame,ctrl+Q---Exit)
二、实现步骤
1、设置30×40的界面和颜色,设置控制台窗口标题,然后自定义菜单
2、设置一些主要的功能,游戏的开始,离开,难易度和有无墙壁(代码参考)
3、设置蛇和豆子的位置大小和颜色
4、在设置时考虑蛇移动的方向,通过在蛇头没有撞到自身和边界的前提下,判断蛇是否吃到食物,若吃到了食物,则需要将吃到的食物作为蛇头,否则需要在原来蛇头的下一个坐标作为蛇头,而蛇尾需要被去除,同时加分。
三、游戏截图
(无墙壁)
(有墙壁)
四、代码(其中标记的地方是参考的)
functionsnake(cmd)
globalSNAKEWALLLEVELBOARDDIRECTIONRUNNINGFOODBONUSPAUSE
if~nargin
cmd='init';
end
if~(ischar(cmd)||isscalar(cmd))
return;
end
switchcmd
case'init'
scrsz=get(0,'ScreenSize');
f=figure('Name','Snake',...
'Numbertitle','off',...
'Menubar','none',...'Color',[.95.95.95],...
'DoubleBuffer','on',...
'Position',[(scrsz(3)-400)/2(scrsz(4)-300)/2400300],...
'Colormap',[.1.710;.3.4.4;000;110],...
'CloseRequestFcn',sprintf('%s(''Stop'');closereq;',mfilename),...
'KeyPressFcn',sprintf('%s(double(get(gcbf,''Currentcharacter'')))',mfilename));
FileMenu=uimenu(f,'Label','&File');
uimenu(FileMenu,'Label','NewGame','Accelerator','N','Callback',sprintf('%s(''NewGame'')',mfilename));
uimenu(FileMenu,'Label','Exit','Accelerator','Q','Separator','on','Callback',sprintf('%s(''Stop'');closereq',mfilename));
LevelMenu=uimenu(f,'Label','&Level');
uimenu(LevelMenu,'Label','1','Callback',sprintf('%s(''Level'')',mfilename))
uimenu(LevelMenu,'Label','2','Callback',sprintf('%s(''Level'')',mfilename))
uimenu(LevelMenu,'Label','3','Callback',sprintf('%s(''Level'')',mfilename))
uimenu(LevelMenu,'Label','4','Callback',sprintf('%s(''Level'')',mfilename),'checked','on')
uimenu(LevelMenu,'Label','5','Callback',sprintf('%s(''Level'')',mfilename))
WallMenu=uimenu(f,'Label','&Wall');
uimenu(WallMenu,'Label','Nowall','Callback',sprintf('%s(''Wall'')',mfilename),'checked','on')
uimenu(WallMenu,'Label','Wall','Callback',sprintf('%s(''Wall'')',mfilename))
%CreateTheaxes
axes('Units','normalized',...
'Position',[0011],...
'Visible','off',...
'DrawMode','fast',...
'NextPlot','replace');
%Addtheboard
BOARD=image(getTitle,'CDataMapping','scaled');
axisimage
set(gca,...
'XTick',NaN,...
'YTick',NaN)
text(40,30,'0',...
'FontUnits','normalized',...
'FontSize',0.03,...
'FontName','FixedWidth',...
'FontWeight','bold',...
'Color',[111],...
'VerticalAlignment','baseline',...
'HorizontalAlignment','right',...
'Tag','Score');
SNAKE=[14,20;14,19;14,18;14,17;14,16];
WALL=zeros(30,40);
LEVEL=4;
case28%left
ifSNAKE(2,2)~=mod(SNAKE(1,2)-2,40)+1
DIRECTION=cmd;
end
case29%right
ifSNAKE(2,2)~=mod(SNAKE(1,2),40)+1
DIRECTION=cmd;
end
case30%up
ifSNAKE(2,1)~=mod(SNAKE(1,1)-2,30)+1
DIRECTION=cmd;
end
case31%down
ifSNAKE(2,1)~=mod(SNAKE(1,1),30)+1
DIRECTION=cmd;
end
case'Level'%ChangeofLevel
set(get(get(gcbo,'Parent'),'Children'),'checked','off')
set(gcbo,'checked','on')
LEVEL=length(get(gcbo,'Label'));
case'Wall'%ChangeofWall
set(get(get(gcbo,'Parent'),'Children'),'checked','off')
set(gcbo,'checked','on')
WALL=zeros(30,40);
switchget(gcbo,'Label')
case'Nowall'
case'Wall'
WALL([130],:
)=1;
WALL(:
[140])=1;
end
feval(mfilename,'Stop')
case'ShowScore'%ChangeofShowScore
switchget(gcbo,'checked')
case'on'
set(gcbo,'checked','off')
set(findobj(gcbf,'Tag','Score'),'Visible','off')
case'off'
set(gcbo,'checked','on')
set(findobj(gcbf,'Tag','Score'),'Visible','on')
end
case'NewGame'set(findobj(gcbf,'Tag','Score'),'String','0')
SNAKE=[14,20;14,19;14,18;14,17;14,16];
DIRECTION=29;%right
BONUS=0;
PAUSE=false;
feval(mfilename,'Food')
feval(mfilename,'Start')
case'Start'%StartGame
RUNNING=true;
bonusCounter=0;
foodCounter=0;
while(RUNNING)
if~PAUSE
SNAKE=circshift(SNAKE,1);
SNAKE(1,:
)=SNAKE(2,:
);
switchDIRECTION
case28%left
SNAKE(1,2)=mod(SNAKE(1,2)-2,40)+1;
case29%right
SNAKE(1,2)=mod(SNAKE(1,2),40)+1;
case30%up
SNAKE(1,1)=mod(SNAKE(1,1)-2,30)+1;
case31%down
SNAKE(1,1)=mod(SNAKE(1,1),30)+1;
end
%Checkifsnakehitsanybarrier
ifWALL(SNAKE(1,1),SNAKE(1,2))||...
sum(ismember(SNAKE(2:
end,1),SNAKE(1,1))+...
ismember(SNAKE(2:
end,2),SNAKE(1,2))==2)
pause(.3)
delete(findobj(gcbf,'Tag','Bonus'))
feval(mfilename,'Stop')
set(BOARD,'CData',getGameOver)
else
%Checkifsnakeeatsbonus
ifisequal(SNAKE(1,:
),BONUS)
%Updatescore
scorehandle=findobj(gcbf,'Tag','Score');
set(scorehandle,'String',...
num2str(LEVEL*ceil(bonusCounter/3)+...
str2double(get(scorehandle,'String'))))
bonusCounter=1;
end
ifBONUS
bonusCounter=bonusCounter-1;
ifbonusCounter<=0
delete(findobj(gcbf,'Tag','Bonus'))
BONUS=0;
end
end
%Checkifsnakeeatsfood
ifisequal(SNAKE(1,:
),FOOD)
%SnakeGrows!
SNAKE(end+1,:
)=SNAKE(end,:
);
%Updatescore
scorehandle=findobj(gcbf,'Tag','Score');
set(scorehandle,'String',...
num2str(LEVEL+str2double(get(scorehandle,'String'))))
%Spawnnewfood
feval(mfilename,'Food')
if~BONUS%onlyupdateifnobonusexist
bonusCounter=bonusCounter+15;
foodCounter=foodCounter+1;
end
iffoodCounter==4%SpawnnewbonuseveryfourthFood
feval(mfilename,'Bonus')
foodCounter=0;
end
end
feval(mfilename,'DrawBoard')
end
end
pause(.3/LEVEL)
end
case{11232}%PauseGame
PAUSE=~PAUSE;
ifPAUSE&&RUNNING
set(BOARD,'CData',getPause)
end
case'Stop'%StopGame
RUNNING=false;
set(BOARD,'CData',getTitle)
case'Food'%Putfoodontogameboard
CData=WALL;
fori=1:
size(SNAKE,1)
CData(SNAKE(i,1),SNAKE(i,2))=1;
end
ind=find(CData'==0);
ind=ind(ceil(rand*length(ind)));
FOOD=[ceil(ind/40)mod(ind-1,40)+1];
case'Bonus'%Putbonusontogameboard
delete(findobj(gcbf,'Tag','Bonus'))
CData=WALL;
fori=1:
size(SNAKE,1)
CData(SNAKE(i,1),SNAKE(i,2))=1;
end
CData(FOOD(1,1),FOOD(1,2))=1;
ind=find(CData'==0);
ind=ind(ceil(rand*length(ind)));
BONUS=[ceil(ind/40)mod(ind-1,40)+1];
text(BONUS
(2),BONUS
(1),'\heartsuit',...
'Color',[100],...
'FontUnits','normalized',...
'FontSize',.065,...
'HorizontalAlignment','Center',...
'VerticalAlignment','Middle',...
'Tag','Bonus')
case'DrawBoard'%DrawtheGameBoard
CData=WALL;
fori=1:
size(SNAKE,1)
CData(SNAKE(i,1),SNAKE(i,2))=2;
end
CData(FOOD
(1),FOOD
(2))=4;
set(BOARD,'CData',CData)
end
function[ico,map]=getIcon()
%createsimpleiconmatrix
ico=ones(13)*3;
ico(:
1:
4:
13)=1;
ico(1:
4:
13,:
)=1;
ico(6:
8,6:
8)=2;
ico(6:
8,10:
12)=2;
ico(10:
12,10:
12)=2;
map=[000;.5.5.6;[148182166]/255;];
functiontitle=getTitle()
title=zeros(30,40);
title([4243474872737778104105106107108134135136137138...
164165166167168222223224225226227228252253254255256...
257258282283312313344345346347348374375376377378404...
405406407408464465466494495496522523527528552553557...
558582583587588612613614615616617618642643644645646...
647648672673674675676677678727728729730731732733734...
735736737738757758759760761762763764765766767768787...
788789790791792793794795796797798824825826854855856...
8828838878889129139179189729739749759769779781002...
1003100410051006100710081032103310371038106210631067...
1068109210931097109811221123112411251126115211531154...
11551156])=3;
functiongameover=getGameOver()
gameover=zeros(30,40);
gameover([9596979899100101102103104109110111112113114...
125126127128129130131132133134139140141142143144155...
156163164167168175176185186193194197198205206215216...
219220221222223224229230231232233234245246249250251...
252253254259260261262263264335336337338339340341342...
343344347348349350351352353354365366367368369370371...
372373374377378379380381382383384395396399400415416...
425426429430445446455456457458459460461462463464467...
468469470471472473474485486487488489490491492493494...
497498499500501502503504575576577578579580581582583...
584587588589590591592593594595596605606607608609610...
611612613614617618619620621622623624625626635636647...
648651652655656665666677678681682685686695696697698...
699700701702703704707708711712715716725726727728729...
730731732733734737738741742745746755756785786817818...
819820821822823824827828829830831832833834835836847...
848849850851852853854857858859860861862863864865866...
887888891892917918921922935936937938939940941942943...
944949950953954955956965966967968969970971972973974...
979980983984985986995996999100010031004102510261029...
1030103310341055105610591060106310641067106810691070...
1071107210751076108510861093109410971098109911001101...
110211051106])=1;
functionpause=getPause()
pause=zeros(30,40);
pause([4142434445464748495071727374757677787980101...
102103104105106107108109110131132136137161162166167...
193194195223224225283284285313314315341342346347371...
372376377401402406407431432433434435436437461462463...
464465466467491492493494495496497551552553554555556...
581582583584585586616617646