MatLab之贪吃蛇小游戏(MatLabR2018a)

============================废话不多说直接上代码,代码注释很详细======================================

function Snake
%初始化变量值
snake = struct('x',0,'y',15);
dir = 'right';
curSnake = snake;
food = snake;
MAX_RC = 30;
BLOCK_SIZE = 30;

%Units - 测量单位  Position - 可绘制区域的位置和大小  KeyReleaseFcn - 释放键回调
hf = figure('Units','Pixels','Position',[50,50,1000,1000],'KeyPressFcn',@myKey);

%XLim, YLim - 最小和最大坐标轴范围 
%NextPlot - 要重置的属性 'add' - 在现有坐标区上添加新绘图。在显示新绘图之前,不删除现有绘图或重置坐标区属性。
axes(hf,'Units','Pixels','Position',[50,50,1000,1000],'XLim',[50,1000],'YLim',[50,1000],'NextPlot','add');

%ExecutionMode - 定义 timer 对象如何排定计时器事件的字符向量(fixedRate - 在将计时器回调函数添加到 MATLAB 执行队列中后立即启动)
%Period - 用于以秒为单位指定 TimerFcn 执行之间的延迟。(控制蛇的速度)
%TimerFcn - 计时器回调函数。
ht = timer('ExecutionMode','fixedRate','Period',0.6,'TimerFcn',@myTimer);

%生成食物
SetFood();

    %pt - 输出位置坐标
    %mode - 方块颜色
    %在指定位置坐标输出方块
    function Print(pt,mode)
        switch mode
            case 'food'
                %'red' 或 'r'	红色 ——食物颜色
                bColor = 'r';
            case 'body'
                %'black' 或 'k'	黑色 ——身体颜色
                bColor = 'k';
            case 'air'
                %'white' 或 'w'	白色 ——经过位置的颜色
                bColor = 'w';
        end
        %FaceColor - 填充颜色  EdgeColor - 轮廓颜色   Position - 矩形的大小和位置([x y width height] )
        rectangle('FaceColor',bColor,'EdgeColor','w','Position',BLOCK_SIZE*[pt.x,pt.y,1,1]);
    end

    %随机生成食物位置并显示
    function SetFood()
        while 1
            food.x = randi([0,MAX_RC-1],1);
            food.y = randi([0,MAX_RC-1],1);
            
            %在蛇的身体外随机生成食物
            if ~Travel(food)
                break;
            end
        end
        Print(food,'food');
    end

    %检查位置是否重合
    function ret = Travel(pt)
        %遍历数组
        for i= 1:size(snake,2)
            %比较  - true:1,false:0。
            if isequal(pt,snake(i))
                ret = 1;
                return;
            end
        end
        ret =0;
    end
    
    %监听键盘点击
    function myKey(~,e)
        switch e.Key
            %"s"键开始游戏
            case 's'
                start(ht);
                
            case 'uparrow'
                if strcmp(dir,'left') || strcmp(dir,'right')
                    dir = 'up';
                end
                
            case 'downarrow'
                if strcmp(dir,'left') || strcmp(dir,'right')
                    dir = 'down';
                end
                
            case 'leftarrow'
                if strcmp(dir,'up') || strcmp(dir,'down')
                    dir = 'left';
                end
                
            case 'rightarrow'
                if strcmp(dir,'up') || strcmp(dir,'down')
                    dir = 'right';
                end
                
        end
    end
    
    function myTimer(~,~)
        switch dir
            case 'up'
                curSnake.y = curSnake.y + 1;
                %最上方到对下方
                if curSnake.y > MAX_RC-1
                    curSnake.y = 0;
                end
            case 'down'
                %最下方到最上方
                curSnake.y = curSnake.y - 1;
                if curSnake.y < 0
                    curSnake.y = MAX_RC-1;
                end
            case 'left'
                curSnake.x = curSnake.x - 1;
                %最左方到最右方
                if curSnake.x < 0
                    curSnake.x = MAX_RC-1;
                end
            case 'right'
                curSnake.x = curSnake.x + 1;
                 %最右方到最左方
                if curSnake.x > MAX_RC-1
                    curSnake.x = 0;
                end
        end
        %判断蛇是否碰到它的身体
        if ~Travel(curSnake)
            snake(end+1) = curSnake;
            Print(curSnake,'body');
            %未吃到食物
            if ~Travel(food)
                %注:蛇的长度在不断的变长,只不过是设置为白色看不见了
                Print(snake(1),'air');
                snake = snake(2:end);
            %吃到食物
            else
               SetFood(); 
            end
        %发生异常停止游戏
        else
            error("Game Over!!!");
            stop(ht);
            delete(ht);
        end
    end
end 

 代码还需要优化,希望指点

 

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

进击的小绵羊

c币是什么

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

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

打赏作者

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

抵扣说明:

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

余额充值