教程 | matlab做贪吃蛇小游戏

来源:互联网 编辑:wan玩得好手游小编更新:2024-10-30 20:08:40 人气:



原文链接:https://blog.csdn.net/J_M_Chen/article/details/81050277
版权声明:本文为CSDN博主「Jianming.Chen」的原创文章,遵循 CC 4.0 BY-SA 版权协议


游戏比较简单,整个程序也不会很复杂,通过控制上下左右按键来控制贪吃蛇的走位(要想有好成绩一定要有骚走位哦),贪吃蛇吃到食物后会增长一个长度,当贪吃蛇碰到四周的墙壁或者碰到自己的身体的时候,程序就会弹出窗口提示游戏结束,在游戏中还可以通过空格键来暂停程序。


接下来就是代码模块了:


1.初始设置:初始设置是画出蛇的位置和食物的位置以及进行相关的参数的设置,第三行的坐标轴加了0.5是为了之后墙壁检测的时候方便操作,这在之后会加以说明。

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 = [10];                %蛇的方向
  body = [55 ; 45 ; 35];         %蛇身的初始位置数组  
  long = 3;                             %蛇的长度            
  food = [1010];                       %食物的初始位置
  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);      %设置定时器的参数
  start(game)                               %开始游戏


2.定时器函数:一旦启动了定时器,程序就依照设定的时间进入定时器函数进行操作,这也是为什么程序能够实时跟新的原因。


关于蛇的移动,通过将蛇头加上方向数组后,蛇头实现了向前移动一个位置,再加上之前的body也就是蛇的身体的数组,就实现了蛇的定向移动,不过这时候蛇是多出一个长度的,将最后一个设置为空就可以删除,实现移动。


关于判断是否撞到自己的身体,通过数组操作,比较蛇头的数组和蛇身body的某一行是否相等,如果相等就是撞到了,否则就不是,同样的在判断是否吃到食物以及是否撞到墙壁上是一样的原理,只不过数组的操作不一样而已。


这里说明一下之前为什么要把坐标加上0.5,因为我们对于蛇的移动都是整数操作,当我们设定边界为20是,只有当蛇头的位置处于19.5的时候才能判断它碰到边界了(蛇头自己是有大小的),但是整数操作是不会出现19.5的,只有19或者20,因此要加上0.5来方便我们的判断。
function snakeGame(~,~)
    snakeTop = snakeTop + snakeDirect;              %蛇的移动
    body = [snakeTop; body] ;                                 
    while length(body)> long
      body(end, : ) = [];         
    end

    if intersect(body(2 : end, : ), snakeTop, 'rows')               %判断蛇头是否撞到自己的身体
        ButtonName1 = questdlg('游戏结束,请点击按钮继续......','Gave Over','重新开始','关闭游戏''Yes');
        if ButtonName1 == '重新开始'
            clf;
            snake();
        else
            close;
        end
    end      

    if isequal(snakeTop, food)             %判断是否吃到食物
      long = long + 1;                   
      food = randi(20, [12]); 
      while any(ismember(body, food, 'rows'))
          food = randi(20, [12]);
      end
    end        

    if (snakeTop(11)>20)||(snakeTop(11)1)||(snakeTop(12)>20)||(snakeTop(12)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


3.按键判断:按键判断这一块只要找到想要操作的按键的按键值,然后在进行相应的操作即可,值得一提的是按键Q就直接是‘q’,其他字母也一样,很方便。

function key(~,event)       
    switch event.Key            
      case 'uparrow'
        direct = [0, 1];

      case 'downarrow'
        direct = [0, -1];
      case 'leftarrow'
        direct = [-10];
      case 'rightarrow'
        direct = [10];
      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

完整程序

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 = [55];                   %这是蛇头的初始位置
  snakeDirect = [10];                %蛇的方向
  body = [55 ; 45 ; 35];          %蛇身的初始位置数组  
  long = 3;                                 %蛇的长度            
  food = [1010];                        %食物的初始位置
  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);       %设置定时器的参数
  start(game)                               %开始游戏

   function snakeGame(~,~)
    snakeTop = snakeTop + snakeDirect;              %蛇的移动
    body = [snakeTop; body] ;                                 
    while length(body)> long
      body(end, : ) = [];         
    end

    if intersect(body(2 : end, : ), snakeTop, 'rows')               %判断蛇头是否撞到自己的身体
        ButtonName1 = questdlg('游戏结束,请点击按钮继续......','Gave Over','重新开始','关闭游戏''Yes');
        if ButtonName1 == '重新开始'
            clf;
            snake();
        else
            close;
        end
    end      

    if isequal(snakeTop, food)             %判断是否吃到食物
      long = long + 1;                   
      food = randi(20, [12]); 
      while any(ismember(body, food, 'rows'))
          food = randi(20, [12]);
      wan玩得好手游】查看最新变态版手游攻略,只需要在百度输入【wan玩得好手游】就可以浏览最新上线送满vip的变态手游攻略了,更多有关BT手游的攻略和资讯,敬请关注玩得好手游!

更多...

热门推荐

更多...

相关文章