2

http://i.stack.imgur.com/P7Ano.png <- 图片 ~..~

希望标题能提供一些信息。我目前正在用 Java 制作我的第一款游戏,我需要一些关于某段代码的帮助。

开始了:

当蛇在一个红色方块(以下称为“blob”)上移动时,该方块会用新的、随机生成的坐标重新绘制。由于这些坐标是随机生成的,因此有可能将斑点涂在我的蛇身上。

我想避免这种情况,我已经让生成随机坐标的方法根据蛇的当前坐标检查它们。蛇由 5x5px 段组成,每个段都有自己的坐标存储在 2D 数组中。

我的逻辑如下: 1)生成 X 和 Y 坐标。2)获取坐标的差异(例如,它们彼此相距多远) 3)如果它们在彼此的 COLLISIONRANGE (5px) 内 -> 不要使用这些坐标。

我真正要问的是:

这是一个好的解决方案吗?我检查这个的方式有什么明显的错误吗?当我玩游戏时,我得到了更多 System.out.println("Log: No-go spawn #" + i); 的触发器。我有记录比我认为是自然的。

似乎随机生成的坐标在蛇段的 COLLISIONRANGE 范围内过于频繁,以至于一切都正确。

我的方法:

private void generateBlobCoordinates() {
    Random randomGenerator = new Random();
    boolean isClearSpawn = true;

    int x = randomGenerator.nextInt(BORDER_X_MAX);
    int y = randomGenerator.nextInt(BORDER_Y_MAX);

    int xDiff;
    int yDiff;

    // If generated coords are within COLLISIONRANGE, set isClearSpawn to false
    for(int i = 0; i < snakeSegments.length; i++) {
        if(snakeSegments[i][0] != -1) {
            xDiff = Math.abs(x - snakeSegments[i][0]);
            yDiff = Math.abs(y - snakeSegments[i][1]);

            if(xDiff <= COLLISIONRANGE || yDiff <= COLLISIONRANGE) {
                isClearSpawn = false;
                System.out.println("Log: No-go spawn #" + i);
                break;
            }
        }
        else
            break;
    }

    if(isClearSpawn == true) {
        blobX = x;
        blobY = y;
    }
    else
        generateBlobCoordinates();
}
4

1 回答 1

1

你的担心是对的。您正在测试 OR 条件,但需要 AND。否则,您将在有蛇的行或列的任何地方发生碰撞!

改变

        if(xDiff <= COLLISIONRANGE || yDiff <= COLLISIONRANGE) {

        if(xDiff <= COLLISIONRANGE && yDiff <= COLLISIONRANGE) {
于 2013-02-07T02:13:15.670 回答