如何用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
相关产品推荐
相关产品推荐

