MATLAB制作贪吃蛇小游戏(可选择游戏难度)

这两天感觉自己无所事事,事情多但是学不下去,于是就想自己写一下贪吃蛇的小游戏来放松一下自己,自己根据网上的教程学了一下用MATLAB制作贪吃蛇小游戏,并进行了小小的改进,可以实现游戏难度的选择。

同时跟大家分享一个MATLAB学习的好网站,上面有很多有趣的案例供大家学习,讲解很详细,有兴趣的同学可以去学习一下:

https://yuchungchuang.wordpress.com/

下面就是我自己做的贪吃蛇游戏的GIF图,效果感觉还比较满意:

MATLAB制作贪吃蛇小游戏(可选择游戏难度)_第1张图片

 下面给大家讲解一下贪吃蛇游戏制作过程的总体思路:

一:游戏界面的制作

首先自然是游戏界面的制作了,界面的制作很简单,大家可以根据自己的喜好设置自己的游戏界面,这里我自己做的时候是使用命令行绘制游戏界面的,下面是我的代码:

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)

这样就完成了整个贪吃蛇的游戏,虽然只是一个小小的游戏,但是实现出来还是很有成就感的,希望大家自己也能完成自己的贪吃蛇游戏~

你可能感兴趣的:(MATLAB,GUI)