我用 MATLAB 复刻了抖音爆火小游戏 苹果蛇
Posted slandarer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我用 MATLAB 复刻了抖音爆火小游戏 苹果蛇相关的知识,希望对你有一定的参考价值。
最近抖音上苹果蛇小游戏大火,为了证明MATLAB无所不能,咋能不跟风做一个?于是就有了这一篇。
还是提一句这个小游戏开始玩的心路历程:
- 第1-5关:?这不就是有重力的贪吃蛇,有任何难度嘛??
- 第6关:嗯。。。这个小技巧还是有点意思的
- 第30关:???这绕来绕去的是人出的题目??
- 第90关:… …疯了疯了已经疯了
废话不多说看一下MATLAB版的完整代码:
为了方便修改,关卡地图就摆在m文件里,总共写了八关,但是只有代码没有素材包还是运行不了,因此请从文末百度网盘获取完整压缩包.
function appleSnake
% @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);
function key(~,event)
dirvec=[0,0];
switch event.Key
case 'uparrow'
dirvec=[-1,0];
[~,colSet]=find(MAP<0);
if all(colSet==colSet(1))
dirvec=[0,0];
end
case 'downarrow',dirvec=[1,0];
case 'rightarrow',dirvec=[0,1];
case 'leftarrow',dirvec=[0,-1];
end
if sum(dirvec)~=0
[hi,hj]=find(MAP==-1);
switch MAP(hi+dirvec(1),hj+dirvec(2))
case 0
MAP(MAP<0)=MAP(MAP<0)-1;
MAP(MAP==min(MAP,[],[1,2]))=0;
MAP(hi+dirvec(1),hj+dirvec(2))=-1;
case 1
case 2
MAP(MAP<0)=MAP(MAP<0)-1;
MAP(MAP==min(MAP,[],[1,2]))=0;
MAP(hi+dirvec(1),hj+dirvec(2))=-1;
refreshSnake()
win();
return;
case 3
MAP(MAP<0)=MAP(MAP<0)-1;
APPLE_HDL=findobj('Tag','APPLE','UserData',[hi+dirvec(1),hj+dirvec(2)]);
MAP(hi+dirvec(1),hj+dirvec(2))=-1;delete(APPLE_HDL);
case 4
if MAP(hi+2*dirvec(1),hj+2*dirvec(2))==0
MAP(MAP<0)=MAP(MAP<0)-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;
end
end
refreshSnake();pause(.15)
freeFall();
refreshSnake()
end
end
function freeFall()
[rowSet,colSet]=find(MAP<0);
diffmin=inf;
for t=1:length(rowSet)
tCol=MAP(:,colSet(t));
tCol(60)=1;
tRow=find(tCol>0&((1:60)'>rowSet(t)),1,'first');
diffmin=min(diffmin,tRow-rowSet(t));
end
diffmin=diffmin-1;
if diffmin>15
loss(diffmin)
elseif diffmin>0
tMAP=MAP;
for t=1:length(rowSet)
tMAP(rowSet(t),colSet(t))=0;
end
for t=1:length(rowSet)
tMAP(rowSet(t)+diffmin,colSet(t))=MAP(rowSet(t),colSet(t));
end
MAP=tMAP;
end
end
function restart(~,~)
MAP=getMap(LEVEL);
if ~isempty(MAP)
loadMap();
refreshSnake();
LEVEL_HDL.String=num2str(LEVEL);
end
end
function win(~,~)
LEVEL=LEVEL+1;
MAP=getMap(LEVEL);
if ~isempty(MAP)
loadMap();
refreshSnake();
LEVEL_HDL.String=num2str(LEVEL);
else
msgbox('暂无更多关卡')
end
end
function loss(D)
if D>15
for d=1:20
[rowSet,colSet]=find(MAP<0);
tMAP=MAP;
for t=1:length(rowSet)
tMAP(rowSet(t),colSet(t))=0;
end
for t=1:length(rowSet)
tMAP(rowSet(t)+1,colSet(t))=MAP(rowSet(t),colSet(t));
end
MAP=tMAP;
refreshSnake();
pause(.1);
end
end
end
% =========================================================================
function [fig,ax]=init(~,~)
% figure窗口创建及属性设置
fig=figure();
fig.NumberTitle='off';
fig.Position=[250,120,500,500];
fig.MenuBar='none';
fig.Name='apple snake by slandarer';
% axes坐标区域创建及属性设置
ax=gca;hold on
ax.Position=[0 0 1 1];
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)
end
function map=getMap(level)
% 地图大小15x15
% 空气 : 0
% 土块 : 1
% 蛇头 : -1,蛇身数值依次递减
% 终点 : 2
% 苹果 : 3
% 石块 : 4
Map1=[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 3 0 0 0 0 0 0 0
0 0 -2 -1 0 0 0 0 0 0 0 2 0 0 0
0 0 -3 1 1 1 0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 MATLAB | 我用MATLAB复刻了这场颜色图生成大赛的作品