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

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

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

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

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

matlab貪吃蛇游戲源碼以及解析:
游戲運(yùn)行方法:將以下代碼保存為snake_game.m文件,用matlab打開醋安,運(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) % 開始游戲
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 %如果超過了邊界
            msgbox('YOU LOST!  ')
            ex=1;
            
        elseif snake(1,2)==0 % 如果超過了邊界
            msgbox('YOU LOST!  ')
            ex=1;
            
        elseif snake(1,1)==axis_limit % 如果超過了邊界
            msgbox('YOU LOST!  ')
            ex=1;
            
        elseif snake(1,2)==axis_limit % 如果超過了邊界
            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):“木石說”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末波桩,一起剝皮案震驚了整個(gè)濱河市戒努,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镐躲,老刑警劉巖柏卤,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匀油,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)勾笆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門敌蚜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窝爪,你說我怎么就攤上這事弛车∑朊剑” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵纷跛,是天一觀的道長喻括。 經(jīng)常有香客問我,道長贫奠,這世上最難降的妖魔是什么唬血? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮唤崭,結(jié)果婚禮上拷恨,老公的妹妹穿的比我還像新娘。我一直安慰自己谢肾,他們只是感情好腕侄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芦疏,像睡著了一般冕杠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酸茴,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天分预,我揣著相機(jī)與錄音,去河邊找鬼弊决。 笑死噪舀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的飘诗。 我是一名探鬼主播与倡,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昆稿!你這毒婦竟也來了纺座?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤溉潭,失蹤者是張志新(化名)和其女友劉穎净响,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喳瓣,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馋贤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畏陕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片配乓。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犹芹,到底是詐尸還是另有隱情崎页,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布腰埂,位于F島的核電站飒焦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏屿笼。R本人自食惡果不足惜牺荠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刁卜。 院中可真熱鬧志电,春花似錦、人聲如沸蛔趴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孝情。三九已至鱼蝉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箫荡,已是汗流浹背魁亦。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羔挡,地道東北人洁奈。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像绞灼,于是被迫代替她去往敵國和親利术。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345