主頁 >  其他 > 一道面試題--設計炸船互動游戲

一道面試題--設計炸船互動游戲

2021-09-07 08:17:36 其他

游戲規則

游戲分為甲乙雙方兩人,游戲規則如下

  1. 游戲雙方各擁有一個 10*10 的地圖中部署戰艦進行初始化分布,布局完成后,玩家只能
    看到自己戰艦,看不到對方戰艦,
  2. 戰艦有三種形狀, 每個玩家分別擁有每個模型的一條戰艦,三個模型分別為:

在這里插入圖片描述
三種戰艦可以自由旋轉,
例:甲為紅色,已為藍色,初始布局可以如下:
乙方地圖(戰艦只對乙方可見)
在這里插入圖片描述
甲方地圖(戰艦只對甲方可見)
在這里插入圖片描述

  1. 游戲開始,甲乙兩人輪流挑選對方坐標進行炸彈盲投,如果炸彈擊中對方戰艦,則標記
    擊中,如果沒有擊中,標記 miss,如果一個戰艦的所有位置都被擊中,該戰艦標記位沉
    沒,
  2. 戰艦全部沉沒者為失敗方,游戲結束,

要求

  1. 設計游戲資料結構,流程以及相關物件 Class. 無需設計 UI 界面,
  2. 描述如何啟動游戲,初始化游戲,進行游戲,以及游戲結束,
  3. 描述如何對該游戲測驗

附加要求

  1. 如果船只有多種不規則形狀,如何改進現有系統?
    例如引入新型戰艦模型:
    在這里插入圖片描述
  2. 如果雙方在游戲中各有一次移動一只戰艦坐標的機會,如何添加該功能?

以下是我自己的一些解題思路,僅供參考:

1.相關物件(包含代碼注釋)

通過分析游戲設計需求,定義游戲界面為橫向 X 軸坐標,縱向 Y 軸,
不同戰艦形狀均是以多個 xy 軸坐標上的點假設為 node 物件構成,
利用享元模式,定義 node 物件,而不同的戰艦均是以 node 物件基
于組合模式構成,通一個 ship 中的所有 node 基于雙向鏈表資料結構
組成,ship 中只需要存盤該戰艦 ship 的 firstNode 即可(鏈表的查詢
速度最優,便于查詢 node 并做炮彈擊中等邏輯判斷時對 node 的遍
歷查詢),其中 firstNode 為戰艦的左上腳第一個 node;ship 的初始
化是基于工廠模式實作,01,02,03 分別對應 a\b\c 三類戰艦;

戰艦相關物件及含義
public class Node {
/**
* 每個節點的顏?, --如果被轟炸之后,那節點顏?就是灰?
*/
private NodeColor nodeColor;
private int x;
private int y;
private Node preNode;
private Node nextNode;
public NodeColor getNodeColor() {
return nodeColor;
}
public void setNodeColor(NodeColor nodeColor) {
this.nodeColor = nodeColor;
}public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Node getPreNode() {
return preNode;
}
public void setPreNode(Node preNode) {
this.preNode = preNode;
}
public Node getNextNode() {
return nextNode;
}
public void setNextNode(Node nextNode) {this.nextNode = nextNode;
}
public boolean changeColor(NodeColor color){
this.nodeColor = color;
return true;
} }

NodeColor 列舉型別用于標識 node 的不同顏色,當 node 被擊中,則修改當前 node 的顏
色--如置灰
nodeColor 如下:
public boolean changeColor(NodeColor color){
this.nodeColor = color;
return true;
}
通過工廠類創建戰艦,工廠類的代碼如下:
public class ShipFactory {
public static Map<NodeColor,int[][]> allMap = new ConcurrentHashMap<>(3);
static {
/**
* 虛擬地圖-編號 0-9 ,?實際 UI 中是 1-10
*/
int[][] shipNodeMap4Red = new int[10][10];//紅?地圖
int[][] shipNodeMap4Blue = new int[10][10];//藍?地圖allMap.put(NodeColor.RED,shipNodeMap4Red);
allMap.put(NodeColor.BLUE,shipNodeMap4Blue);
}
public static Ship getInstance(String shipType,NodeColor color,int x,int y){
if (0 < x && x <= 10 && 0 < y && y <= 10){
if("01".equals(shipType)){
/**
* 橫向三點戰艦
*/
if(x -2 > 0 && x < 11 && y > 0 && y < 11 ){
Node firstNode = new Node(color,x , y, null );//左側 node
Node midNode = new Node(color,x- 1, y , firstNode);
Node endNode = new Node(color,x - 2, y, midNode);
if(checkCanBeCreate(firstNode,midNode,endNode)){//判斷 node 是否存在重
復
firstNode.setNextNode(midNode);
midNode.setNextNode(endNode);
endNode.setNextNode(null);
addNodes2Map(firstNode,midNode,endNode);//創建成功之后,記錄創建
記錄return new Ship(true,firstNode);
}else{
firstNode = null;
midNode = null;
endNode = null;
clearNode(firstNode,midNode,endNode);
}
return new Ship(false);
}
return new Ship(false);
}else if("02".equals(shipType)){
/**
* 四點戰艦
*/
if(x -1 > 0 && y - 1 > 0 && x + 1 < 11 && y + 1 < 11){
Node firstNode = new Node(color,x , y, null );//左上? node
Node secondNode = new Node(color,x + 1, y , firstNode);
Node thirdNode = new Node(color,x , y -1 , secondNode);
Node endNode = new Node(color,x + 1 , y -1 , thirdNode);
if(checkCanBeCreate(firstNode,secondNode,thirdNode,endNode)){//判斷node 是否存在重復
firstNode.setNextNode(secondNode);
secondNode.setNextNode(thirdNode);
thirdNode.setNextNode(endNode);
endNode.setNextNode(null);
addNodes2Map(firstNode,secondNode,thirdNode,endNode);//創建成功之
后,記錄創建記錄
return new Ship(true,firstNode);
}else{
firstNode = null;
secondNode = null;
thirdNode = null;
endNode = null;
clearNode(firstNode,secondNode,thirdNode,endNode);
}
return new Ship(false);
}
return new Ship(false);
}else {
/*** 縱向兩點戰艦
*/
if(y -1 > 0 && y< 11 && x >0 && x < 11){
Node firstNode = new Node(color,x , y, null );//左側 node
Node endNode = new Node(color,x - 1, y, firstNode);
if(checkCanBeCreate(firstNode,endNode)){//判斷 node 是否存在重復
firstNode.setNextNode(endNode);
endNode.setNextNode(null);
addNodes2Map(firstNode,endNode);//創建成功之后,記錄創建記錄
return new Ship(true,firstNode);
}else{
firstNode = null;
endNode = null;
clearNode(firstNode,endNode);
}
return new Ship(false);
}
return new Ship(false);
}
}return null;
}
/**
* 當前您地圖中是否已經存在相關 node--防?兩個 node 重復
* @param nodes
* @return
*/
private static boolean checkCanBeCreate(Node... nodes){
for (Node node:nodes ) {
int[][] shipNodeMap = allMap.get(node.getNodeColor());
if(shipNodeMap[node.getX() - 1][node.getY() - 1 ] == 1 ){
return false;
}
}
return true;
}/**
* 將創建過的 node 記錄在記憶體地圖中
* @param nodes
* @return
*/
private static boolean addNodes2Map(Node... nodes){
for (Node node:nodes ) {
int[][] shipNodeMap = allMap.get(node.getNodeColor());
shipNodeMap[node.getX() - 1][node.getY() - 1 ] = 1;
}
return true;
}
/**
* 清除垃圾物件,防?記憶體泄漏
* @param nodes
*/
private static void clearNode(Node ... nodes){
for (Node node:nodes ) {
node.setNextNode(null);
node.setNextNode(null);
}}
}

以上物件為?個戰艦所需要的所有構成要素相關的核?類

炸彈相關物件及含義
public class Bomb {
private int killNodeNum;//當前?彈的威?,默認為 1,即默認只能炸毀?個節點所在的船艦--可
以增加多種模式
private int speed ; //炸彈運?速度,默認為 2, --炸彈每秒移動兩個 node 距離()
private NodeColor selfColor;// 豁免標識,防?炸彈誤炸??
/**
* 轟炸?標點的坐標,當炸彈擊中當前坐標時,通過判斷當前點在地?地圖中是否存在 node,如果
存在則將該敵?
* 的 node 物件查找到并修改其顏?為"NodeColor.GRAY", ?當前 node 所屬的 ship,執?戰損評
估邏輯,如果當前
* ship 的所有 node 顏?都為"NodeColor.GRAY",即當前 ship 被擊毀
*/
private int destXValue;
private int destYValue;/**
* 炸彈構造?法
* @param killNodeNum
* @param destXValue
* @param destYValue
*/
public Bomb(int killNodeNum, int destXValue, int destYValue) {
this.killNodeNum = killNodeNum;
this.destXValue = destXValue;
this.destYValue = destYValue;
}
public NodeColor getSelfColor() {
return selfColor;
}
public void setSelfColor(NodeColor selfColor) {
this.selfColor = selfColor;
}
public int getSpeed() {return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getKillNodeNum() {
return killNodeNum;
}
public void setKillNodeNum(int killNodeNum) {
this.killNodeNum = killNodeNum;
}
public int getDestXValue() {
return destXValue;
}
public void setDestXValue(int destXValue) {
this.destXValue = destXValue;
}public int getDestYValue() {
return destYValue;
}
public void setDestYValue(int destYValue) {
this.destYValue = destYValue;
}
}

2 游戲程序

  1. 游戲采用聯網對戰模式,雙方需要在規定時間內盡可能多的擊毀敵方戰艦;用戶可以自由創建自己的對戰房間,然后等待對手進入房間發起挑戰,對戰雙方分為紅藍顏色標識,紅方具有先行發射炮彈的權利,每方發射一發炮彈之后必須等待對方發射炮彈之后才能進行下一發炮彈的發射操作,戰艦位置由系統隨機生成;
  2. 對戰程序中,任意一方可以在海圖中選擇炮彈的打擊坐標,選中并擊發之后,根據炮彈的威力引數攻擊敵艦,目前默認為 1,即只能攻擊坐標中的戰艦;炮彈的運行軌跡和顏色根據本次發射炮彈的己方戰艦以及炮彈的豁免顏色決定(豁免顏色與本方的戰艦顏色一致);當炮彈擊中目標區域之后,判斷是否擊中敵方戰艦,并在游戲界面顯示戰果資訊,同時敵方顯示戰損資訊
  3. 當游戲規定時間到了卻沒有任何一方戰艦全部被擊毀時,根據雙方擊中的次數和戰果分數,得分高者獲勝,飯制失敗;如果在游戲規定時間內任意一方戰艦全部被擊毀,則另一方獲勝!

3. 游戲測驗

  1. 使用 junit 測驗框架,對游戲進行單元測驗,單元測驗需要在開發階段完成
  2. 功能測驗,部署測驗環境,按照用戶的各項功能分別進行測驗
  3. 壓力測驗,根據游戲設計指標,在特定環境(帶寬、硬體資源等)下,對游戲的運行能力進行壓力測驗

4. 添加其它形狀戰艦

  • 方法一,在工廠類中增加新的戰艦型別,如同戰艦 a\b\c 三種型別一樣,基于Node 物件生成新的戰艦即可
  • 方法二、理由現有戰艦型別組合,要求總希望增加的戰艦 D,正好可以是戰艦 a\c兩種型別組合可以得到,由于才有了雙向鏈表方式,只需要將兩個型別的鏈表連接起來即可實作

5. 如何添加戰艦移動功能

由于對戰雙方只有一次移動任何一艘戰艦的機會,則

  • 第一步,則游戲的介紹中宣告添加此功能,該功能允許用戶在對戰程序中上下左右任意方向移動一次戰艦,且只允許使用一次,
  • 第二步,在游戲界面的右下角顯示上下左右操作虛擬按鍵,當用戶已經使用過此功能時,則應該立即置灰,表示已經無法再次使用,目前代碼中我增加了相應限制,即不允許同一個點存在兩個 node,也就是說戰艦的移動不能覆寫到另一個戰艦(可通過代碼修改),

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298116.html

標籤:其他

上一篇:帶你新學期領跑!8000字吐血總結資料結構之單鏈表

下一篇:初學docker容器

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more