




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第基于Matlab實現抖音小游戲蘋果蛇最近抖音上蘋果蛇小游戲大火,為了證明MATLAB無所不能,咋能不跟風做一個?于是就有了這一篇。
還是提一句這個小游戲開始玩的心路歷程:
第1-5關:?這不就是有重力的貪吃蛇,有任何難度嘛??
第6關:嗯。。。這個小技巧還是有點意思的
第30關:???這繞來繞去的是人出的題目??
第90關:瘋了瘋了已經瘋了
廢話不多說看一下MATLAB版的完整代碼:
為了方便修改,關卡地圖就擺在m文件里,總共寫了八關,但是只有代碼沒有素材包還是運行不了,因此請從文末獲取完整壓縮包.
functionappleSnake
%@author:slandarer
%公眾號:slandarer隨筆
%知乎:hikari
%加載圖像數據
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窗口創建及屬性設置
fig=figure();
fig.NumberTitle='off';
fig.Position=[250,120,500,500];
fig.MenuBar='none';
fig.Name='applesnakebyslandarer';
%axes坐標區域創建及屬性設置
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,蛇身數值依次遞減
%終點: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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高標準廠房租賃安全生產及環境保護管理協議
- 餐飲公司股東投資收益分配合同
- 拆除工程安全責任及補償協議范本
- 車輛租賃平臺傭金分成合同
- 互聯網教育代理記帳與課程資源整合合同
- 資源開發項目參股合作協議范本
- 產權拍賣合同范本
- 餐飲店拆伙退伙協議書(合同解除原因)
- 美食街特色餐飲攤位租賃及食品安全保障合同
- 特種礦產資源采礦權出讓與科研開發合同
- 環境水利學-001-國開機考復習資料
- 大講堂之 第五講 大一統與中華民族的初步形成秦漢時期《中華民族共同體概論》
- 2019版CSCO黑色素瘤指南
- 企業數智化能力成熟度模型(EDMM)標準體系解讀
- 2024關于深化產業工人隊伍建設改革的建議全文解讀課件
- SOR-04-014-00 藥品受托生產企業審計評估報告模板
- 2024年保健按摩師(初級)職業技能鑒定考試題庫(含答案)
- 2024年吉林省長春市中考地理試卷(含答案與解析)
- 室外光纖布線施工合同協議書
- 2024年甘肅蘭州市西固區選聘專職化村黨組織書記1人歷年(高頻重點提升專題訓練)共500題附帶答案詳解
- 電機學智慧樹知到期末考試答案章節答案2024年東北電力大學
評論
0/150
提交評論