问题描述
在二维游戏界面设计中,我们需要用点来表示游戏中的角色位置。需要设计一个 Point 类来表示二维坐标点,并提供相关功能方法。
代码实现
Point.scala - 主类定义
package FinalsProject.student
// 定义 Point 类
class Point(var x: Double, var y: Double) {
// 方法1:判断点所在象限
def whereAmI(): String = {
if (x > 0 && y > 0) "第一象限"
else if (x < 0 && y > 0) "第二象限"
else if (x < 0 && y < 0) "第三象限"
else if (x > 0 && y < 0) "第四象限"
else if (x == 0 && y == 0) "原点"
else if (x == 0) "在 y 轴上"
else "在 x 轴上"
}
// 方法2:计算到原点的距离
def getDist(): Double = {
math.sqrt(x * x + y * y)
}
// 方法3:计算与另一个点的距离
def fromPoint(other: Point): Double = {
val dx = x - other.x
val dy = y - other.y
math.sqrt(dx * dx + dy * dy)
}
// 方法4:重写 equals 方法判断是否为同一个点
override def equals(obj: Any): Boolean = {
obj match {
case p: Point => x == p.x && y == p.y
case _ => false
}
}
// 方法5:重写 toString 方法,友好输出点信息
override def toString: String = {
s"Point($x, $y)"
}
}
代码解析
- 类定义:
Point类有两个可变属性x和y,通过构造器参数初始化 - 象限判断:
whereAmI方法通过判断坐标值的正负来确定点所在的象限或坐标轴 - 距离计算:
getDist使用勾股定理计算到原点的距离fromPoint计算与另一个点的距离,使用两点间距离公式
- 相等性判断:重写
equals方法,当两个点的 x 和 y 坐标都相等时返回 true - 字符串表示:重写
toString方法,提供格式化的坐标输出
LabelPoint.scala - 子类扩展
package FinalsProject.student
// 定义 LabelPoint 子类,继承自 Point
class LabelPoint(label: String, x: Double, y: Double) extends Point(x, y) {
override def toString: String = {
s"LabelPoint($label, $x, $y)"
}
}
代码解析
- 继承关系:
LabelPoint继承自Point类,具有点的所有特性 - 额外属性:添加了
label属性用于标记点的类型或名称 - 方法重写:重写
toString方法,在输出中包含标签信息
PointTest.scala - 测试代码
package FinalsProject.student
// 测试代码
object PointTest extends App {
val p1 = new Point(1, 1)
println(p1.whereAmI()) // 第一象限
println(p1.getDist()) // 约1.4142
val p2 = new Point(2, 3)
println(p1.fromPoint(p2)) // 约2.2361
val p3 = new Point(1, 1)
println(p1 == p3) // true
val lp = new LabelPoint("black", 1, 2)
println(lp) // LabelPoint(black, 1.0, 2.0)
}
代码解析
- 功能测试:创建多个点对象,测试各种方法的功能
- 象限判断:测试点 (1,1) 确实在第一象限
- 距离计算:验证到原点和到其他点的距离计算正确
- 相等性测试:验证两个相同坐标的点被判断为相等
- 子类测试:创建带标签的点并测试其输出格式
总结
这个实现展示了 Scala 面向对象编程的核心特性:
- 类的定义和构造器使用
- 方法的定义和实现
- 继承关系的建立
- 方法重写(override)
- 模式匹配在 equals 方法中的应用
- 字符串插值在 toString 方法中的使用
代码结构清晰,功能完整,符合面向对象的设计原则,可以很好地满足二维游戏中点坐标管理的需求。