具有两个冲突对象的C ++控制台应用程序无法正常工作

时间:2018-09-10 16:35:27

标签: c++ collision math.h

#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;

struct spaceship { // create the ship
    int x, y;
    char callsign[51];
};

void shiprandloc(spaceship *ship, int maxrange) { //randomize location
    ship->x = rand() % maxrange;
    ship->y = rand() % maxrange;
}

int shipdetcol(spaceship *ship1, spaceship *ship2, float colrange) { //if they collide return a 1
    colrange < 10;
    return 1;
}

int main()
{
    int maxloc = 100, maxcol = 10;
    int numloops;
    cout << "Enter the Number of Collisions to Simulate: ";
    cin >> numloops;
    for (int i = 0; i < numloops; i++) {
        int loopcnt = 0;
        spaceship *ship1, *ship2;
        ship1 = new spaceship;
        ship2 = new spaceship;
        strcpy_s(ship1->callsign, "Red1");
        strcpy_s(ship2->callsign, "Blue1");
        shiprandloc(ship1, maxloc);
        shiprandloc(ship2, maxloc);
        d = sqrt((ship1->x - ship2->x)*(ship1->y - ship2->y)); //find distance between the two ships.
        while (!shipdetcol(ship1, ship2, maxcol)) {
            ++loopcnt;
        }
        delete ship1, ship2;
    }
    return 0;
}

用于检查距离的平方根函数不起作用,并且碰撞发生碰撞时返回1,如果未击中则返回0。我想念什么?

2 个答案:

答案 0 :(得分:1)

这是人类想象中的野兽

delete ship1, ship2;

删除ship2,但不删除ship1。这里的逗号被视为序列(逗号)运算符,这种表达的结果是最后一个子表达式的结果。

您的函数始终返回1。您可能表示这样的意思

int shipdetcol(spaceship &ship1, spaceship &ship2, float colrange) 
{
    return  colrange > sqrt(abs(((ship1.x - ship2.x)*(ship1.y - ship2.y)));
}

请注意,您需要坐标之间差的绝对值。

最后,它是C ++,所以不要使用:

#include <string.h>
#include <math.h>

使用

#include <cstring>
#include <cmath>

不使用

char callsign[51];    

使用

#include <string>


std::string callsign;

现在您可以这样做:

ship1 = new spaceship { 0, 0, "Red1"};

答案 1 :(得分:0)

sqrt((ship1->x - ship2->x)*(ship1->y - ship2->y));

您的sqrt会尝试取一个数字的平方根,但是如果为负,will cause a domain error to occur.因此,您应该检查任何减法是否得出负数,因为它可能会使a的乘法结果也是负数,弄乱了结果。

在这里:

colrange < 10;
return 1;

您的代码不会检查 IF 排列是否小于10,它只是在编写表达式。应该是:

if(colrange<10){
return 1;
}
else
{
return 0;
}