




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第基于Matlab實現(xiàn)抖音小游戲蘋果蛇最近抖音上蘋果蛇小游戲大火,為了證明MATLAB無所不能,咋能不跟風做一個?于是就有了這一篇。
還是提一句這個小游戲開始玩的心路歷程:
第1-5關:?這不就是有重力的貪吃蛇,有任何難度嘛??
第6關:嗯。。。這個小技巧還是有點意思的
第30關:???這繞來繞去的是人出的題目??
第90關:瘋了瘋了已經(jīng)瘋了
廢話不多說看一下MATLAB版的完整代碼:
為了方便修改,關卡地圖就擺在m文件里,總共寫了八關,但是只有代碼沒有素材包還是運行不了,因此請從文末獲取完整壓縮包.
functionappleSnake
%@author:slandarer
%公眾號:slandarer隨筆
%知乎:hikari
%加載圖像數(shù)據(jù)
MT=load('material.mat');
MT=MT.MT;
SIZE.BASE=size(MT.base.CData,1);
SIZE.EXIT=size(MT.exit.CData,1);
SIZE.STONE=size(MT.stone.CData,1);
SIZE.APPLE=size(MT.apple.CData,1);
SIZE.SNAKE=size(MT.snake1.CData,1);
SIZE.RESTART=size(MT.restart.CData,1);
%初始化地圖及關卡
[fig,ax]=init();
LEVEL=1;
MAP=getMap(LEVEL);
loadMap();
refreshSnake();
text(10,1000,'當前關卡:','FontSize',18,'FontWeight','bold')
LEVEL_HDL=text(270,1000,num2str(LEVEL),'FontSize',18,'FontWeight','bold');
%=========================================================================
set(fig,'KeyPressFcn',@key);
functionkey(~,event)
dirvec=[0,0];
switchevent.Key
case'uparrow'
dirvec=[-1,0];
[~,colSet]=find(MAP
ifall(colSet==colSet(1))
dirvec=[0,0];
case'downarrow',dirvec=[1,0];
case'rightarrow',dirvec=[0,1];
case'leftarrow',dirvec=[0,-1];
ifsum(dirvec)~=0
[hi,hj]=find(MAP==-1);
switchMAP(hi+dirvec(1),hj+dirvec(2))
case0
MAP(MAP0)=MAP(MAP0)-1;
MAP(MAP==min(MAP,[],[1,2]))=0;
MAP(hi+dirvec(1),hj+dirvec(2))=-1;
case1
case2
MAP(MAP0)=MAP(MAP0)-1;
MAP(MAP==min(MAP,[],[1,2]))=0;
MAP(hi+dirvec(1),hj+dirvec(2))=-1;
refreshSnake()
win();
return;
case3
MAP(MAP0)=MAP(MAP0)-1;
APPLE_HDL=findobj('Tag','APPLE','UserData',[hi+dirvec(1),hj+dirvec(2)]);
MAP(hi+dirvec(1),hj+dirvec(2))=-1;delete(APPLE_HDL);
case4
ifMAP(hi+2*dirvec(1),hj+2*dirvec(2))==0
MAP(MAP0)=MAP(MAP0)-1;
MAP(MAP==min(MAP,[],[1,2]))=0;
MAP(hi+dirvec(1),hj+dirvec(2))=-1;
MAP(hi+2*dirvec(1),hj+2*dirvec(2))=4;
STONE_HDL=findobj('Tag','STONE','UserData',[hi+dirvec(1),hj+dirvec(2)]);
STONE_HDL.XData=STONE_HDL.XData+70*dirvec(2);
STONE_HDL.YData=STONE_HDL.YData-70*dirvec(1);
STONE_HDL.UserData=[hi+2*dirvec(1),hj+2*dirvec(2)];
tCol=MAP(:,hj+2*dirvec(2));tCol(60)=1;
nRow=find(tCol~=0((1:60)'hi+2*dirvec(1)),1,'first')-1;
STONE_HDL.YData=STONE_HDL.YData-70*(nRow-hi+dirvec(1));
STONE_HDL.UserData=[nRow,hj+2*dirvec(2)];
MAP(hi+2*dirvec(1),hj+2*dirvec(2))=0;
MAP(nRow,hj+2*dirvec(2))=4;
refreshSnake();pause(.15)
freeFall();
refreshSnake()
functionfreeFall()
[rowSet,colSet]=find(MAP
diffmin=inf;
fort=1:length(rowSet)
tCol=MAP(:,colSet(t));
tCol(60)=1;
tRow=find(tCol0((1:60)'rowSet(t)),1,'first');
diffmin=min(diffmin,tRow-rowSet(t));
diffmin=diffmin-1;
ifdiffmin15
loss(diffmin)
elseifdiffmin0
tMAP=MAP;
fort=1:length(rowSet)
tMAP(rowSet(t),colSet(t))=0;
fort=1:length(rowSet)
tMAP(rowSet(t)+diffmin,colSet(t))=MAP(rowSet(t),colSet(t));
MAP=tMAP;
functionrestart(~,~)
MAP=getMap(LEVEL);
if~isempty(MAP)
loadMap();
refreshSnake();
LEVEL_HDL.String=num2str(LEVEL);
functionwin(~,~)
LEVEL=LEVEL+1;
MAP=getMap(LEVEL);
if~isempty(MAP)
loadMap();
refreshSnake();
LEVEL_HDL.String=num2str(LEVEL);
else
msgbox('暫無更多關卡')
functionloss(D)
ifD15
ford=1:20
[rowSet,colSet]=find(MAP
tMAP=MAP;
fort=1:length(rowSet)
tMAP(rowSet(t),colSet(t))=0;
fort=1:length(rowSet)
tMAP(rowSet(t)+1,colSet(t))=MAP(rowSet(t),colSet(t));
MAP=tMAP;
refreshSnake();
pause(.1);
%=========================================================================
function[fig,ax]=init(~,~)
%figure窗口創(chuàng)建及屬性設置
fig=figure();
fig.NumberTitle='off';
fig.Position=[250,120,500,500];
fig.MenuBar='none';
fig.Name='applesnakebyslandarer';
%axes坐標區(qū)域創(chuàng)建及屬性設置
ax=gca;holdon
ax.Position=[0011];
ax.XTick=[];
ax.YTick=[];
ax.XColor='none';
ax.YColor='none';
ax.XLim=[0,1050];
ax.YLim=[0,1050];
%繪制背景
image(ax,ax.XLim,ax.YLim,flipud(MT.background))
image(ax,[-SIZE.RESTART/2,SIZE.RESTART/2]+60,...
[-SIZE.RESTART/2,SIZE.RESTART/2]+900,...
flipud(MT.restart.CData),...
'AlphaData',flipud(MT.restart.AlpData),...
'ButtonDownFcn',@restart)
functionmap=getMap(level)
%地圖大小15x15
%空氣:0
%土塊:1
%蛇頭:-1,蛇身數(shù)值依次遞減
%終點:2
%蘋果:3
%石塊:4
Map{1}=[000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000030000000
00-2-100000002000
00-3111000111000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000];
Map{2}=[000000000000000
000000000000000
000000000000000
000000000000000
000000000002000
000000000000000
00-3-2-10000000000
001110111010000
000010030010000
000010111010000
000011101010000
000000001110000
000000000000000
000000000000000
000000000000000];
Map{3}=[000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
00-3-2-10000002000
001111000001000
001001000001000
001000030001000
001111000111000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000];
Map{4}=[000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000001001100000
000001000000000
000001030100000
00-3-2-10000000000
001111100011110
000000000000020
000000000000000
000000000000000];
Map{5}=[000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000002000
000000011111000
000000013010000
000-2-10000010000
000-311110010000
000000011110000
000000000000000
000000000000000
000000000000000];
Map{6}=[000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000200
000000001000000
000000131000000
000000000000000
0000-3-2-100040000
000011101110000
000000111000000
000000000000000
000000000000000
000000000000000];
Map{7}=[000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000400000000
000000100000000
000000100000200
000000130000000
0000-3-2-100000000
000011111100000
000000000000000
000000000000000
000000000000000
000000000000000];
Map{8}=[000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000100000000
000000400000000
000001310000000
0000-2-1000000000
0000-31111100000
000000200000000
000000000000000
000000000010000
000000000000000
000000000000000];
Map{9}=[];
map=Map{level};
functionloadMap(~,~)
delete(findobj('Tag','BASE'))
delete(findobj('Tag','EXIT'))
delete(findobj('Tag','APPLE'))
delete(findobj('Tag','STONE'))
%繪制土塊
fori=15:-1:1
forj=15:-1:1
ifMAP(i,j)==1
image(ax,70*(j-1)+35+[-SIZE.BASE/2,SIZE.BASE/2],...
70*(16-i)+35+[-SIZE.BASE/2,SIZE.BASE/2],...
flipud(MT.base.CData),...
'alphaData',flipud(MT.base.AlpData),...
'tag','BASE');
%繪制出口
[ti,tj]=find(MAP==2);
image(ax,70*(tj-1)+35+[-SIZE.EXIT/2,SIZE.EXIT/2],...
70*(16-ti)+35+[-SIZE.EXIT/2,SIZE.EXIT/2],...
flipud(MT.exit.CData),...
'alphaData',flipud(MT.exit.AlpData),...
'tag','EXIT');
%繪制蘋果
[ti,tj]=find(MAP==3);
if~isempty(ti)
image(ax,70*(tj-1)+35+[-SIZE.APPLE/2,SIZE.APPLE/2],...
70*(16-ti)+35+[-SIZE.APPLE/2,SIZE.APPLE/2],...
flipud(MT.apple.CData),...
'alphaData',flipud(MT.apple.AlpData),...
'tag','APPLE','UserData',[ti,tj]);
%繪制石塊
[ti,tj]=find(MAP==4);
if~isempty(ti)
image(ax,70*(tj-1)+35+[-SIZE.STONE/2,SIZE.STONE/2],...
70*(16-ti)+35+[-SIZE.STONE/2,SIZE.STONE/2],...
flipud(MT.stone.CData),...
'alphaData',flipud(MT.stone.AlpData),...
'tag','STONE','UserData',[ti,tj]);
functionrefreshSnake(~,~)
delete(findobj('Tag','SNAKE'))
%畫蛇頭
[ti,tj]=find(MAP==-1);
[ti_n,tj_n]=find(MAP==-2);
tSnakeC=MT.snake1.CData;
tSnakeAlp=MT.snake1.AlpData;
iftj_ntj
tSnakeC=fliplr(tSnakeC);
tSnakeAlp=fliplr(tSnakeAlp);
ifti_nti
ifMAP(ti,tj-1)==1
tSnakeC(:,:,1)=flipud(tSnakeC(end:-1:1,:,1)');
tSnakeC(:,:,2)=flipud(tSnakeC(end:-1:1,:,2)');
tSnakeC(:,:,3)=flipud(tSnakeC(end:-1:1,:,3)');
tSnakeAlp=flipud(tSnakeAlp');
else
tSnakeC(:,:,1)=flipud(tSnakeC(:,:,1)');
tSnakeC(:,:,2)=flipud(tSnakeC(:,:,2)');
tSnakeC(:,:,3)=flipud(tSnakeC(:,:,3)');
tSnakeAlp=flipud(tSnakeAlp');
ifti_nti
ifMAP(ti,tj-1)==1
tSnakeC(:,:,1)=tSnakeC(end:-1:1,:,1)';
tSnakeC(:,:,2)=tSnakeC(end:-1:1,:,2)';
tSnakeC(:,:,3)=tSnakeC(end:-1:1,:,3)';
tSnakeAlp=tSnakeAlp';
else
tSnakeC(:,:,1)=tSnakeC(:,:,1)';
tSnakeC(:,:,2)=tSnakeC(:,:,2)';
tSnakeC(:,:,3)=tSnakeC(:,:,3)';
tSnakeAlp=tSnakeAlp';
image(ax,70*(tj-1)+35+[-SIZE.SNAKE/2,SIZE.SNAKE/2],...
70*(16-ti)+35+[-SIZE.SNAKE/2,SIZE.SNAKE/2],...
flipud(tSnakeC),...
'alphaData',flipud(tSnakeAlp),...
'tag','SNAKE');
[ti,tj]=find(MAP==min(MAP,[],[1,2]));
[ti_l,tj_l]=find(MAP==min(MAP,[],[1,2])+1);
tSnakeC=MT.snake4.CData;
tSnakeAlp=MT.snake4.AlpData;
switchtrue
casetj_ltj
casetj_ltj
tSnakeC=fliplr(tSnakeC);
tSnakeAlp=fliplr(tSnakeAlp);
caseti_lti
tSnakeC(:,:,1)=flipud(tSnakeC(:,:,1)');
tSnakeC(:,:,2)=flipud(tSnakeC(:,:,2)');
tSnakeC(:,:,3)=flipud(tSnakeC(:,:,3)');
tSnakeAlp=flipud(tSnakeAlp');
caseti_lti
tSnakeC(:,:,1)=tSnakeC(:,:,1)';
tSnakeC(:,:,2)=tSnakeC(:,:,2)';
tSnakeC(:,:,3)=tSnakeC(:,:,3)';
tSnakeAlp=tSnakeAlp';
%畫蛇尾
image(ax,70*(tj-1)+35+[-SIZE.SNAKE/2,SIZE.SNAKE/2],...
70*(16-ti)+35+[-SIZE.SNAKE/2,SIZE.SNAKE/2],...
flipud(tSnakeC),...
'alphaData',flipud(tSnakeAlp),...
'tag','SNAKE');
%畫蛇身體
fori=-2:-1:(min(MAP,[],[1,2])+1)
[ti,tj]=find(MAP==i);
[ti_l,tj_l]=find(MAP==i+1);
[ti_n,tj_n]=find(MAP==i-1);
switchtrue
caseti_l==ti_n
tSnakeC=MT.snake2.CData;
tSnakeAlp=MT.snake2.AlpData;
casetj_l==tj_n
tSnakeC=MT.snake2.CData;
tSnakeAlp=MT.snake2.AlpData;
tSnakeC(:,:,1)=tSnakeC(:,:,1)';
tSnakeC(:,:,2)=tSnakeC(:,:,2)';
tSnakeC(:,:,3)=tSnakeC(:,:,3)';
tSnakeAlp=tSnakeAlp';
caseti_lti_ntj_ltj_ntiti_l
tSn
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 信息技術設備采購數(shù)量調(diào)整與取消的補充協(xié)議
- 出租車行業(yè)服務質(zhì)量提升與標準制定合同
- 2025年高壓成套電器項目提案報告
- 2025年人教版小學一年級數(shù)學(上冊)期中試卷及答案
- 2025年人教版小學五年級英語(上冊)期末試卷及答案
- 2025年中大型重載軸承項目立項申請報告
- 《莊子人間世》測試題帶答案
- 1+x-RS-485總線技術基礎試題附答案
- 酚酸對葡萄植株生長和土壤影響的研究
- PCOS中醫(yī)體質(zhì)、生存質(zhì)量及危險因素的相關性研究
- DB4201∕T 645-2021 房地產(chǎn)經(jīng)紀服務規(guī)范
- 撥叉綜合課程設計
- 壓鑄件QC工程圖
- pH 值對檸檬酸緩凝效果影響的研究
- 學校物業(yè)服務監(jiān)督及處罰辦法
- 2012《天津市安裝工程預算基價》電氣工程(預算基價導出)
- 1104基礎報表填報說明(最新)
- 老舊小區(qū)改造技術標-
- 705型試驗臺技術條件及說明書
- 天麻、豬苓種植技術教學大綱
- 漢字的起源與演變過程.ppt
評論
0/150
提交評論