控制臺輸出的JAVA格斗小游戲-面向對象

重溫了黑馬的這個小程序

首先介紹一下:相當于一個小游戲,你打我一下,我打你一下;中間經歷一些來回,最終根據血量的大小來判斷誰輸誰贏,實話講黑馬整個課在這個之前的題目沒有什么難度,這個不難,但有很多小知識點忘記,以此文總結一下。

知識點梳理

1、拿到這個題目的時候需要先思考,和前面的都寫在單獨一個類中的有什么區別?如果全部寫在一個類,所有功能(角色屬性、攻擊邏輯、游戲流程)可能集中在一個類中,導致代碼冗長,難以實現復雜的游戲系統(如繼承、多態),如不同角色的特殊技能。

2、所以要分離主類(GameTest)和業務類(Role),繼續思考如何界定里面?

3、大方向是:先寫業務類(里面的多個角色實例(如喬峰、摩智)均可復用)

  • 首先先帶著數據類型和公私有去定義角色的屬性(名字、血量、性別、狀態...)
  • 然后就是利用快捷鍵(Fn+Alt+insert去調出無參和全參的構造函數<初始化對象>及getset方法
  • 最基本的處理完成后,就要思考自定義方法了(attack)和(showRoleInfo)。

4、對于set和get方法

set 方法:用于修改成員變量的值,需要參數,因為 set 方法的目的是設置成員變量的值,所以它需要一個參數來接收新的值。

  • 比較特殊的是face,這個對象得隨機生成,構造函數中也不同于其他屬性那樣直接賦值 this.某=某,它需要在set里面修改。
  • 具體操作也是利用隨機索引,調用提前在類中定義的描述男女兩長相數組的索引,注意不要忘記寫 this.某 = 數組名 [ 隨機產生的索引 ] 。
    public void setFace(char gender) {Random r = new Random();//長相是隨機的if(gender=='男'){int index = r.nextInt(boyfaces.length);this.face = boyfaces[index];}else if(gender=='女'){int index = r.nextInt(girlfaces.length);this.face = girlfaces[index];}else {this.face = "非男非女";}}

get 方法:用于讀取成員變量的值。?

5、第一個自定義方法attack,目的是實現一個角色對另一個角色的攻擊行為,需要一個 role 類型的參數來表示被攻擊的角色。

  • role.getName():獲取被攻擊角色的名字
  • this.getName():獲取當前攻擊角色的名字,this是方法的調用者(在gametest中調用)
    public void attack(Role role){//隨機攻擊效果Random r1 = new Random();int index = r1.nextInt(attack_esc.length);String kongfu = attack_esc[index];//輸出一個攻擊的效果System.out.printf(kongfu,this.getName(),role.getName());System.out.println("");//造成的隨機傷害Random r = new Random();int hurt = r.nextInt(20)+1;//修改一下挨揍人的血量int remainBlood = role.getBlood()-hurt;//剩余血量remainBlood = remainBlood<0?0:remainBlood; //驗證剩余的血量role.setBlood(remainBlood);if(remainBlood>90){System.out.printf(injureds_esc[0],role.getName());}else if(remainBlood>60){System.out.printf(injureds_esc[1],role.getName());}else {System.out.printf(injureds_esc[2],role.getName());}System.out.println("");//        //this是方法的調用者
//        System.out.println(this.getName()+"打了"+role.getName()
//                +"一下,造成了"+hurt+"傷害,"+"\n"+
//                role.getName()+"還剩"+remainBlood+"血量");}
  • 想要實現隨機攻擊效果,首先需要在方法之前寫一個字符串數組,想要生動形象的調用名詞就需要使用到 printf(允許你按照指定的格式輸出文本),在方法中使用隨機索引來調用一個攻擊效果。System.out.printf (隨機攻擊的數組名,第一個% this.getName(),第二個% role.getName());
  • 同樣的想要輸出一個受傷描述,這個是根據剩余血量的大小(在方法中定義的變量)來決定的,輸出是也是使用 printf。System.out.printf ( 被攻擊狀態名?[數組中第幾個值根據血量大小],role.getName());
格式說明符作用示例
%d格式化整數int num = 10;
%s格式化字符串String str = "hello";
%f格式化浮點數double d = 3.14159;
%c格式化字符char c = 'A';
%b格式化布爾值boolean b = true;

6、第二個方法showRoleInfo,不需要參數,因為它只操作當前對象自身的屬性,不需要外部輸入,調用的時候只需要寫出對應的get返回值即可。

7、寫完業務類的屬性、并對屬性的構造函數和對應方法寫完之后,就要寫一個test類,這個類的目的是作為程序入口,負責創建角色、控制游戲流程,不涉及角色內部實現。兩個類的兩者職責分離,修改其中一個不會影響另一個。

8、在test類中,首先主要對應上一個類中的構造函數創建角色 上一個類名?r1 = new 上一個類名(逗號隔開分別傳入構造函數中的參數);

9、在該類中可以利用上面構造的角色名調另一個類中的方法 調用者對象.方法名(方法參數),如果在調用方法中有對應的限制比如是否小于了0。

全部代碼

Role類:

import java.util.Random;public class Role {private String name;private int blood;private char gender;private String face;String[] boyfaces = {"風流倜儻","氣宇軒昂","相貌英俊"};String[] girlfaces = {"風華正茂","清秀","身材較好"};//攻擊描述String[] attack_esc = {"%s用牛角尖刺中%s","%s用小刀砍中%s","%s用小棒打中%s"};//受傷描述String[] injureds_esc = {"結果%s被攻擊,","結果%s被打倒","結果%s被打中"};public Role(String name, int blood, char gender) {this.name = name;this.blood = blood;this.gender = gender;//隨機長相setFace(gender);}public Role() { }public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}//get 方法:用于讀取成員變量的值。public String getFace() {return face;}//set 方法:用于修改成員變量的值。//set 方法需要參數:因為 set 方法的目的是設置成員變量的值,所以它需要一個參數來接收新的值。public void setFace(char gender) {Random r = new Random();//長相是隨機的if(gender=='男'){int index = r.nextInt(boyfaces.length);this.face = boyfaces[index];}else if(gender=='女'){int index = r.nextInt(girlfaces.length);this.face = girlfaces[index];}else {this.face = "非男非女";}}public String[] getBoyfaces() {return boyfaces;}public void setBoyfaces(String[] boyfaces) {this.boyfaces = boyfaces;}public String[] getGirlfaces() {return girlfaces;}public void setGirlfaces(String[] girlfaces) {this.girlfaces = girlfaces;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getBlood() {return blood;}public void setBlood(int blood) {this.blood = blood;}//定義一個方法用于攻擊別人,方法需要一個Role參數:因為需要指定攻擊的目標角色。//role.getName():獲取被攻擊角色的名字。//this.getName():獲取當前攻擊角色的名字。// this是方法的調用者即 this.getName// role也就是參數,是挨揍的人即 role.getNamepublic void attack(Role role){//隨機攻擊效果Random r1 = new Random();int index = r1.nextInt(attack_esc.length);String kongfu = attack_esc[index];//輸出一個攻擊的效果System.out.printf(kongfu,this.getName(),role.getName());System.out.println("");//造成的隨機傷害Random r = new Random();int hurt = r.nextInt(20)+1;//修改一下挨揍人的血量int remainBlood = role.getBlood()-hurt;//剩余血量//驗證剩余的血量remainBlood = remainBlood<0?0:remainBlood;//修改挨揍人的血量role.setBlood(remainBlood);if(remainBlood>90){System.out.printf(injureds_esc[0],role.getName());}else if(remainBlood>60){System.out.printf(injureds_esc[1],role.getName());}else {System.out.printf(injureds_esc[2],role.getName());}System.out.println("");//        //this是方法的調用者
//        System.out.println(this.getName()+"打了"+role.getName()
//                +"一下,造成了"+hurt+"傷害,"+"\n"+
//                role.getName()+"還剩"+remainBlood+"血量");}
//showRoleInfo 方法不需要參數:因為它只操作當前對象自身的屬性,不需要外部輸入。public void showRoleInfo(){System.out.println("姓名為:"+getName());System.out.println("血量為:"+getBlood());System.out.println("性別為:"+getGender());System.out.println("長相為:"+getFace());}
}

GameTest類:

public class GameTest {public static void main(String[] args) {Role r1 = new Role("喬峰",100,'男');Role r2 = new Role("摩智",100,'男');//展示角色信息r1.showRoleInfo();r2.showRoleInfo();//不知道要打擊多少輪,所有要用whilewhile (true){r1.attack(r2);//判斷一下剩余血量if (r2.getBlood()==0){System.out.println(r1.getName()+" ko "+r2.getName());break;}r2.attack(r1);if(r1.getBlood()==0){System.out.println(r2.getName()+" ko "+r1.getName());break;}}}
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89258.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89258.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GitHub 趨勢日報 (2025年07月15日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖1641claude-code1054markitdown545system-prompts-and-models-of-ai-tools538claud…

(5)LangGraph4j框架ReActAgent實現

LangGraph4j框架ReActAgent實現 ReAct-Agent概念 ReAct-Agent 是一種大模型應用中的智能體架構。ReAct 是 Re (Reasoning&#xff0c;推理)和 Act&#xff08;Action&#xff0c;行動&#xff09;兩個單詞的簡寫&#xff0c;用通俗的話來說&#xff0c;它可以讓大模型像人一樣“…

近期學習小結

一、TLS&#xff08;Transport Layer Security&#xff09;握手是建立安全通信通道的關鍵過程&#xff0c;確保客戶端與服務器之間的通信加密和身份驗證。以下是TLS 1.2和TLS 1.3的握手流程詳解及對比&#xff1a;TLS 1.2 握手流程目標&#xff1a;協商加密套件、交換密鑰、驗證…

maven本地倉庫清緩存py腳本

清_remote.repositories、以及 .lastUpdated 緩存文件&#xff0c;避免換倉庫or私服的時候一直往舊地方去download從而引起的failtodownlown問題 import os import sysdef delete_maven_metadata_files(directory):"""遞歸刪除指定目錄下的 _remote.repositorie…

職坐標:物聯網解決方案實戰指南

隨著物聯網技術的快速發展&#xff0c;其在智能家居、工業制造和農業領域的應用日益廣泛&#xff0c;為解決實際挑戰提供了高效方案。本文將圍繞職坐標一站式IT培訓就業服務平臺推出的實戰指南&#xff0c;系統解析物聯網解決方案的核心內容。指南首先概述物聯網解決方案的基本…

多云環境下的統一安全架構設計

關鍵詞&#xff1a;多云安全、統一架構、零信任、深度防御、身份管理、威脅檢測、SIEM、合規性 &#x1f4da; 文章目錄 引言&#xff1a;多云時代的安全挑戰多云環境面臨的安全挑戰統一安全架構設計原則核心安全組件架構多層防護體系設計統一身份管理與訪問控制安全監控與威…

批量制作Word:如何根據表格數據的內容批量制作word,根據Excel的數據批量制作word文檔的步驟和注意事項

企業批量制作員工勞動合同時&#xff0c;用 Excel 整理員工姓名、職位等信息&#xff0c;模板設對應占位符&#xff0c;系統快速填充生成合同&#xff1b;高校生成成績單&#xff0c;Excel 存學生成績數據&#xff0c;模板嵌入科目占位符&#xff0c;批量生成準確成績單&#x…

STM32f103ZET6之ESP8266模塊

一、ESP8265概述 官方網址&#xff1a;ESP8266 Wi-Fi MCU I 樂鑫科技 (espressif.com.cn) ESP8266模塊---wifi模塊 產品特點&#xff1a;ESP8266 是什么&#xff1f; ESP8266 是由樂鑫科技&#xff08;Espressif Systems&#xff09;開發的一款低成本、高性能的 Wi-Fi 微控制器…

前端設計模式應用精析

引言 設計模式是前端工程化架構的基石&#xff0c;通過抽象核心場景解法提升代碼復用性與系統可維護性。本文精析 7 個核心模式&#xff0c;結合原生 JavaScript 與框架實踐&#xff0c;揭示模式在現代前端架構中的底層映射與應用。1. 觀察者模式&#xff08;Observer&#xff…

【機器學習深度學習】Ollama vs vLLM vs LMDeploy:三大本地部署框架深度對比解析

目錄 前言 一、為什么要本地部署大語言模型&#xff1f; 二、三大主流部署方案簡介 三、核心對比維度詳解 1?? 易用性對比 2?? 性能與并發能力 3?? 模型支持與生態兼容性 4?? 部署環境與平臺支持 四、一覽對比表 五、詳細介紹與比較 ? 1. Ollama ? 2. vL…

AWS ML Specialist 考試備考指南

以下是針對AWS機器學習專家認證(AWS Certified Machine Learning - Specialty)的備考指南精簡版,涵蓋核心要點和高效備考策略: ?一、考試核心要點? ?四大核心領域?: ?數據準備(28%)?:S3數據存儲、Glue ETL、Feature Store、數據清洗與特征工程。 ?模型開發(26%…

yolo8+ASR+NLP+TTS(視覺語音助手)

&#x1f9e9; 模塊總覽&#xff1a;步驟模塊作用①麥克風錄音&#xff08;VAD支持&#xff09;獲取語音并判斷是否有人說話②Whisper語音識別把語音內容識別為文字③DeepSeek 聊天接口發送用戶提問并獲取 AI 回復④edge-tts 朗讀回答把 DeepSeek 回答讀出來⑤整合成語音助手主…

Zabbix 分布式監控系統架構設計與優化

一、概念 1.核心概念 Zabbix是一個CS(服務端/客戶端)架構的服務Zabbix-Agent獲取數據-->發送給-->Zabbix-Server服務端--- >數據會被存放在數據庫 <--- Zabbix Web 頁面展示數據 2.部署流程 部署ngxphp環境并測試部署數據庫 mariadb 10.5及以上 然后進行配置編…

QT——文件選擇對話框 QFileDialog

QFileDialog概述QFileDialog是Qt框架中提供的文件對話框類&#xff0c;用于讓用戶選擇文件或目錄。它提供了標準的文件選擇界面&#xff0c;支持文件打開、保存、多選等常見操作。基本使用方式QFileDialog提供了兩種使用方式&#xff1a;靜態方法&#xff1a;直接調用類方法快速…

Flask+LayUI開發手記(十一):選項集合的數據庫擴展類

條目較少的選項集合&#xff0c;確實可以在程序中直接定義&#xff08;其實最合適的還是存儲在一個分類別的數據庫表里&#xff09;&#xff0c;但條目較多的選項集合&#xff0c;或者是復雜的樹型結構選項集合&#xff0c;一般都是存儲在數據庫中的&#xff0c;這樣維護起來比…

AI學習筆記三十二:YOLOv8-CPP-Inference測試(Linux版本)

若該文為原創文章&#xff0c;轉載請注明原文出處。主要介紹如何在Linux系統上安裝和部署基于YOLOv8的C推理項目一、服務器準備使用AutoDL平臺租用服務器AutoDL有git加速&#xff0c;可以自行啟用二、環境配件1、檢查Opencv版本pkg-config --modversion opencv4如果版本為4.5&a…

113:路徑總和 II

題目&#xff1a;給你二叉樹的根節點 root 和一個整數目標和 targetSum &#xff0c;找出所有 從根節點到葉子節點 路徑總和等于給定目標和的路徑。葉子節點 是指沒有子節點的節點。解答&#xff1a;用 go主要坑有兩個&#xff0c;一個是二維結果切片傳遞用指針&#xff0c;一個…

Perl 數組

Perl 數組 在Perl編程語言中&#xff0c;數組是處理數據的一種強大工具。數組允許我們將多個值存儲在單個變量中&#xff0c;從而簡化了代碼并提高了效率。本文將詳細介紹Perl數組的創建、操作、遍歷以及一些高級用法。 數組的創建 在Perl中&#xff0c;創建一個數組非常簡單。…

優先隊列的實現

目錄 引言 堆的基本概念與特性 堆的插入與向上調整 堆的刪除與向下調整 優先隊列的設計思路 模板參數設計 比較器的作用 核心接口實現 push pop top 附錄(完整代碼) 引言 優先隊列&#xff08;Priority Queue&#xff09;是一種特殊的隊列數據結構&#xff0c;其中每…

現代CSS實戰:用變量與嵌套重構可維護的前端樣式

現代CSS實戰&#xff1a;用變量與嵌套重構可維護的前端樣式 引言 在傳統CSS開發中&#xff0c;我們常常陷入「樣式冗余」與「維護噩夢」的循環&#xff1a; 想調整主題色&#xff1f;得全局搜索所有 #3498db 手動替換&#xff0c;稍有不慎就漏改某個角落&#xff1b; 寫嵌套…