matlab制作一个士兵打枪的游戏(更新版,半年前做的)

之前我发布过一个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
 

应该能用,不能的话评论一下...

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

漆懿

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值