之前我发布过一个matlab简单的打枪的小游戏,后来我把它完善了,不过一直没发布,今天凑巧看见了以前做的代码,现把代码发一下。
这里我改成了wasd控制士兵,鼠标控制枪械方向,并且加了血量系统(三滴血),加了几把武器,通过键盘上的1234切枪,然后敌人我设置了血量更多的,枪械伤害不同,打敌人效果也不同。
另外这些代码请在matlab脚本文件中使用,实时脚本好像用不了。
博主大二了,在学stm32和matlab数学建模了,之前也接触过unity,不过事情太多就没继续学了,以后我会发布其他的代码,主要是希望有大佬带我。
这是代码:
clc;
clear;
fig=figure("WindowStyle","normal");
hold on;
h=animatedline("Color","b","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
hq=animatedline("Color","r","Marker","o","MarkerSize",8,"MaximumNumPoints",1,"MarkerFaceColor","r");
h1=animatedline("Color","black","Marker",".","MarkerSize",10,"MaximumNumPoints",1);
h2=animatedline("Color","black","Marker",".","MarkerSize",10,"MaximumNumPoints",1);
h3=animatedline("Color","black","Marker",".","MarkerSize",10,"MaximumNumPoints",1);
h4=animatedline("Color","black","Marker",".","MarkerSize",10,"MaximumNumPoints",1);
h5=animatedline("Color","black","Marker",".","MarkerSize",10,"MaximumNumPoints",1);
j1=animatedline("Color","r","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
j2=animatedline("Color","r","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
j3=animatedline("Color","r","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
j4=animatedline("Color","r","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
j5=animatedline("Color","r","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
j6=animatedline("Color","r","Marker",".","MarkerSize",60,"MaximumNumPoints",1);
j7=animatedline("Color","r","Marker",".","MarkerSize",60,"MaximumNumPoints",1);
j8=animatedline("Color","r","Marker",".","MarkerSize",70,"MaximumNumPoints",1);
j9=animatedline("Color","r","Marker",".","MarkerSize",70,"MaximumNumPoints",1);
j10=animatedline("Color","r","Marker",".","MarkerSize",80,"MaximumNumPoints",1);
direction=[0,-1];
direction1=[1,0];%方向
xy=[500,500];%士兵在的坐标
v=6;%士兵的基本速度
v2=12;%敌人的移动速度
x1=linspace(0,0,5);
y1=linspace(0,0,5);%子弹的坐标
d=zeros(2,5);%子弹的方向变量
d=single(d);
d1=zeros(2,10);%敌人的方向变量
d1=single(d1);
fenshu=0;%设置分数
x2=linspace(0,0,10);
y2=linspace(-1000,-1000,10);%敌人的坐标
b=[int8(1),int8(1),int8(1),int8(1),int8(1),int8(2),int8(2),int8(3),int8(3),int8(5)];%敌人的血量
b1=int8(3);%士兵的血量
tn=[10,50,100,300,500,800,1000,1200,1500,2000];%敌人的出现时间
tn=int32(tn);
q=1;%初始枪
blood=linspace(0,0,10);
blood=int8(blood);
p=0;
bre=1;
hold on;
hurt=1;%枪的伤害
w=0.3;%转动角速度
choose=2;%模式选择
for i=1:20000
if rem(i,200)==1
axis([0,1000,0,1000])
end
v1=25;%子弹的速度
p1=30;%判定范围
xy1=get(gca,"CurrentPoint");%鼠标点的位置
set(fig,'KeyPressFcn',@key)
q=getGlobalq;g=getGlobalg;
xy2=[xy1(1,1),xy1(1,2)];
direction1=(xy2-xy)/norm(xy2-xy);%目标点方向
if choose==1
fu=direction1(2)/abs(direction1(2));
fu1=direction(2)/abs(direction(2));
if (direction(1)/abs(direction(1))==-direction1(1)/abs(direction1(1)))&&(direction(2)/abs(direction(2))==-direction1(2)/abs(direction1(2)))
direction=direction1;
end
if fu*fu1==1
if direction1(1)<direction(1)
direction(1)=direction(1)-w;
end
if direction1(1)>direction(1)
direction(1)=direction(1)+w;
end
direction(2)=fu*sqrt(abs(1-direction(1)^2));
end
if fu*fu1==-1
if direction1(2)<direction(2)
direction(2)=direction(2)-w;
end
if direction1(2)>direction(2)
direction(2)=direction(2)+w;
end
direction(1)=direction1(1)/abs(direction1(1))*sqrt(abs(1-direction(2)^2));
end
end
if choose==2
direction=direction1;
end
if g==1
xy(2)=xy(2)+v;
end
if g==2
xy(1)=xy(1)-v;
end
if g==3
xy(2)=xy(2)-v;
end
if g==4
xy(1)=xy(1)+v;
end
xy3=xy+direction*20;%士兵枪的位置
for j=1:5
if x1(j)<0||x1(j)>1000||y1(j)>1000||y1(j)<0
x1(j)=-1000;
y1(j)=-1000;
end
end
%子弹待命
if q==1
i1=rem(i,25);
if rem(i1,5)==0
x1((i1+5)/5)=xy(1);
y1((i1+5)/5)=xy(2);
d(:,(i1+5)/5)=direction';
v1=50;p1=50;
hurt=2;
end
end %第一把枪 步枪,伤害2
if q==2
i1=rem(i,15);
if rem(i1,3)==0
x1((i1+3)/3)=xy(1);
y1((i1+3)/3)=xy(2);
d(:,(i1+3)/3)=direction';
hurt=1;
end
end%第二把枪 冲锋枪,伤害1
if q==3
i1=rem(i,8);
if rem(i1,8)==0
for j=1:5
x1(j)=xy(1);
y1(j)=xy(2);
thita=atan(direction(2)/direction(1));
di=[1-tan(thita)*tan((j-3)/8),tan(thita)+tan((j-3)/8)];
di=di/norm(di);
if direction(1)<0
d(:,j)=-di;
end
if direction(1)>0
d(:,j)=di;
end
end
v1=20;
end
hurt=1;
end%第三把枪 霰弹枪 单发伤害1
if q==4
i1=rem(i,50);
if rem(i1,10)==0
x1((i1+10)/10)=xy(1);
y1((i1+10)/10)=xy(2);
d(:,(i1+10)/10)=direction';
v1=80;p1=50;
hurt=5;
end
end %第四把枪 狙击枪 单发伤害5
%产生子弹
for j=1:5
u=d(:,j);
x1(j)=x1(j)+v1*u(1);
y1(j)=y1(j)+v1*u(2);
end
%子弹射出
for j=1:10
if x2(j)<0||x2(j)>1000||y2(j)>1000||y2(j)<0
x2(j)=-1000;
y2(j)=-500;
end
end
%敌人待命
for j=1:10
if i==tn(j)
p=p+1;
end
end
%随时间增加敌人增多
for j=1:p
t4=fix(4*rand(1)+1);
if t4==1&&y2(j)<0
x2(j)=0;
y2(j)=1000*rand(1);
blood(j)=b(j);
end
if t4==2&&y2(j)<0
x2(j)=1000;
y2(j)=1000*rand(1);
blood(j)=b(j);
end
if t4==3&&y2(j)<0
y2(j)=0;
x2(j)=1000*rand(1);
blood(j)=b(j);
end
if t4==4&&y2(j)<0
y2(j)=1000;
x2(j)=1000*rand(1);
blood(j)=b(j);
end
end%敌人随机生成在范围内
for j=1:p
t2=[xy(1)-x2(j);xy(2)-y2(j)];
d1(:,j)=t2/norm(t2);
t2=d1(:,j);
x2(j)=x2(j)+v2*t2(1);
y2(j)=y2(j)+v2*t2(2);
for i2=1:5
if x2(j)>(x1(i2)-p1)&&x2(j)<(x1(i2)+p1)&&y2(j)>(y1(i2)-p1)&&y2(j)<(y1(i2)+p1)
x1(i2)=-1000;
y1(i2)=-100;
blood(j)=blood(j)-hurt;
end
end
if blood(j)<1
x2(j)=-500;
y2(j)=-800;
fenshu=fenshu+100;
end
if xy(1)>x2(j)-20&&xy(1)<x2(j)+20&&xy(2)>y2(j)-20&&xy(2)<y2(j)+20
b1=b1-1;
x2(j)=-1000;
y2(j)=-800;
delete(findobj('type','text'));
end
end
if xy(1)>1000
xy(1)=1;
end
if xy(1)<0
xy(1)=999;
end
if xy(2)>1000
xy(2)=1;
end
if xy(2)<0
xy(2)=999;
end
title('分数:',fenshu);
txt= ['血量:',num2str(b1)];
text(50,950,{txt},'Color','r');
addpoints(h,xy(1),xy(2));
addpoints(hq,xy3(1),xy3(2));
addpoints(h1,x1(1),y1(1));
addpoints(h2,x1(2),y1(2));
addpoints(h3,x1(3),y1(3));
addpoints(h4,x1(4),y1(4));
addpoints(h5,x1(5),y1(5));
addpoints(j1,x2(1),y2(1));
addpoints(j2,x2(2),y2(2));
addpoints(j3,x2(3),y2(3));
addpoints(j4,x2(4),y2(4));
addpoints(j5,x2(5),y2(5));
addpoints(j6,x2(6),y2(6));
addpoints(j7,x2(7),y2(7));
addpoints(j8,x2(8),y2(8));
addpoints(j9,x2(9),y2(9));
addpoints(j10,x2(10),y2(10));
drawnow;
if b1<1
text(150,800,"game over!",'Color','r','FontSize',50);
bre=0;
end
if bre==0
break;
end
pause(0.05);
end
function key(~,event)
switch event.Key
case '1'
setGlobalq(1);
case '2'
setGlobalq(2);
case '3'
setGlobalq(3);
case'4'
setGlobalq(4);
case 'w'
setGlobalg(1);
case 'a'
setGlobalg(2);
case 's'
setGlobalg(3);
case 'd'
setGlobalg(4);
end
end
function setGlobalq(val1)
global q
q=val1;
end
function qi=getGlobalq
global q
qi=q;
end
function gi=getGlobalg
global g
gi=g;
end
function setGlobalg(val)
global g
g=val;
end
应该能用,不能的话评论一下...