matlab实现贪食蛇小游戏

本篇文章用matlab做了一个经典的小游戏-贪吃蛇,代码如下所示,仅仅包含一个函数snake,整体来说实现难度比较小,适合初学者熟悉matlab:

function snake
  axis equal                    %设置坐标轴为对称      
  axis(0.5+[0, 20, 0, 20])          %加0.5是为了之后的墙壁碰撞检测的方便
  set(gca,'xtick',[],'ytick',[],'xcolor','w','ycolor','w')      %隐藏坐标轴
  set(gca, 'color', 'y')
  hold on                                                  
  snakeTop = [5, 5];                   %这是蛇头的初始位置
  snakeDirect = [1, 0];                %蛇的方向
  body = [5, 5 ; 4, 5 ; 3, 5];          %蛇身的初始位置数组  
  long = 3;                                 %蛇的长度            
  food = [10, 10];                        %食物的初始位置
  plotSnake = scatter(gca, body(:, 1), body(:, 2), 220, 'bs', 'filled');                  %通过函数scatter画出蛇身,scatter是画散点图的函数
  plotFood = scatter(gca, food(1), food(2), 150, 'g', 'filled');                           %通过函数scatter画出食物
  set(gcf, 'KeyPressFcn', @key) %设置按键反应函数                                                                    %设置按键判断
  fps = 5;                                    
  game = timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @snakeGame); 
  %设置定时器的参数,timerfcn表示计时器运行时的激发函数
  start(game)                               %开始游戏
 
   function snakeGame(~,~)
    snakeTop = snakeTop + snakeDirect;              %蛇的移动
    body = [snakeTop; body] ;                                 
    while length(body)> long % 将body的最后一个元素去掉,因为前面多了一个方向向量
      body(end, : ) = [];         
    end
    
    if intersect(body(2 : end, : ), snakeTop, 'rows')               %判断蛇头是否撞到自己的身体
        % intersect求两个矩阵的交集,'rows'设置判断是否具有相同行
        ButtonName1 = questdlg('游戏结束,请点击按钮继续......','Gave Over','重新开始','关闭游戏', 'Yes');
        if ButtonName1 == '重新开始'
            clf;%清除图窗
            snake();
        else
            close;
        end
    end      
    
    if isequal(snakeTop, food)             %判断是否吃到食物
      long = long + 1;                   
      food = randi(20, [1, 2]); %重新生成食物
      while any(ismember(body, food, 'rows'))% any函数在矩阵全是0元素时返回0,否则返回1
          food = randi(20, [1, 2]);
          % ismember(a,b)函数判断a中每个数是否在b中存在,如果存在则返回1,否则返回0,可以设置第二个返回值,返回a中每个成员在b中的索引,如果b中存在两个a则返回最小索引
      end
    end        
    
    if (snakeTop(1, 1)>20)||(snakeTop(1, 1)<1)||(snakeTop(1, 2)>20)||(snakeTop(1, 2)<1)         %判断是否撞到墙壁
        ButtonName2 = questdlg('游戏结束,请点击按钮继续......','Gave Over','重新开始','关闭游戏', '关闭游戏');
        if ButtonName2 == '重新开始'
            clf;
            snake();
        else
            close;
        end
    end
    
    set(plotFood, 'XData', food(1),  'YData', food(2));             %不断的刷新画面
    set(plotSnake, 'XData', body( : , 1), 'YData', body( : , 2));
  end
 
  function key(~,event)       
    switch event.Key            
      case 'uparrow'
        direct = [0, 1];
      case 'downarrow'
        direct = [0, -1];
      case 'leftarrow'
        direct = [-1, 0];
      case 'rightarrow'
        direct = [1, 0];
      case 'space'
        stop(game); 
        direct = snakeDirect;
        ButtonName3 = questdlg('游戏暂停......', 'Stop ', '重新开始', '关闭游戏', '继续游戏', '关闭游戏');
        if ButtonName3 == '重新开始'
            clf;
            snake();
        elseif ButtonName3 == '关闭游戏'
            close;
        else
           start(game);
        end   
      otherwise
        direct = nan;
    end
    if any(snakeDirect + direct)   
      snakeDirect = direct;
    end
  end
end

最终的运行示意图如下:

在这里插入图片描述

                      图1 操控贪吃蛇吃掉果实

在这里插入图片描述

                       图2 吃掉果实随机刷新

在这里插入图片描述

                      图3 碰到墙后的系统提示
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的神里绫华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值