描述
在弹幕射击游戏中,玩家或子弹可以抽象为二维平面直角坐标系中的圆
当代表玩家的圆与任意一个代表子弹的圆相交,玩家被判断为中弹
因为游戏的作者不太友好,子弹可能会直接糊到玩家脸上,子弹与玩家互相包含或重合也视为中弹
给出当前游戏画面中代表玩家和子弹的圆的位置和大小,请判断玩家是否中弹
输入
输入第一行为一个整数 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≤p≤n−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++中类的存在,使用类会让我们的代码更加简洁明了,便于理解。