如何用Matlab做一個(gè)貪吃蛇游戲

如何用Matlab做一個(gè)貪吃蛇游戲

環(huán)境準(zhǔn)備:

matlab開(kāi)發(fā)環(huán)境:matlab R2010以上版本

操作系統(tǒng):windows XP 及以上操作系統(tǒng)

matlab貪吃蛇游戲源碼以及解析:
游戲運(yùn)行方法:將以下代碼保存為snake_game.m文件,用matlab打開(kāi),運(yùn)行即可。


function snake_game()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     按 'Q' 鍵退出游戲         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all

%OPTIONS%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

difficulty=9;            %難度等級(jí):  1-10
bounds=0;         %是否設(shè)置邊界  1-是(撞墻退出游戲) 0-不設(shè)置邊界(撞墻后繼續(xù)游戲)
axis_limit= 20;   %游戲界面大小

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

d=0; % 方向變量,1/2/3/4 代表鍵盤的上下左右鍵
x = round(axis_limit/2); %起始點(diǎn)X坐標(biāo)
y =round(axis_limit/2); %起始點(diǎn)Y坐標(biāo)
d =randi([1,4]);% 隨機(jī)生成一個(gè)方向,作為初始方向
a =randi([1 axis_limit-1],1);%隨機(jī)生成一個(gè)食物的X坐標(biāo)
b =randi([1 axis_limit-1],1);%隨機(jī)生成一個(gè)食物的Y坐標(biāo)
snake(1,1:2)=[x y];%(X,Y)確定食物的坐標(biāo)位置
size_snake=1; % 食物的大小
ate=1;   %吃掉食物
ex=0;    % 退出游戲的一個(gè)標(biāo)志
food=[a b];%定義食物的坐標(biāo)
draw_snake(snake,food,size_snake,axis_limit) % 開(kāi)始游戲
figure('KeyPressFcn',@my_callback);
    function my_callback(~,event)%callback function for movement
        switch event.Character
            case 'q'  % Q鍵退出
                ex=1;
            case 30               % 箭頭方向
                if(d~=2)
                    d = 1;              %向上 d=1
                end
            case 31
                if(d~=1)
                    d = 2;              %向下 d=2
                end
            case 29
                if(d~=4)
                    d = 3;              %向右 d=3
                end
            case 28
                if(d~=3)
                    d = 4;              %向左 d=4
                end
        end
    end
while (ex~=1) %循環(huán)執(zhí)行,直到按q鍵退出游戲
    size_snake=size(snake);
    size_snake=size_snake(1);
    for l=size_snake+ate:-1:2
        snake(l,:)=snake(l-1,:);
    end
    switch d         %判斷鍵盤的四個(gè)方向
        case 1
            snake(1,2)=snake(1,2)+1;%Y 坐標(biāo)加1
        case 2
            snake(1,2)=snake(1,2)-1;% Y 坐標(biāo)減1
        case 3
            snake(1,1)=snake(1,1)+1;% X 坐標(biāo)加1
        case 4
            snake(1,1)=snake(1,1)-1;% X坐標(biāo)減1
    end
    draw_snake(snake,food,size_snake,axis_limit)% 繪制蛇的形狀
    
    pause(max([(105-difficulty*10)/(10*axis_limit) .001])) %設(shè)置難度等級(jí)
    
    if snake(1,1)==food(1) && snake(1,2)==food(2)%如果蛇頭和食物相遇,再同一點(diǎn)
        ate=1; % 吃標(biāo)記置1
        food(1) = randi([1 axis_limit-1]);%重新創(chuàng)建一個(gè)食物:X坐標(biāo)
        food(2) = randi([1 axis_limit-1]);%重新創(chuàng)建一個(gè)食物:Y坐標(biāo)
    else
        ate=0;
    end
   
    if bounds==1 % 如果設(shè)置了邊界
        snake(1,:)
        if snake(1,1)==0 %如果超過(guò)了邊界
            msgbox('YOU LOST!  ')
            ex=1;
            
        elseif snake(1,2)==0 % 如果超過(guò)了邊界
            msgbox('YOU LOST!  ')
            ex=1;
            
        elseif snake(1,1)==axis_limit % 如果超過(guò)了邊界
            msgbox('YOU LOST!  ')
            ex=1;
            
        elseif snake(1,2)==axis_limit % 如果超過(guò)了邊界
            msgbox('YOU LOST!  ')
            ex=1;
            
        end
    else
        snake=snake-((snake>axis_limit).*(axis_limit+1));
        snake=snake+((snake<0).*(axis_limit+1));
    end
    if (sum(snake(:, 1) ==snake(1, 1)   & snake(:, 2) == snake(1, 2) )>1) %如果蛇碰到了自己的身體,退出
        msgbox('Hit yourself, YOU LOST! ')
        break
        
    end
end
close all
end

function draw_snake(snake,food,size_snake,axis_limit)
for p = 1:size_snake
    plot(snake(p,1),snake(p,2), 'wo')
    hold on
end
plot(food(1,1),food(1,2), 'rs')%creates the vectors for the food and snake and plots them
whitebg([0.1 0.8 0.4])% 設(shè)置游戲面板顏色
axis([0, axis_limit, 0, axis_limit])%創(chuàng)建游戲面板,四個(gè)界限
hold off
end

不定期分享有趣的代碼和游戲,歡迎關(guān)注公號(hào):“木石說(shuō)”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容