Vanis: "我,Vanis,有一个梦想,就是成为STG之星 (STG star)."
Qiy: "......"
于是Vanis和Qiy要做一款STG (Shooter Game) 游戏,但是他们太菜了,于是想请你帮忙实现其中的一个小功能。
首先,这个游戏属于平面竖版卷轴射击游戏,为了方便表述,定义如下名词:
坐标系:规定以向右方向为x坐标轴正方向,以向上方向为y轴正方向,所有游戏对象都处于这个二维笛卡尔坐标系中。
坐标(简称“
点”):指二元有序组
)
,用来唯一标识坐标系中每个点的位置。
自机:玩家操控的角色,使用这个角色可以发射子弹射击敌机,相应地如果被敌机的子弹击中就会被击破。
自机中心:用来为自机定位的一个点,由一个坐标
)
表示。
敌机:由电脑控制的角色,会发射子弹攻击自机。
子弹:能够对自机造成伤害的游戏对象。按照攻击类型分类,主要分为自机狙、随机弹、固定弹三种。按照形状分类,这里只考虑两种:点弹和方形弹两种。
一般自机判定区:此处指一个在自机图像上的不可见矩形,用来判定自机是否被击中。自机中心一定在判定区内部,自机判定区可以由w和h两个参数以及自机中心
)
唯一确定,对于点
)
,如果其满足

且

,则称点
)
在此判定区内部。
退化自机判定区:当一般自机判定区的w和h两个参数只有其中之一为0时,自机判定区退化成一条线段,此时该图形的点集是由其线段上所有点构成的(包括线段端点);当一般自机判定区的w和h两个参数都等于0的时候,自机判定区退化成了一个点,且这个点恰好是自机中心,该图形的点集只包括这一个点。将这样的判定区称呼为退化自机判定区。
子弹碰撞箱(简称“
碰撞箱”):此处指在子弹上用来判定是否击中自机的不可见图形(在这道题中不考虑敌机)。
点弹:此处指碰撞箱为一个点的子弹,其由一个坐标
)
确定,该图形的点集只包括这一个点。
一般方形弹:此处指碰撞箱为一个矩形的子弹,由两个坐标
%2C%5C%20(x_2%2C%5C%20y_2))
确定,前者表示矩形的左下角坐标,后者表示矩形的右上角坐标。
退化方形弹:相对于一般方形弹而言,如果左下角与右上角的x轴坐标或y轴坐标二者之一相等,则矩形退化成一条线段,该图形的点集包括这条线段上的所有点(包括线段端点);如果左下角坐标与右上角坐标完全一致,其形状退化成了一个点,该图形的点集只有这一个点。此类方形弹称作退化方形弹。
矩形对象:指游戏系统中,以矩形进行运算的对象,此处包括:一般自机判定区和一般方形弹。
内部:此概念仅针对游戏中的矩形对象。指矩形内侧封闭区域的所有点以及其轮廓线上的所有点构成的集合。
相交:两个图形的点集的交集如果不为空,即至少有一个点同时属于这两个图形的点集,则认为两图形相交。
完全一致:如果两个坐标
)
和
)
满足

且

,则称这两个坐标(或这两个点)完全一致。
判断子弹是否命中自机,只需要判断子弹碰撞箱是否与自机判定区产生相交即可。
具体些则是:
一般自机判定区子弹命中判定规则如下:
1. 对于点弹而言,如果点弹的碰撞箱与自机判定区的内部相交,则判定为命中,反之判定为未命中。
2. 对于一般方形弹而言,如果其碰撞箱与自机判定区相交,则判定为命中,反之判定为未命中。
3. 对于退化方形弹而言,当其退化成一条线段时,如果构成碰撞箱的这一条线段与自机判定区内部相交,则判定为命中,反之判定为未命中;当其退化成一个点时,如果其碰撞箱的这个点在自机判定区内部这一点集中,则判定为命中,反之判定为未命中。
退化自机判定区子弹命中规则如下,如果退化自机判定区为一条线段:
1. 对于点弹而言,如果点弹在自机判定区的点集中,则判定为命中,反之判定为未命中。
2. 对于一般方形弹而言,如果自机判定区与碰撞箱内部相交,则判定为命中,反之判定为未命中。
3. 对于退化方形弹而言,当其退化成一条线段,如果自机判定区与这条线段相交,则判定为命中,反之判定为未命中;当其退化成一个点,如果构成碰撞箱的点在自机判定区的点集中,则判定为命中,反之判定为未命中。
如果退化自机判定区是一个点:
1. 对于点弹而言,如果点弹坐标与自机中心坐标完全一致,则判定为命中,反之判定为未命中。
2. 对于一般方形弹而言,如果构成自机判定区的点在碰撞箱的点集中,则判定为命中,反之判定为未命中。
3. 对于退化方形弹而言,当其碰撞箱退化成一条线段时,如果构成自机判定区的点在碰撞箱的点集中,则判定为命中,反之判定为未命中;当其碰撞箱退化成一个点,如果其坐标与自机中心坐标完全一致,则判定为命中,反之判定为未命中。
你的程序需要处理三种操作:
1. 将自机中心移动到某个点
)
,输入格式为“1 x y”(不包括双引号)。
2. 判断当前在位置
)
处的点弹(指碰撞箱)此时是否命中自机,输入格式为“2 x y”(不包括双引号)。
3. 判断当前左下角在位置
)
处,右上角坐标在位置
)
处的方形弹(指碰撞箱)此时是否命中自机,输入格式为“3 x1 y1 x2 y2”(不包括双引号)。
对于操作2和3,你的程序需要输出1表示自机被命中,输出0表示未被命中。
对于操作1,你的程序需要输出2表示自机发生移动(自机中心改变),输出3表示自机未发生移动(自机中心没有改变)。
图一给出了部分几种命中情形,图二给出了部分几种未命中情形。(注:颜色仅为了方便区分两个区域)
图一:
图二: