CPP004弹幕游戏

描述

在弹幕射击游戏中,玩家或子弹可以抽象为二维平面直角坐标系中的圆

当代表玩家的圆与任意一个代表子弹的圆相交,玩家被判断为中弹

因为游戏的作者不太友好,子弹可能会直接糊到玩家脸上,子弹与玩家互相包含或重合也视为中弹

给出当前游戏画面中代表玩家和子弹的圆的位置和大小,请判断玩家是否中弹

输入

输入第一行为一个整数 nn (1≤n≤100)(1≤n≤100) ,代表圆的数量

之后的 nn 行, 每行三个由空格隔开的实数 xx,yy,rr (0≤∣x∣,∣y∣≤1000,1≤r≤1000)(0≤∣x∣,∣y∣≤1000,1≤r≤1000),表示圆的坐标和半径

其中输入的实数最多包含 33 位小数,保证不会出现两圆相切的情况

最后一行为一个整数 pp (0≤p≤n−1)(0≤pn−1),表示第 p+1p+1 个圆为玩家,其他圆为子弹

输出

输出一行字符串,代表判断结果

如果玩家中弹输出"Biu",如果玩家未中弹输出"Alive"(均不包含引号)

输入样例 1

3

0.000 0.000 2.000

1.000 1.000 2.000

-9.500 9.000 3.000

0

输出样例 1

Biu

本题中有许多对象,而不同对象的属性基本一致,可以使用结构体或者类来定义这些对象。本文使用类来处理对象。使用类来定义对象以后,通过对对象的赋值与计算距离,确定player是否会被击中。

#include <iostream>
#include <math.h>

using namespace std;

class circle
{
public:
    double x, y, r;   //定义对象属性
    
    void set(double X, double Y, double R)  //方法一,为对象赋值
    {
        x = X;
        y = Y;
        r = R;
    }

    bool isbiu(const circle& P);  //方法二,判断是否被枪中,其中& P指的是player的地址,用const进行限制使得其不会被修改
};
bool circle::isbiu(const circle& P)
{
    double d = sqrt((x - P.x) * (x - P.x) + (y - P.y) * (y - P.y));
    double s = r + P.r;
    if (d > s)
        return false;
    else
        return true;
}
int main()
{
    int t;
    cin >> t;
    circle P[101], player;  //用类的含义定义数组和玩家
    for(int ix = 0; ix < t; ix++)
    {
        double x, y, r;
        cin >> x >> y >> r;
        P[ix].set(x, y, r);  //调用类中方法进行赋值
    }
    int p;
    cin >> p;
    player = P[p];  //确定player在数组中的地址
    int count = 0;
    for (int ix = 0; ix < t; ix++) 
    {
        bool k = player.isbiu(P[ix]);
        if (k) 
        {
            count++;
        }
    }
//在这里进行一个一个对象比较时,因为player本身不会打伤自己,但是由于即使距离为0也会默认为中枪
//如果没有被打到,return false,count不会发生变化,但是由于要算自己一次,此时count为1,--count为0不输出,所以else
//输出存活;如果被打到,return true,count++,只要--count值不为0,就被打中了
    if (--count) {
        cout << "Biu";
    }
    else {
        cout << "Alive";
    }
    return 0;
}

题目的难点在于类的使用以及能否想到类。当我们看到规整的结构时就应该想到类、结构体、共同体等。由于在C++中类的存在,使用类会让我们的代码更加简洁明了,便于理解。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值