【HeadFirst系列之HeadFirstJava】第5天之超强力方法 —— 从战舰游戏到循环控制

Scroll Down

编写程序:超强力方法 —— 从战舰游戏到循环控制

在《Head First Java》的第五章节中,作者通过一个简单的战舰游戏示例,深入讲解了如何编写Java程序,并重点介绍了方法循环控制的使用。这一章节的核心思想是:通过模块化的方法和高效的循环控制,我们可以编写出结构清晰、功能强大的程序

今天,我们将通过书中的内容,结合代码示例,来深入理解如何编写一个简单的战舰游戏,并掌握 for 循环和增强 for 循环的使用。

05-编写程序-超强力方法-前言

简单版战舰游戏设计

我们的目标是编写一个简单的战舰游戏,游戏的规则如下:

  1. 游戏板是一个 7x7 的网格,战舰占据连续的 3 个格子。
  2. 玩家通过输入坐标来猜测战舰的位置。
  3. 如果猜中战舰的所有格子,游戏结束,玩家获胜。

游戏设计伪代码

1. 初始化游戏板
2. 随机放置战舰
3. 开始游戏循环:
   a. 获取玩家输入
   b. 检查玩家输入是否命中战舰
   c. 更新游戏状态
   d. 检查游戏是否结束
4. 游戏结束,输出结果

代码实现

1. 初始化游戏板

我们用一个 7x7 的数组来表示游戏板,并用 false 表示未命中,true 表示命中。

public class BattleshipGame {
    private boolean[][] board = new boolean[7][7];  // 游戏板
    private int shipStartRow, shipStartCol;         // 战舰的起始位置
    private int hitsRemaining = 3;                  // 剩余未命中的战舰格子

    public static void main(String[] args) {
        BattleshipGame game = new BattleshipGame();
        game.setupGame();
        game.startGame();
    }

    // 初始化游戏
    void setupGame() {
        // 随机放置战舰
        shipStartRow = (int) (Math.random() * 5);  // 0-4 之间的随机数
        shipStartCol = (int) (Math.random() * 5);  // 0-4 之间的随机数
        for (int i = 0; i < 3; i++) {
            board[shipStartRow][shipStartCol + i] = true;  // 战舰占据连续的 3 个格子
        }
    }
}

2. 开始游戏循环

我们使用一个 while 循环来实现游戏的主逻辑,直到玩家猜中所有战舰格子为止。

void startGame() {
    Scanner scanner = new Scanner(System.in);
    while (hitsRemaining > 0) {
        System.out.print("Enter a row (0-6): ");
        int row = scanner.nextInt();
        System.out.print("Enter a column (0-6): ");
        int col = scanner.nextInt();

        if (checkHit(row, col)) {
            System.out.println("Hit!");
            hitsRemaining--;
        } else {
            System.out.println("Miss!");
        }
    }
    System.out.println("You sank my battleship!");
}

// 检查玩家输入是否命中战舰
boolean checkHit(int row, int col) {
    if (row >= 0 && row < 7 && col >= 0 && col < 7) {
        return board[row][col];
    }
    return false;
}

循环控制:for 循环与增强 for 循环

1. for 循环

for 循环是Java中最常用的循环结构,适用于已知循环次数的情况。

语法

for (初始化; 条件; 更新) {
    // 循环体
}

代码示例

for (int i = 0; i < 7; i++) {
    for (int j = 0; j < 7; j++) {
        System.out.print(board[i][j] ? "X " : "O ");
    }
    System.out.println();
}

2. 增强 for 循环

增强 for 循环(也称为 for-each 循环)适用于遍历数组或集合中的元素。

语法

for (元素类型 元素变量 : 数组或集合) {
    // 循环体
}

代码示例

int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
    System.out.println(number);
}

完整代码

import java.util.Scanner;

public class BattleshipGame {
    private boolean[][] board = new boolean[7][7];  // 游戏板
    private int shipStartRow, shipStartCol;         // 战舰的起始位置
    private int hitsRemaining = 3;                  // 剩余未命中的战舰格子

    public static void main(String[] args) {
        BattleshipGame game = new BattleshipGame();
        game.setupGame();
        game.startGame();
    }

    // 初始化游戏
    void setupGame() {
        // 随机放置战舰
        shipStartRow = (int) (Math.random() * 5);  // 0-4 之间的随机数
        shipStartCol = (int) (Math.random() * 5);  // 0-4 之间的随机数
        for (int i = 0; i < 3; i++) {
            board[shipStartRow][shipStartCol + i] = true;  // 战舰占据连续的 3 个格子
        }
    }

    // 开始游戏
    void startGame() {
        Scanner scanner = new Scanner(System.in);
        while (hitsRemaining > 0) {
            System.out.print("Enter a row (0-6): ");
            int row = scanner.nextInt();
            System.out.print("Enter a column (0-6): ");
            int col = scanner.nextInt();

            if (checkHit(row, col)) {
                System.out.println("Hit!");
                hitsRemaining--;
            } else {
                System.out.println("Miss!");
            }
        }
        System.out.println("You sank my battleship!");
    }

    // 检查玩家输入是否命中战舰
    boolean checkHit(int row, int col) {
        if (row >= 0 && row < 7 && col >= 0 && col < 7) {
            return board[row][col];
        }
        return false;
    }
}

总结

通过《Head First Java》第五章节的内容,我们实现了一个简单的战舰游戏,并深入理解了 for 循环和增强 for 循环的使用。方法的使用使得代码更加模块化,而循环控制则帮助我们高效地处理重复任务。

希望这篇文章能帮助你更好地理解如何编写Java程序,并在实际开发中灵活运用这些知识!


互动话题:你在编写Java程序时使用过哪些循环结构?欢迎在评论区分享你的经验和心得!