import java.util.Random;
import java.util.Scanner;
// 主游戏类
public class StarWarsGame {
// 宏定义,用于设定游戏中的常量
private static final int MAX_HEALTH = 100;
private static final int MIN_ATTACK = 10;
private static final int MAX_ATTACK = 20;
// --- 角色内部类定义 ---
// `Character` 类用于代表一个战斗角色,包含其姓名、生命值和攻击力。
static class Character {
String name;
int health;
int attackPower;
// 构造函数
public Character(String name, int health, int attackPower) {
this.name = name;
this.health = health;
this.attackPower = attackPower;
}
/**
* 模拟角色进行一次攻击。
*
* @param defender 被攻击的角色。
* @param random 随机数生成器。
*/
public void attack(Character defender, Random random) {
// 随机计算本次攻击造成的伤害
int damage = random.nextInt(MAX_ATTACK - MIN_ATTACK + 1) + MIN_ATTACK;
// 绝地武士或西斯尊主用他们的光剑进行攻击
defender.health -= damage;
// 确保生命值不会低于0
if (defender.health < 0) {
defender.health = 0;
}
// 打印战斗日志
System.out.printf("%s 用光剑攻击 %s,造成 %d 点伤害!\n", this.name, defender.name, damage);
}
}
// --- 主函数 ---
public static void main(String[] args) {
// 设置随机数生成器
Random random = new Random();
System.out.println("欢迎来到光剑对决!");
// 创建两个星球大战角色
// `jedi` 代表绝地武士,`sith` 代表西斯尊主
Character jedi = new Character("Luke Skywalker", MAX_HEALTH, 15);
Character sith = new Character("Darth Vader", MAX_HEALTH, 18);
System.out.printf("绝地武士 %s vs. 西斯尊主 %s\n\n", jedi.name, sith.name);
// 显示初始状态
displayStats(jedi, sith);
// --- 游戏主循环 ---
// 只要双方都还有生命值,战斗就继续
while (!isGameOver(jedi, sith)) {
// 绝地武士攻击
jedi.attack(sith, random);
// 如果游戏结束,则跳出循环
if (isGameOver(jedi, sith)) break;
// 西斯尊主攻击
sith.attack(jedi, random);
System.out.println();
// 显示当前状态
displayStats(jedi, sith);
}
// --- 游戏结束 ---
System.out.println("---------------------------");
System.out.println("对决结束!");
// 根据最终生命值判断胜者
if (jedi.health > 0) {
System.out.printf("%s 赢得了这场光剑对决!愿原力与你同在!\n", jedi.name);
} else {
System.out.printf("%s 赢得了这场光剑对决!黑暗面占了上风!\n", sith.name);
}
}
// --- 函数实现 ---
/**
* @brief 显示两个角色的当前生命值。
* @param player1 第一个角色。
* @param player2 第二个角色。
*/
public static void displayStats(Character player1, Character player2) {
System.out.printf("%s 的生命值: %d\n", player1.name, player1.health);
System.out.printf("%s 的生命值: %d\n", player2.name, player2.health);
System.out.println("---");
}
/**
* @brief 检查游戏是否结束。
* @param player1 第一个角色。
* @param player2 第二个角色。
* @return 如果任一角色的生命值归零,返回true(游戏结束),否则返回false。
*/
public static boolean isGameOver(Character player1, Character player2) {
// 只要有一方生命值小于等于0,游戏就结束
return player1.health <= 0 || player2.health <= 0;
}
}
这是一个用 Java 语言重写的星球大战程序。它采用了面向对象的编程思想,将角色(Character)定义为一个独立的类,使得代码结构更加清晰。
这个 Java 版本使用了 Character 类来封装角色的属性和行为,这比 C 语言中的结构体更符合面向对象的思想。攻击逻辑被封装在 Character 类内部的 attack 方法中,使得代码更具模块化和可读性。