小游戏编程问题描述:
1. 假设游戏布景为一个10*10的简单二维栅格场景;
2. 游戏自动生成1只乌龟和10条鱼;
3. 它们移动方向随机;
4. 乌龟最大移动能力为2;可随机选择移动1还是2,鱼的移动能力为1;
5. 当移动到场景边界,自动反方向移动;
6. 乌龟初始化体能为100;每移动一次消耗体能1;
7. 当乌龟和鱼的坐标重合,代表乌龟吃掉鱼,体能增加20;
8. 鱼不计体力消耗;
9. 乌龟体力值为0或者鱼被吃光,则游戏结束。
代码编写思路:
数据初始化,包含二维栅格场景(x, y),鱼的初始数目,每条鱼的初始位置,乌龟的数目,乌龟的初始位置,乌龟的初始体力值,吃鱼可以增加的体力值等;如果需要也可以定义一下程序循环次数t,便于观测小程序运行情况;
While语句判断程序停止条件,这里因为在while里面一开始就需要判断鱼和龟的初始位置,是否吃鱼,因此鱼的数目程序停止条件在循环内完成,这里只对乌龟的体力值作为程序停止条件;
判断初始化情况乌龟是否能吃得到鱼,即乌龟初始化位置是否与某条鱼位置重合,若重合则重合的鱼被吃掉,鱼数目减1;后面做鱼的数目判断,鱼的数目是否为0,如果是,则跳出while循环,游戏结束,否则继续运行下面程序;
鱼随机移动,可以随机产生一个1-4的flag_fish变量作为鱼移动方向的情况,上下左右分别为1,2,3,4,后面接switch语句进行每条鱼的位置变化;鱼随机移动之前得判断是否在二维栅格的边界,如果在边界则向反方向移动。
乌龟的随机移动,这里的处理方法和鱼的移动类似,只是需要增加一个1-2随机数产生的flag_distance变量,产生本次移动的移动距离1或者2,这里同样要判断是否在边界情况,由于乌龟的最大移动距离为2,因此要判断是否跳出场景范围。
对当前鱼的位置以及乌龟的位置进行作图。
MATLAB程序代码如下:
clc,clear all;
%% 数据初始化
t = 0; %循环次数
X = 1:10;
Y = 1:10;
fish = 10;
fish_position = randi([1,10],10,2);
wugui = 1;
wugui_position = randi([1,10],1,2);
wugui_tili = 100;
eat_fish_tili = 20;
%% 判断
while(wugui_tili ~= 0)
%% 吃鱼
flag_same= [];
[I,~] =size(fish_position);
for i =1:I
ifwugui_position == fish_position(i,:);
wugui_tili = wugui_tili + eat_fish_tili;
flag_same = [flag_same,i];
end
end
fish_position([flag_same],:) = [];
ifisempty(fish_position)
break
end
%% 鱼随机移动
[J,~] =size(fish_position);
for j =1:J
flag1= randi([1,4],1);
iffish_position(j,1) == 1
flag1 = 1;
elseif fish_position(j,1) == 10
flag1 = 2;
elseif fish_position(j,2) == 1
flag1 = 3;
elseif fish_position(j,2) == 10
flag1 = 4;
end
switch flag1
case 1
fish_position(j,1) =fish_position(j,1)+1;
case 2
fish_position(j,1) = fish_position(j,1)-1;
case 3
fish_position(j,2) = fish_position(j,2)+1;
case 4
fish_position(j,2) = fish_position(j,2)-1;
end
end
%% 龟随机移动
flag2 =randi([1,4],1);
flag_distance = randi([1,2],1);
ifwugui_position(1,1) == 1
flag2= 1;
elseifwugui_position(1,1) == 10
flag2= 2;
elseifwugui_position(1,2) == 1
flag2= 3;
elseifwugui_position(1,2) == 10
flag2= 4;
end
switchflag2
case1
wugui_position(1,1) = wugui_position(1,1)+flag_distance;
case2
wugui_position(1,1) = wugui_position(1,1)-flag_distance;
case3
wugui_position(1,2) = wugui_position(1,2)+flag_distance;
case4
wugui_position(1,2) = wugui_position(1,2)-flag_distance;
end
% 防止出界
ifwugui_position(1,1) == 0
wugui_position(1,1) = 2;
elseifwugui_position(1,2) == 0
wugui_position(1,2) = 2;
elseifwugui_position(1,1) == 11
wugui_position(1,1) = 9;
elseifwugui_position(1,2) == 11
wugui_position(1,2) = 9;
end
wugui_tili = wugui_tili-1;
t = t+1;
%% 画图
plot(fish_position(:,1),fish_position(:,2),'ro');
hold on
plot(wugui_position(1),wugui_position(2),'g>')
axis([011 0 11])
drawnow;
hold off
pause(1);
end
仿真结果:
图中绿三角形表示乌龟,红小圈表示鱼。
孙国栋,重庆大学无线通信技术实验室硕士研究生,主研方向高速移动通信信道估计、智能信号与信息处理。