You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用x、y坐标计算两点距离及实现FindAirport游戏并修正类构造问题

嘿,我来帮你一步步搞定这三个问题——先讲清楚两点距离的计算方法,然后修复Airplane类的构造函数bug,最后完整实现FindAirport游戏。

一、用x、y坐标计算两点间距离

两点之间的距离用欧几里得距离公式计算就可以了。假设点A的坐标是(x1, y1),点B是(x2, y2),公式是:

距离 = √[(x2 - x1)² + (y2 - y1)²]

在Java里可以这样实现(用乘法代替Math.pow效率更高):

public static double calculateDistance(double x1, double y1, double x2, double y2) {
    double deltaX = x2 - x1;
    double deltaY = y2 - y1;
    return Math.sqrt(deltaX * deltaX + deltaY * deltaY);
}
二、修复Airplane类的构造函数问题

你给的Airplane构造函数犯了个常见的小错误——赋值顺序搞反了!原来的代码里x = this.x是把成员变量的默认值(0.0)赋值给参数x,完全没初始化对象的坐标。正确的写法应该是用this指代成员变量,把参数的值赋给它:

修正后的Airplane类:

public class Airplane {
    private double x;
    private double y;

    // 修正构造函数:把参数值赋给成员变量
    public Airplane(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public void fly(double angle, double distance) {
        x += Math.cos(Math.toRadians(angle)) * distance;
        y += Math.sin(Math.toRadians(angle)) * distance;
    }

    public double getX() { return this.x; }
    public double getY() { return this.y; }
}

这样创建Airplane对象时,传入的x、y坐标才会正确赋值给对象的成员变量。

三、实现FindAirport游戏

接下来我们用修正后的Airplane类来实现游戏逻辑。游戏的核心流程是:

  • 在1000×1000的范围内随机生成机场(静止)和玩家操控的飞机
  • 循环接收用户输入的飞行角度和距离,让飞机飞行
  • 每次飞行后计算飞机与机场的距离并告知用户
  • 当距离≤5英里时,结束游戏并显示飞行次数

完整的游戏代码(包含主类):

import java.util.Random;
import java.util.Scanner;

public class FindAirportGame {
    public static void main(String[] args) {
        Random random = new Random();
        Scanner scanner = new Scanner(System.in);

        // 随机生成机场(静止)和玩家飞机的初始坐标(0-1000之间)
        Airport airport = new Airport(random.nextDouble() * 1000, random.nextDouble() * 1000);
        Airplane playerPlane = new Airplane(random.nextDouble() * 1000, random.nextDouble() * 1000);

        int flightCount = 0;
        boolean gameOver = false;

        System.out.println("欢迎来到FindAirport游戏!");
        System.out.println("你的目标是操控飞机找到机场,当距离机场5英里以内时游戏结束。");
        System.out.println("每次飞行请输入:飞行角度(度,0-360)和飞行距离(英里)");

        while (!gameOver) {
            // 计算当前距离
            double distance = calculateDistance(
                playerPlane.getX(), playerPlane.getY(),
                airport.getX(), airport.getY()
            );

            System.out.printf("当前距离机场:%.2f英里%n", distance);

            if (distance <= 5) {
                System.out.printf("恭喜你!用了%d次飞行找到机场!游戏结束。", flightCount);
                gameOver = true;
                break;
            }

            // 接收用户输入
            System.out.print("请输入飞行角度和距离(用空格分隔):");
            double angle = scanner.nextDouble();
            double distanceToFly = scanner.nextDouble();

            // 让飞机飞行
            playerPlane.fly(angle, distanceToFly);
            flightCount++;
        }

        scanner.close();
    }

    // 复用之前的距离计算方法
    private static double calculateDistance(double x1, double y1, double x2, double y2) {
        double deltaX = x2 - x1;
        double deltaY = y2 - y1;
        return Math.sqrt(deltaX * deltaX + deltaY * deltaY);
    }

    // 机场类继承Airplane,统一坐标获取方式,代码更整洁
    static class Airport extends Airplane {
        public Airport(double x, double y) {
            super(x, y);
        }
    }
}

游戏小提示:

  • 角度遵循三角函数定义:0度=正东,90度=正北,180度=正西,270度=正南
  • 每次飞行后都会显示当前距离,你可以根据距离调整飞行策略,尽量用最少次数到达目标

内容的提问来源于stack exchange,提问作者A.Plane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:57:44