這兩天感覺自己無所事事,事情多但是學不下去,於是就想自己寫一下貪喫蛇的小遊戲來放鬆一下自己,自己根據網上的教程學了一下用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)
這樣就完成了整個貪喫蛇的遊戲,雖然只是一個小小的遊戲,但是實現出來還是很有成就感的,希望大家自己也能完成自己的貪喫蛇遊戲~