这两天感觉自己无所事事,事情多但是学不下去,于是就想自己写一下贪吃蛇的小游戏来放松一下自己,自己根据网上的教程学了一下用MATLAB制作贪吃蛇小游戏,并进行了小小的改进,可以实现游戏难度的选择。
同时跟大家分享一个MATLAB学习的好网站,上面有很多有趣的案例供大家学习,讲解很详细,有兴趣的同学可以去学习一下:
https://yuchungchuang.wordpress.com/
下面就是我自己做的贪吃蛇游戏的GIF图,效果感觉还比较满意:
下面给大家讲解一下贪吃蛇游戏制作过程的总体思路:
首先自然是游戏界面的制作了,界面的制作很简单,大家可以根据自己的喜好设置自己的游戏界面,这里我自己做的时候是使用命令行绘制游戏界面的,下面是我的代码:
function snake
%设置背景
global H handles1
fullsizescreen = get(0,'ScreenSize');
H = figure('name','贪吃蛇_ZD',...
'position',[fullsizescreen(3)/4,fullsizescreen(4)/4,fullsizescreen(3)/2-200,fullsizescreen(4)/2])
axis equal
axis([0.5 20.5 0.5 20.5])
set(gca,'xtick',[],'ytick',[],'position',[0.23 0.0925 0.775 0.815]);
box on
set(gca,'linewidth',5);
set(gca,'color','g');
uicontrol(H,'style','text',...
'position',[50 410 180 70],...
'string','贪吃蛇小游戏',...
'FontSize',20);
uicontrol(H,'style','pushbutton',...
'position',[80 350 120 70],...
'backgroundcolor',[0.5 0.5 0.5],...
'string','开始',...
'FontSize',20,'callback',@startfcn);
uicontrol(H,'style','pushbutton',...
'position',[80 250 120 70],...
'backgroundcolor',[0.5 0.5 0.5],...
'string','暂停',...
'FontSize',20,'callback',@stopfcn);
uicontrol(H,'style','pushbutton',...
'position',[80 150 120 70],...
'backgroundcolor',[0.5 0.5 0.5],...
'string','重启',...
'FontSize',20,'callback',@restartfcn);
handles1 = uicontrol(H,'style','popupmenu',...
'position',[70 50 150 70],...
'string',{'游戏等级','等级一','等级二','等级三'},...
'FontSize',20)
游戏界面制作好了之后就是让贪吃蛇动起来,动起来其实就是不断刷新游戏界面,而刷新游戏界面就要用到时钟,通过时钟刷新界面而让不同帧数的贪吃蛇产生位移。
这个是时钟启动函数,点击启动按钮时,这个函数运行,开启时钟。
function startfcn(~,~)
global snake_head snake_dir snake_body snake_length food plotfood plotsnake handles1 timer_snake
snake_head = [randi([5 15],1,1),randi([5 15],1,1)];
snake_dir = [randi([0 1],1,1),randi([0 1],1,1)];
snake_body = [snake_head(1),snake_head(2);snake_head(1)-1,snake_head(2);snake_head(1)-2,snake_head(2)];
snake_length = 3;
food = randi([2 19],2,1);
%绘制蛇
hold on
plotsnake = scatter(gca,snake_body(1:end,1),snake_body(1:end,2),250,'ys','filled')
hold on
plotfood = scatter(gca,food(1,:),food(2,:),150,'bs','filled')
set(gcf,'KeyPressFcn',@key);
val = get(handles1,'Value');
switch val
case 1
periodTime = 0.3;
case 2
periodTime = 0.3;
case 3
periodTime = 0.2;
case 4
periodTime = 0.1;
end
timer_snake = timer('Period',periodTime,...%定时器的使用,GUI上实时刷新时使用的就是timer定时器
'ExecutionMode','fixedRate',...
'Timerfcn',@snakeGame);
start(timer_snake)
这个是时钟刷新界面函数,从而产生贪吃蛇移动,吃食物等操作。
function snakeGame(~,~)
global snake_head snake_dir snake_body snake_length food plotfood plotsnake timer_snake
snake_head = snake_head + snake_dir;
snake_body = [snake_head;snake_body];
while length(snake_body) > snake_length
snake_body(end,:) = [];
end
if intersect(snake_body(2:end,:),snake_head,'rows')
Buttondown1 = questdlg('游戏结束,继续or退出???','Game Over','重新开始','退出游戏','退出游戏');
if Buttondown1 == '重新开始'
close all;
clear all;
snake()
else
close
delete(timer_snake)
end
end
if isequal(snake_head(1),food(1)) && isequal(snake_head(2),food(2))
snake_length = snake_length+1;
food = randi([1 19],2,1);
while any(ismember(snake_body,food))
food = randi([0 20],2,1);
end
end
if (snake_head(1,1)>20||(snake_head(1,1)<1||snake_head(1,2)>20)||snake_head(1,2)<1)
Buttondown1 = questdlg('游戏结束,继续or退出???','Game Over','重新开始','退出游戏','退出游戏');
if Buttondown1 == '重新开始'
close all;
clear all;
snake();
else
close;
delete(timer_snake)
end
end
set(plotfood,'XData',food(1),'YData',food(2));
set(plotsnake,'XData',snake_body(:,1),'YData',snake_body(:,2));%不断刷新界面
end
贪吃蛇动起来之后就是要操作贪吃蛇运动了,这里我们使用键盘操作函数,键盘操作很简单,下面就是实现键盘操控贪吃蛇的函数:
function key(~,event)
global snake_dir timer_snake
switch event.Key
case 'uparrow'
snake_dir1 = [0,1];
case 'downarrow'
snake_dir1 = [0,-1];
case 'leftarrow'
snake_dir1 = [-1,0];
case 'rightarrow'
snake_dir1 = [1,0];
case 'space'
stop(timer_snake);
snake_dir1 = snake_dir;
Buttondown3 = questdlg('游戏暂停','Stop','重新开始','退出游戏','继续游戏','继续游戏');
if Buttondown3 == '重新开始'
clf
snake()
elseif Buttondown3 == '退出游戏'
close
else
start(timer_snake)
end
otherwise
snake_dir = nan;
end
if any(snake_dir+snake_dir1)
snake_dir = snake_dir1;%不可逆向,即只有snake_dir+snake_dir1~=0时才执行变换方向的操作
end
这样,我们就基本实现了贪吃蛇的运动,剩下函数就是实现游戏的暂停,重启操作了:
贪吃蛇暂停函数:
function stopfcn(~,~)
global timer_snake
stop(timer_snake);
贪吃蛇重启函数:
function restartfcn(~,~)
global timer_snake
start(timer_snake)
这样就完成了整个贪吃蛇的游戏,虽然只是一个小小的游戏,但是实现出来还是很有成就感的,希望大家自己也能完成自己的贪吃蛇游戏~