用matlab制作一个打枪的小游戏

这篇文章展示了一名大一新生使用MATLAB编写的脚本,创建了一个涉及动画线对象的小游戏。游戏中包括士兵、子弹和敌人的动态移动,玩家可以通过鼠标控制士兵移动并发射子弹,敌人会根据设定的规则移动。当敌人被击中或触碰到士兵时,游戏结束,同时设有分数系统记录玩家表现。
摘要由CSDN通过智能技术生成

花了4个小时,在matlab中用脚本编辑的小游戏,下面是代码:

大一新生第一次发文章,有什么问题希望大佬们能够提出来。

clc;
clear;
fig=figure("WindowStyle","normal");
hold on;
h=animatedline("Color","b","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
hq=animatedline("Color","r","Marker","hexagram","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",50,"MaximumNumPoints",1);
j7=animatedline("Color","r","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
j8=animatedline("Color","r","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
j9=animatedline("Color","r","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
j10=animatedline("Color","r","Marker",".","MarkerSize",50,"MaximumNumPoints",1);
set(gcf,"WindowButtonMotionFcn")
direction=[0,0];%运动方向
xy=[500,500];%士兵在的坐标
v=10;%士兵的基本速度
x1=linspace(0,0,5);
y1=linspace(0,0,5);%子弹的坐标
v1=50;%子弹的速度
d=zeros(2,5);%子弹的方向变量
d1=zeros(2,10);%敌人的方向变量
fenshu=0;%设置分数
x2=linspace(0,0,10);
y2=linspace(-1000,-1000,10);%敌人的坐标
v2=20;%敌人的移动速度
tn=[10,50,100,200,250,300,350,400,450,500];
p=0;
bre=1;
hold on;
for i=1:20000
    axis([0,1000,0,1000])
    xy1=get(gca,"CurrentPoint");%鼠标点的位置
    xy2=[xy1(1,1),xy1(1,2)];
    direction=(xy2-xy)/norm(xy2-xy);
    xy=xy+direction*v;%士兵随鼠标移动
    xy3=xy+direction*20;%士兵枪的位置
    
    %d=repmat(direction',1,5);%子弹的初始方向
    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
    %子弹待命
    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';
    end
    %产生子弹
    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);
    end
    if t4==2&&y2(j)<0
        x2(j)=1000;
        y2(j)=1000*rand(1);
    end
    if t4==3&&y2(j)<0
        y2(j)=0;
        x2(j)=1000*rand(1);
    end
    if t4==4&&y2(j)<0
        y2(j)=1000;
        x2(j)=1000*rand(1);
    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)-30)&&x2(j)<(x1(i2)+30)&&y2(j)>(y1(i2)-30)&&y2(j)<(y1(i2)+30)
                x2(j)=-500;
                y2(j)=-1000;
                fenshu=fenshu+100;
            end
        end
        if xy(1)>x2(j)-20&&xy(1)<x2(j)+20&&xy(2)>y2(j)-20&&xy(2)<y2(j)+20
            text(150,800,"game over!",'Color','r','FontSize',50);
            bre=0;
        end
    end
    title('分数:',fenshu);
    
    
    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 bre==0
            break;
        end
   
    pause(0.1);
end

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

漆懿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值