============================废话不多说直接上代码,代码注释很详细======================================
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
代码还需要优化,希望指点