概述
今天,我們來重新定義Battle Ships游戲,我們通過這個游戲來練習我們第三節(jié)到第七節(jié)課所學到的關于數(shù)組的相關知識。首先,我們定義一個游戲棋盤,這個棋盤是一個10 x 10的二維數(shù)組。在游戲棋盤中,作為玩家,可以通過指定x, y的索引來部署自己的戰(zhàn)船,玩家一共部署5艘玩家戰(zhàn)船。作為玩家的對手,計算機在游戲棋盤中隨機部署5艘計算機戰(zhàn)船。玩家和計算機輪流攻擊棋盤中的戰(zhàn)船,玩家通過輸入x, y的索引來確定攻擊的位置,計算機通過隨機生成x, y坐標值來確定攻擊位置。
Step 1: 輸出游戲棋盤
Battle Ships的游戲棋盤是由10 X 10的二維數(shù)組組成的,你需要定義一個輸出棋盤的方法,該方法負責:
- 輸出玩家戰(zhàn)船和計算機戰(zhàn)船的位置
- 記錄玩家所剩戰(zhàn)船的數(shù)量,記錄計算機所剩戰(zhàn)船的數(shù)量
在游戲剛開始時,玩家戰(zhàn)船為0,計算機戰(zhàn)船為0, 此時輸出空白棋盤,如下圖所示:

Step 2: 部署玩家戰(zhàn)船
玩家一共需要部署5艘玩家戰(zhàn)船,程序循環(huán)提示玩家直到玩家成功部署5艘戰(zhàn)船。每次,玩家通過輸入戰(zhàn)船的x, y坐標值來部署一艘戰(zhàn)船,玩家部署戰(zhàn)船的規(guī)則如下:
- 在同一個位置(x, y 相同),只能部署一艘戰(zhàn)船
- 玩家只能將戰(zhàn)船部署在棋盤中,不可以部署到棋盤以外,即(x>=0 & x<=9)和(y>=0 & y<=9),如果玩家輸入的值不滿足這個條件,則要求玩家重新輸入x或y的值。
每次玩家成功地部署一艘玩家戰(zhàn)船,將二維數(shù)組該位置的值設為1,標識這是一個玩家戰(zhàn)船。
注意:要接收從控制臺輸入的信息,可以使用Java中的java.util.Scanner
import java.util.Scanner;
public class BattleShipGame {
public static void main(String[] arg){
int[][] myArrayMap = new int[10][10];
Scanner input = new Scanner(System.in);
...
...
System.out.print("Enter X coordinate for your ship: ");
int x = input.nextInt();
...
...
}
}
當5艘玩家戰(zhàn)船部署完成, 需要打印出當前游戲棋盤中戰(zhàn)船的位置,在有玩家戰(zhàn)船的位置,輸出@,這時輸出結果如下:

Step 3: 部署計算機戰(zhàn)船
計算機戰(zhàn)船一共5艘,需要由程序隨機確定計算機戰(zhàn)船的位置,部署計算機戰(zhàn)船的規(guī)則如下:
- 計算機戰(zhàn)船不可以部署在已經(jīng)有玩家戰(zhàn)船或其他計算機戰(zhàn)船的位置上
- 計算機戰(zhàn)船不可以部署在游戲棋盤之外
注意: 計算機隨機生成(x, y)的值,用到了Java中的java.util.Random,示例代碼如下:
Random rand = new Random();
int csX = rand.nextInt(10);
int csY = rand.nextInt(10);
每當計算機成功部署一艘戰(zhàn)船,將二維數(shù)組該位置的值設為2,標識這是一條計算機戰(zhàn)船,并打印一條信息到控制臺,待所有戰(zhàn)船部署完成,在有計算機戰(zhàn)船的位置,同樣輸出@,這時輸出結果如下:

Step 4: 攻擊
玩家和計算機輪流攻擊棋盤中的戰(zhàn)船, 并記錄每一次攻擊的情況。
玩家:玩家通過輸入(x, y)坐標值來確定一個攻擊位置
- 若玩家輸入的位置不合法,則繼續(xù)讓玩家重新輸入新的攻擊位置
- 若玩家成功猜中一個計算機戰(zhàn)船位置,則輸出"嘣,你成功擊毀一艘敵方戰(zhàn)船。",在輸出棋盤時,此位置輸出!來替代@
- 若玩家錯誤地攻擊自己的戰(zhàn)船,則輸出"天哪!你擊毀了一艘自己的戰(zhàn)船。",在輸出棋盤時,此位置輸出x來替代@
- 若玩家沒有攻任何擊到戰(zhàn)船,則輸出"對不起,攻擊無效。",在輸出棋盤時,此位置輸出-
計算機: 計算機通過隨機生成一個(x, y)坐標值來確定一個攻擊位置
- 若隨機生成的(x,y)不合法,則重新生成(x, y)坐標值,不合法的規(guī)則如下
- 若超出棋盤范圍,則不合法
- 若已經(jīng)猜過該位置,則不合法
- 若計算機成功猜中一個玩家戰(zhàn)船的位置,則輸出"計算機干掉了一艘玩家戰(zhàn)船",在輸出棋盤時,此位置輸出x來替代@
- 若計算機猜中一個計算機戰(zhàn)船的位置,則輸出"計算機錯誤地干掉了一艘計算機戰(zhàn)船",在輸出棋盤時,此位置輸出!來替代@
- 若計算機沒有攻擊到任何戰(zhàn)船,則輸出"計算機攻擊無效。"。
經(jīng)過幾輪攻擊以后,打印結果如下:

Step 5: 游戲結束
定義游戲結束規(guī)則:
- 當計算機剩余戰(zhàn)船數(shù)量為0, 則玩家勝
- 當玩家剩余戰(zhàn)船數(shù)量為0,則計算機勝

對輸出符號的注釋:
- "@"標識此處有戰(zhàn)船,玩家戰(zhàn)船或計算機戰(zhàn)船
- "x"標識此處一艘玩家戰(zhàn)船被擊毀
- "!"標識此處一艘計算機戰(zhàn)船被擊毀
- "-"標識玩家沒有猜中
附錄
關于該項目的示例代碼,可以從GitHub中下載Project - BattleShip