Battleship程式設計語言與技術

随便玩玩呀發表於2024-04-11

程式設計語言與技術
課業10:戰艦截止日期以畫布為準)對於HW10,你可以作為一個小組(不超過2名學生)工作。請提及您的每個程式碼檔案頂部的合作者姓名。這個家庭課業比以前的課業更詳細,所以請儘早開始它涉及以下主題:
● 繼承和覆蓋
● 訪問修飾符
● 抽象課程(我們將在下一堂課中瞭解這些內容)
● 二維陣列
介紹
我們將向您展示如何構建一個簡單的(只是因為沒有圖形使用者介面GUI)版本的經典遊戲《戰艦》。
戰艦通常是一個雙人遊戲,每個玩家都有一支艦隊和一片海洋(對其他玩家隱藏),並試圖成為第一個擊沉其他玩家艦隊的人。我們將只做一個播放器與計算機的版本,其中計算機放置船隻,以及人類試圖擊沉它們。我們將在10x10的“海洋”上玩這個遊戲,並將使用以下船隻(“艦隊”):1.程式設計語言與技術如何玩戰艦請看一下這些規則,即使你以前玩過《戰艦》。
請記住,這是一個人類與計算機的版本。計算機將十艘船放置在海洋上,這樣就不會立即有船隻彼此相鄰,水平地、垂直地或對角地。看看以下內容合法和非法安置示例圖:人類玩家不知道飛船在哪裡。列印的海洋的初始顯示2.程式設計語言與技術因此控制檯顯示了一個10乘10的“.”陣列(參見海洋級的描述print()方法獲取有關後續海洋顯示外觀的更多資訊喜歡人類玩家試圖透過指示特定的行和列編號(r,c)來擊中船隻。計算機會用一個資訊來回應,說“命中”或“未命中”。當一艘船被擊中但沒有沉沒時,該程式不會提供任何關於什麼型別的資訊的一艘船被擊中。然而,當一艘船被撞沉時,程式會列印出一條訊息“你剛剛擊沉了一艘船。”每次拍攝後,計算機都會重新顯示海洋資訊當一艘船的每一個方塊都被擊中時,它就被“擊沉”了。因此,它需要四支安打(四支不同的地方)擊沉戰列艦,三個擊沉巡洋艦,兩個擊沉驅逐艦,一個擊沉潛艇目標是用盡可能少的射擊擊沉艦隊;最好的分數是
20(分數越低越好。)當所有船隻都被擊沉時,程式會列印出一條訊息比賽結束了,告訴需要多少次射門。
實施細節將你的專案命名為“戰列艦”,並將你的包命名為“戰艦”。你的程式應該有以下8個類:
● 類戰艦遊戲o這是“main”類,包含main方法,該方法從建立海洋的例項
● 海洋級
o它包含一個10x10的船隻陣列,代表一個“海洋”,以及一些操作它的方法
● 抽象類船舶o這個抽象類描述了所有船隻的共同特徵
o它有子類:
3.
程式設計語言與技術級戰列艦擴充套件艦
● 描述一艘長度為4的船級巡洋艦擴充套件船
● 描述一艘長度為3的船級驅逐艦擴充套件艦
● 描述長度為2的船級潛艇擴充套件艦
● 描述長度為1的船EmptySea擴充套件船
● 描述海洋中沒有船的部分
缺少一艘船是一種型別的船,這似乎很愚蠢,但這是一種這個技巧簡化了很多事情。這樣海洋中有某種“船”。)抽象類船舶抽象的Ship類具有以下例項變數。注意:欄位應宣告為私有,除非有充分的理由不這樣做稱為“封裝”,這是使類中的欄位為私有的過程,並且透過公共方法(例如getter和setter)提供對欄位的訪問。● 私人int bowRow
o包含船頭的那一排(船的前部)
● private int-bowColumn
o包含船頭的立柱(船的前部)
● 私有int長度
o船的長度
● 私有布林水平
o一個布林值,表示船隻是水平放置還是
4.
程式設計語言與技術
垂直地
● private boolean[]命中
o一系列布林值,指示船隻的該部分是否被擊中或

Ship類的預設建構函式為:
● 公共船舶(整數長度)
o此建構函式設定特定船舶的長度屬性並初始化
基於該長度的命中陣列
Ship類中的方法如下:
吸氣劑
● public int getLength()
o返回船長
● public int getBowRow()
o返回與船頭位置相對應的行
● public int getBowColumn()o返回船頭立柱位置
● public boolean[]getHit()o返回命中陣列
● 公共布林值isHorizontal()
o返回船舶是否水平
Setters
● 公共void setBowRow(int行)
o設定bowRow的值
● public void setBowColumn(int列)5.
程式設計語言與技術
o設定bowColumn的值
● public void setHorizontal(布林水平)o將例項變數的值設定為水平
抽象方法
● 公共抽象字串getShipType()
o以字串形式返回船舶型別。每種特定型別的船舶(例如。戰列艦、巡洋艦等)必須覆蓋並實施此方法
返回相應的船舶型別。
其他方法
● boolean okToPlaceShipAt(int行,int列,布林水平,海洋)
o根據給定的行、列和方向,如果可以放置
船頭位於該位置的該長度的船舶;否則為false。船不得與另一艘船重疊,或接觸另一艘船(垂直、水平或對角),並且它不能“突出”到陣列之外。實際上也不會改變
船還是海洋——它只是說這樣做是否合法。
● void placeShipAt(int行,int列,布林水平,海洋大海
o將船“放入”大海。這涉及到給bowRow賦值,
bowColumn和船中的水平例項變數,並且它還涉及在船上的1個或多個位置(最多4個)中的每個位置放置對船的參考“海洋”物件中的陣列。(注意:這將多達四個相同的
參考文獻;你不能指一艘船的“一部分”,只能指整艘船。)o為了位置的一致性(儘管這並不會真正影響你的比賽方式遊戲),讓我們同意水平的船面向東方(船頭在右端)和垂直的船朝南(船頭在下端)。
這意味著,如果在中的位置(9,8)放置一艘水平戰列艦海洋,船頭在位置(9,8),船的其餘部分佔據
位置:(9,7),(9,6),(9,5)。
6.
程式設計語言與技術
如果你在海洋中的位置(4,0)放置一艘垂直巡洋艦,船頭位於位置(4,0),船的其餘部分佔據位置:(3,0)、(2,0)。● boolean shootAt(int行,int列)o如果船的一部分佔據了給定的行和列,而船還沒有
擊沉,將船的那一部分標記為“命中”(在命中陣列中,索引0表示bow)並返回true;否則返回false。
● 布林值isSunk()
o如果船的每個部分都被擊中,則返回true,否則返回false● @以(權力)否決
public String到String()
o返回一個單字元字串,用於Ocean的列印方法。這種方法如果船隻已沉沒,則應返回“s”,如果尚未沉沒,則返回“x”。這該方法可以用於列印出海洋中被拍攝的位置;它
不應用於列印未被拍攝的位置。由於toString
所有船舶型別的行為完全相同,它被放置在船舶類中。
類別裝運測試
這是Ship類的JUnit測試類。我們提供的ShipTest.java檔案包含此課業的一些單元測試。將會有更多針對Ship類的測試我們將執行您的程式。將ShipTest.java匯入java專案,然後在程式中的方法中實現足夠的程式碼以透過所有測試。
生成額外的場景,並將測試用例新增到每個測試方法中。你應該有一個總數每個方法(包括所提供的)至少有3個不同的場景和有效的測試用例。例如,一種情況可能是,您在中的特定位置建立並放置一艘戰列艦透過呼叫它的placeShipAt方法來識別海洋。然後你建立一個毀滅者,看看它是否可以透過呼叫其okToPlaceShipAt方法放置在特定位置。如果是,你就把它放好。然後你建立了一艘巡洋艦,並透過呼叫其
okToPlaceShipAt方法。如果是,請放置它。測試Ship類中的每個非私有方法。(不幸的是,您無法測試是私有的,因為它們在類之外無法訪問。)
還要測試Ship的每個子類中的方法。您可以測試
船舶方法及其
同一檔案中的子類。
7.
程式設計語言與技術
您必須包括註釋來解釋您的不同測試場景。
階級戰鬥遊戲
BattleshipGame類是“main”類,也就是說,它包含一個main方法。在這個課堂上你將設定遊戲;接受使用者的“射擊”;顯示結果;並列印最終版本分數。所有輸入/輸出都在這裡完成(儘管其中一些是透過呼叫print()方法完成的在海洋課上。)所有計算將在海洋級和各種船舶中進行
類。
為了幫助使用者,行數應該沿著陣列的左邊緣顯示,列
數字應沿頂部顯示。數字應該是0到9,代 寫Battleship程式設計語言與技術而不是1到10。頂部左角正方形應為0,0。使用不同的字元指示包含的位置命中、包含未命中的位置以及從未被射擊的位置。
例如,這是程式首次啟動時的海洋顯示,沒有鏡頭
被解僱。
使用各種合理的方法。不要把所有的東西都塞進一兩種方法中,但要試著把工作分成合理的部分,名字合理。
擴充套件抽象類Ship
使用抽象的船舶類作為每種船舶型別的父類。建立以下內容類,並將每個類儲存在一個單獨的檔案中。
8.
程式設計語言與技術
● 級戰列艦擴充套件艦
● 級巡洋艦擴充套件船
● 級驅逐艦擴充套件艦
● 級潛艇擴充套件艦
這些類中的每一個都有一個零引數的公共建構函式,其目的是設定長度變數設定為正確的值。從每個建構函式中,呼叫中的建構函式超級艙,每艘船都有適當的硬編碼長度值。注意:您可以儲存靜態最終變數中的硬編碼int值。
除了建構函式之外,您還必須重寫此方法:
● @以(權力)否決
公共字串getShipType()
o返回字串“戰列艦”、“巡洋艦”、“驅逐艦”之一,或“潛艇”,視情況而定。同樣,這些型別的硬編碼字串值是靜態最終變數的好候選者。
o此方法可用於識別您正在處理的船舶型別,
在任何給定的時間點,並消除了使用instanceof的需要EmptySea擴充套件船
你可能想知道為什麼“EmptySea”是一種船。答案是海洋包含一個Ship陣列,其每個位置都是(或可以是)某個Ship的引用。如果特定的位置是空的,顯而易見的做法是在該位置放置一個null。但是這個顯而易見的方法存在的問題是,每次我們檢視陣列中的某個位置時必須檢查它是否為空。透過將非null值放在空位置,表示如果沒有船,我們可以省去所有的空檢查。
EmptySea類的建構函式是:
● 公共EmptySea()
o這個零引數建構函式透過呼叫
超類中的建構函式
9
程式設計語言與技術
EmptySea類中的方法如下:
● @以(權力)否決
boolean shootAt(int行,int列)o此方法覆蓋繼承的shootAt(int行,int列)來自Ship,並且總是返回false表示沒有命中任何東西● @以(權力)否決
布林值isSunk()
o此方法覆蓋從Ship繼承的isSunk(),並且始終返回false表示您沒有沉沒任何東西
● @以(權力)否決
public String到String()
o返回要在Ocean的列印方法中使用的單個字元“-”字串。(注意,這是在開槍但什麼都沒有的情況下要顯示的角色已被擊中。)
● @以(權力)否決
公共字串getShipType()
o此方法只返回字串“empty”
Class Ocean
例項變數
● 私人船舶[][]ships=新船舶[10][10]o用於快速確定哪艘船在任何給定位置
● 私人內部快照已點燃
o使用者開槍的總次數
● private int hitCount
o一槍擊中船隻的次數。如果使用者拍攝船隻的同一部分
不止一次,每一次點選都會被計算在內,即使額外的“點選”不會起到作用使用者任何好。
● 私人內部運輸Unk
10
程式設計語言與技術
o沉沒船隻數量(共10艘)
建造師
● 公共海洋()
o建立一個“空”海洋(並用EmptySea物件填充船隻陣列)。您可以建立一個私有的助手方法來完成此操作。
o還初始化任何遊戲變數,例如已經發射了多少槍。
方法
● void placeAllShipsRandomly()o將所有十艘船隨機放置在(最初是空的)海洋上。放置較大的船隻在較小的船隻之前,否則你可能最終沒有合法的地方放置一艘大船。您將希望在java.util包中使用Random類,因此在Java API中。
o要幫助您編寫此方法的程式碼,請參考printWithShips()方法如下。它將使您能夠看到船隻實際放置在
海洋,而你正在編寫和除錯你的程式。
● boolean isOccupated(int行,int列)o如果給定位置包含船隻,則返回true;如果沒有,則返回false● boolean shootAt(int行,int列)o如果給定位置包含一艘仍在漂浮的“真實”船隻(而不是EmptySea),否則為false。此外,此方法還會更新的數量已經發射的子彈和命中次數。
o注意:如果一個位置包含一艘“真實”船隻,shootAt每次都應返回true使用者在相同的位置拍攝。一旦船隻被“擊沉”
在其位置的射擊應該返回假。
● int getShotsFired()
o返回射擊次數(在遊戲中)
● int getHitCount()
o返回(在遊戲中)記錄的命中次數。所有點選都會被計算在內,而不僅僅是11
程式設計語言與技術
第一次擊中給定的方塊。
● int getShipsSunk()
o返回沉沒的船隻數量(在遊戲中)
● 布林值isGameOver()
o如果所有船隻都已沉沒,則返回true,否則返回false● Ship[][]getShipArray()
o返回10x10的艦船陣列。Ship類中接受的方法海洋參數需要能夠看到這個陣列的內容;這個
placeShipAt()方法甚至需要對其進行修改允許一個類中的方法直接訪問另一類中的例項變數,
有時沒有好的選擇。
● 無效列印()
o列印海洋。為了幫助使用者,應沿
陣列的左邊緣,列編號應沿頂部顯示。
數字應該是0到9,而不是1到10。
o左上角的正方形應為0,0。
o'x':用'x'表示你向(真實)船隻開火併擊中的位置。(參考Ship類中toString的描述)
o“-”:使用“-”表示您開火但一無所獲的位置
那裡(參考EmptySea類中toString的描述)o's':使用's'表示沉船所在的位置。(參考
Ship類中toString的描述)
o'.':並使用“。”(句號)表示你從未向其開火的地點o這是Ocean類中唯一一個進行任何輸入/輸出的方法從未從海洋級中呼叫,只從戰艦遊戲中呼叫

例如,這裡展示了兩次射擊失誤後的海洋。
12
程式設計語言與技術
這是兩槍未中,一槍擊中(真實)船隻後的海洋展示。
為了進一步幫助您瞭解如何編寫此方法的程式碼,以下是
列印海洋的(高階)邏輯:
對於10乘10陣列中的每個位置(“海洋”)
● 如果該地點包含一艘沉沒的船隻,或者該地點曾遭到槍擊並被擊中或者什麼也沒找到
○ 列印船舶本身——這將呼叫船舶類或任何船舶中的toString已定義toString的子類(即EmptySea)● 否則列印“。”
● 無效列印WithShips()
o僅用於除錯目的。
o與print()方法一樣,該方法使用行號列印海洋沿陣列的左邊緣顯示,列編號沿
頂部。數字應該是0到9,而不是1到10。左上角正方形13
程式設計語言與技術
應為0,0。
o與print()方法不同,該方法顯示船隻的位置。此方法可以在開發和除錯期間使用,以檢視船隻實際上被安置在海洋中。(TA也可以使用執行程式和評分時使用的方法。)它可以從呼叫戰艦遊戲類,在建立海洋並在其中放置船隻之後。
o在實際播放之前,一定要註釋掉對該方法的任何呼叫遊戲和提交Java專案之前。
o'b':用'b'表示戰列艦。
o'c':用'c'表示巡洋艦。
o'd':用'd'表示驅逐艦。
o's':用's'表示潛艇。
o“”:使用“”(單個空格)表示EmptySea。例如,以下是建立海洋後的海洋顯示,呼叫
隨機放置所有發貨,然後呼叫printWithShips。歡迎您編寫自己的其他方法。其他方法應具有
預設訪問許可權(可在包中的任何位置訪問)並進行測試,如果您認為他們有一些在這個類之外的有用性。如果你認為它們在這個類之外沒有任何用處,請標記他們是私人的。Class OceanTest14程式設計語言與技術這是Ocean類的JUnit測試類。我們提供的OceanTest.java檔案包含此課業的一些單元測試。將有更多的海洋測試
我們將執行您的程式所針對的類。將OceanTest.java匯入java專案並在程式中的方法中實現足夠的程式碼以透過所有測試。生成附加場景並將測試用例新增到每個測試中

相關文章