八: 實戰(zhàn)1-Battle Ships

概述

今天,我們來重新定義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)船的位置,輸出@,這時輸出結果如下:


玩家戰(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)船的位置,同樣輸出@,這時輸出結果如下:

計算機戰(zhàn)船部署完成

Step 4: 攻擊

玩家和計算機輪流攻擊棋盤中的戰(zhàn)船, 并記錄每一次攻擊的情況。
玩家:玩家通過輸入(x, y)坐標值來確定一個攻擊位置

  1. 若玩家輸入的位置不合法,則繼續(xù)讓玩家重新輸入新的攻擊位置
  2. 若玩家成功猜中一個計算機戰(zhàn)船位置,則輸出"嘣,你成功擊毀一艘敵方戰(zhàn)船。",在輸出棋盤時,此位置輸出!來替代@
  3. 若玩家錯誤地攻擊自己的戰(zhàn)船,則輸出"天哪!你擊毀了一艘自己的戰(zhàn)船。",在輸出棋盤時,此位置輸出x來替代@
  4. 若玩家沒有攻任何擊到戰(zhàn)船,則輸出"對不起,攻擊無效。",在輸出棋盤時,此位置輸出-

計算機: 計算機通過隨機生成一個(x, y)坐標值來確定一個攻擊位置

  1. 若隨機生成的(x,y)不合法,則重新生成(x, y)坐標值,不合法的規(guī)則如下
    • 若超出棋盤范圍,則不合法
    • 若已經(jīng)猜過該位置,則不合法
  2. 若計算機成功猜中一個玩家戰(zhàn)船的位置,則輸出"計算機干掉了一艘玩家戰(zhàn)船",在輸出棋盤時,此位置輸出x來替代@
  3. 若計算機猜中一個計算機戰(zhàn)船的位置,則輸出"計算機錯誤地干掉了一艘計算機戰(zhàn)船",在輸出棋盤時,此位置輸出!來替代@
  4. 若計算機沒有攻擊到任何戰(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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容