MATLAB製作貪喫蛇小遊戲(可選擇遊戲難度)

這兩天感覺自己無所事事,事情多但是學不下去,於是就想自己寫一下貪喫蛇的小遊戲來放鬆一下自己,自己根據網上的教程學了一下用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)

這樣就完成了整個貪喫蛇的遊戲,雖然只是一個小小的遊戲,但是實現出來還是很有成就感的,希望大家自己也能完成自己的貪喫蛇遊戲~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章