基于Matlab實現(xiàn)抖音小游戲蘋果蛇_第1頁
基于Matlab實現(xiàn)抖音小游戲蘋果蛇_第2頁
基于Matlab實現(xiàn)抖音小游戲蘋果蛇_第3頁
基于Matlab實現(xiàn)抖音小游戲蘋果蛇_第4頁
基于Matlab實現(xiàn)抖音小游戲蘋果蛇_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論