摘要:我們繼續,這次來聊聊類。,編寫代碼角色基類判斷角色是否死亡升級受到傷害攻擊普通攻擊攻擊了造成了點傷害攻擊,有概率是用必殺攻擊必殺攻擊使用必殺攻擊了造成了點傷害游戲世界權利的游戲初始化英雄怪物集合,模擬簡單的游戲關卡。
OK, 我們繼續,這次來聊聊類。
內有 Jon Snow大戰異鬼, ?
熟悉后端的朋友們對類肯定都不陌生,如下面一段PHP的代碼:
class Human { protected $name; public function __construct($name) { $this->name = $name; } public function introduce() { echo "你好,我叫 " . $this->name . PHP_EOL; } } $jack = new Human("Jack"); $jack->introduce();
上面的代碼,我們創建了一個叫Human的類,初始化的時候傳入名字,還有一個自我介紹的方法。
同樣的功能到了JS的世界呢? 且看下面的代碼(ES5):
var Human = function(name) { this.name = name; }; Human.prototype.introduce = function() { console.log("你好,我叫 " + this.name); }; var jack = new Human("Jack"); jack.introduce();
對了,你沒有看錯,在JS的世界中,我們就是這么來實現類的開發的, 總感覺哪里不舒服對吧?
到了ES2015(ES6), 事情就變得美好了,一起來看看下面的代碼:
class Human { constructor(name) { this.name = name; } introduce() { console.log(`你好,我是 ${this.name}`); } } let jack = new Human("Jack"); jack.introduce();
終于變得正常一些了,淚奔。。。
大家請記住,這只是語法糖,在這背后的實現依然是我們ES5中展示的代碼,但是,我們用著爽就好,哈哈哈!!!
有了class關鍵字,理所當然就有extends嘍,馬上試試:
class Man extends Human { construtor(name) { super(name); this.gender = "male"; } } new Man("Jon").introduce();
繼續淚奔,寫法上不用為了實現繼承,各種操作prototype了。
這里還要特殊講一下靜態方法:
class Tree { static new() { return new Tree(); } } let tree1 = new Tree(); // Tree Object let tree2 = Tree.new(); // Tree Object tree1.new(); // TypeError: tree1.new is not a function
可以看到,靜態方法只能在類中調用,而不能被類實例調用。
為了更好的體驗JS面向對象開發,下面我們來實戰一下,來寫一個簡單的自動MUD游戲,故事的場景是Jon Snow大戰異鬼,?。
主角Jon Snow將大戰若干回合的異鬼,并最終和Night King決戰!
Jon Snow每打敗一個異鬼將吞噬該異鬼的等級到自己身上
Jon Snow有必殺攻擊
分析一下:
不管是Jon Snow, 異鬼和Night King, 對于游戲來說都是角色,所以我們應該有個角色基類。
有名稱,等級,血量等基礎屬性
有攻擊,升級,承受傷害等方法
Jon Snow 應該繼承 角色基類,并擁有必殺攻擊的方法
需要有個游戲世界, 有場景,并可以控制游戲開始。
OK,編寫代碼:
class Role { //角色基類 constructor(name, level = 1, health = 100) { this.name = name; this.level = level; this.health = health; } isDead() { //判斷角色是否死亡 return this.health <= 0; } levelUp(level = 1) { //升級 this.level += level; } damage(power) { //受到傷害 this.health = this.health - power; } attack(role) { //攻擊 this.strike(role); } strike(role) { //普通攻擊 let power = parseInt(Math.random() * 20 * this.level / 10); role.damage(power); console.log(`[${this.name}]攻擊了[${role.name}], 造成了[${power}]點傷害`); } } class Hero extends Role { attack(role) { //攻擊,有概率是用必殺攻擊 if (! this.isCriticalStrike()) { return this.criticalStrike(role); } return this.strike(role); } criticalStrike(role) { //必殺攻擊 let power = parseInt(200 * Math.random() + 50); role.damage(power); console.log(`[${this.name}]使用必殺攻擊了[${role.name}], 造成了[${power}]點傷害`); } isCriticalStrike() { return Math.random() > 0.70; } } class Monster extends Role { } class Game { //游戲世界 constructor() { this.name = "權利的游戲"; this.hero = new Hero("Jon Snow", 10); // 初始化英雄Jon Snow this.monsters = [ //怪物集合,模擬簡單的游戲關卡。 new Monster("異鬼 01", 1, 10), new Monster("異鬼 02", 3, 30), new Monster("異鬼 03", 5, 50), new Monster("異鬼 04", 10, 100), new Monster("異鬼 05", 15, 150), new Monster("異鬼 06", 20, 200), new Monster("Night King", 50, 500) ]; this.level = 0; // 游戲當前關卡記錄 console.log(`你在[${this.name}]中扮演[${this.hero.name}], 征程即將開始...`); } play() { // 游戲開始 while (this.level < this.monsters.length && ! this.hero.isDead()) { let monster = this.monsters[this.level]; console.log(`關卡[${this.level + 1}] 你遇到了[${monster.name}], 進入戰斗:`); let offensive = this.hero; let defensive = monster; while (! this.hero.isDead() && ! monster.isDead()) { offensive.attack(defensive); let middleman = offensive; offensive = defensive; defensive = middleman; } if (this.hero.isDead()) { console.log(`你被[${monster.name}]打敗了, 游戲結束!`); break; } if (monster.isDead()) { console.log(`你打敗了[${monster.name}] 等級提升:[${monster.level}]`); this.hero.levelUp(monster.level); this.level ++; } } if (this.level === this.monsters.length) { console.log(`恭喜你通關游戲!`); } } } let game = new Game(); game.play();
執行一下,可以得到:
你在[權利的游戲]中扮演[Jon Snow], 征程即將開始... 關卡[1] 你遇到了[異鬼 01], 進入戰斗: [Jon Snow]使用必殺攻擊了[異鬼 01], 造成了[114]點傷害 你打敗了[異鬼 01] 等級提升:[1] 關卡[2] 你遇到了[異鬼 02], 進入戰斗: [Jon Snow]使用必殺攻擊了[異鬼 02], 造成了[140]點傷害 你打敗了[異鬼 02] 等級提升:[3] 關卡[3] 你遇到了[異鬼 03], 進入戰斗: [Jon Snow]使用必殺攻擊了[異鬼 03], 造成了[69]點傷害 你打敗了[異鬼 03] 等級提升:[5] 關卡[4] 你遇到了[異鬼 04], 進入戰斗: [Jon Snow]使用必殺攻擊了[異鬼 04], 造成了[169]點傷害 你打敗了[異鬼 04] 等級提升:[10] 關卡[5] 你遇到了[異鬼 05], 進入戰斗: [Jon Snow]攻擊了[異鬼 05], 造成了[41]點傷害 [異鬼 05]攻擊了[Jon Snow], 造成了[19]點傷害 [Jon Snow]攻擊了[異鬼 05], 造成了[21]點傷害 [異鬼 05]攻擊了[Jon Snow], 造成了[3]點傷害 [Jon Snow]使用必殺攻擊了[異鬼 05], 造成了[223]點傷害 你打敗了[異鬼 05] 等級提升:[15] 關卡[6] 你遇到了[異鬼 06], 進入戰斗: [Jon Snow]使用必殺攻擊了[異鬼 06], 造成了[77]點傷害 [異鬼 06]攻擊了[Jon Snow], 造成了[23]點傷害 [Jon Snow]使用必殺攻擊了[異鬼 06], 造成了[221]點傷害 你打敗了[異鬼 06] 等級提升:[20] 關卡[7] 你遇到了[Night King], 進入戰斗: [Jon Snow]使用必殺攻擊了[Night King], 造成了[155]點傷害 [Night King]攻擊了[Jon Snow], 造成了[88]點傷害 你被[Night King]打敗了, 游戲結束!
大家可以調調參數,虐一虐大Boss吧,哈哈哈~~~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83758.html
摘要:先來介紹下語法官方示例代碼模塊中對象暴露只需要即可,可以是任何類型的對象。手動導入模塊下某個對象,需要和模塊中定義的名字對應,順序無關。 看一下官方介紹: Language-level support for modules for component definition. JS在ES2015開始原生支持模塊化開發,我們之前也曾借助于諸如: AMD CommonJS 等的模塊加載...
摘要:就是的逆操作,看代碼計算一個數組大于三個元素中前三個元素的和以及所有元素的和。前三個值為總和為結果前三個值為總和為前三個值為總和為 ES2015為我們帶來了一個新的操作符: ..., 用于定義函數參數的地方,稱之為 Rest 用于調用函數的地方,稱之為 Spread 我們一個個來分析: Rest 寫程序的時候或多或少都會有,傳入不定參數給一個函數的需求,如,給一個班級加入學生名單,...
EcmaScript 其實是一種語言規范,常見的 JavaScript, ActionScript 等都是其具體實現,平時使用中一般可以將其和Javascript對等稱呼,本系列教程主要講述 EcmaScript2015(ES6) 為JavaScript帶來的新的特性,并初步掌握如何利用其進行開發。 本系列面向有一定基礎知識的ES5使用者,不適合初學者。 先來看兩段代碼: Human.js exp...
摘要:雖然夠好用,奈何沒有瀏覽器對其可以完全支持,本文書寫時間,開發版號稱已經支持的特性。開始安裝本系列假定讀者都有使用經驗,如果還沒有,趕緊去這里了解并安裝吧。到此,我們的已經準備就緒。 通過前面章節的講解,大家對ES2015的一些新語法有了初步的理解,之前我們的測試代碼都可以直接放入 Chrome Console 中直接運行,為了更好的學習后面的面向對象和模塊開發,我先用一章介紹一下 B...
閱讀 3024·2021-09-22 15:52
閱讀 2903·2019-08-30 15:55
閱讀 2700·2019-08-30 15:53
閱讀 2454·2019-08-30 13:21
閱讀 1621·2019-08-30 13:10
閱讀 2481·2019-08-26 12:09
閱讀 2564·2019-08-26 10:33
閱讀 1802·2019-08-23 18:06