如何寫Node.JS版本小游戲
概述
今天就利用Node.JS為大家?guī)砗?jiǎn)單有趣的的剪刀石頭布的小游戲。
打造流程
- 引入模塊
- 定義簡(jiǎn)單石頭布行為命令、當(dāng)前局?jǐn)?shù)(三局兩勝)、得分情況、電腦隨機(jī)出的行為(剪刀/石頭/布)
- 定義關(guān)聯(lián)逐行讀取流
- 清屏
- 打印開局提示信息
- 監(jiān)聽line事件,根據(jù)讀取流(用戶輸入)判斷用戶是要結(jié)束游戲,還是出招啦
- 監(jiān)聽close 事件,如果玩夠了3局就打印最終結(jié)果,否則直接結(jié)束進(jìn)程
- 定義scoreRule 方法,根據(jù)規(guī)則判斷得分情況
相關(guān)api
先來看一看相關(guān)的API,我們按照調(diào)用順序了解一下API,整個(gè)流程也就通啦
readline
逐行讀取可讀流中的數(shù)據(jù)
基礎(chǔ)使用
- readline.createInterface() 方法創(chuàng)建一個(gè)新的 readline.Interface 實(shí)例,定義關(guān)聯(lián)的input 可讀流和output 可寫流,output 流可以讀取input 流內(nèi)容并輸出打印提示。
- `process.stdin` 和 `process.stdout` 對(duì)應(yīng)進(jìn)程的可讀流和可寫流。
- readline.close() 調(diào)用方法,表示實(shí)例完成,放棄對(duì)input流和output流的控制,Game Over ~
- process.exit([code]) 方法:終止node進(jìn)程,code默認(rèn)值是0,標(biāo)識(shí)成功終止退出。不論是可讀流的讀取還是實(shí)例的完成事件,都需要我們來監(jiān)聽做點(diǎn)啥,要不然還有什么意義呢?
- 監(jiān)聽line 事件:每當(dāng)input 流接收到行尾輸入(\n 、 \r 或者\(yùn)r\n )時(shí)就會(huì)觸發(fā),也就是我們?cè)趎ode控制臺(tái)按下Enter 或者 Return 鍵的時(shí)候,調(diào)用監(jiān)聽回調(diào)函數(shù)時(shí)攜帶可讀流接收的字符串。
chalk
粉筆,node終端的樣式庫(kù),修改終端輸出字符串的顏色、加粗、隱藏以及背景色等樣式
const chalk = require('chalk') const logText = chalk.green(` Hello,一起游戲吧! `) console.log(logText)
clear
清屏指令,node終端清屏,清除當(dāng)前終端視圖顯示
這個(gè)使用起來最簡(jiǎn)單,在你需要清屏的地方執(zhí)行一下clear() 方法就行了。
const clear = require('clear') clear()
步驟補(bǔ)充說明
// 定義指令列表, // 判斷玩家輸入的指令是否正確以及電腦的隨機(jī)輸出都從這里拿 const act = ['剪刀', '石頭', '布'] // 根據(jù)讀取流判斷玩家輸入信息
// 監(jiān)聽讀取流輸入 rl.on('line', function (input) { if (input === 'quit') { // 如果輸入【quit】 執(zhí)行close()方法 rl.close() } else if (act.indexOf(input) !== -1) { // 如果輸入字符串在指令列表內(nèi) // 隨機(jī)生成電腦的對(duì)應(yīng)指令 const idx = Math.floor((Math.random() * 3)) gamer = act[idx] // 根據(jù)得分規(guī)則判斷玩家是否得分 const curScore = scoreRule(input, gamer) // 得分進(jìn)行累計(jì) score += curScore // 打印本回合信息 let win = curScore === 1 ? '本次玩家獲勝' : curScore === -1 ? '本次電腦獲勝' : '打平了,一定是巧合' result = ` ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ 第${num}回合: ------------------- 玩家出了: ${input} 電腦出了: ${gamer} ${win} ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ` // 寫入流后,繼續(xù)下一回合 num++; console.log(result) // 如果已經(jīng)玩了3個(gè)回合,則執(zhí)行close()方法 if (num > 3) { rl.close() } } else { // 其他輸入 打印正確的輸入提示 console.log(` !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 繼續(xù)游戲,請(qǐng)輸入:【剪刀】、【石頭】、【布】 退出游戲,請(qǐng)輸入: 【quit】 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! `) } })
完整代碼
// stone.js const readline = require('readline') const clear = require('clear') const chalk = require('chalk') const act = ['剪刀', '石頭', '布'] let num = 1 let score = 0 let gamer = '' let result = '' const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) clear() const beginText = chalk.green(` ============================================ 開始游戲,請(qǐng)輸入:【剪刀】、【石頭】、【布】 退出游戲,請(qǐng)輸入: 【quit】 ============================================ `) console.log(beginText) rl.on('line', function (input) { if (input === 'quit') { rl.close() } else if (act.indexOf(input) !== -1) { const idx = Math.floor((Math.random() * 3)) gamer = act[idx] const curScore = scoreRule(input, gamer) score += curScore let win = curScore === 1 ? '本次玩家獲勝' : curScore === -1 ? '本次電腦獲勝' : '打平了,一定是巧合' result = ` ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ 第${num}回合: ------------------- 玩家出了: ${input} 電腦出了: ${gamer} ${win} ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ` num++; console.log(result) if (num > 3) { rl.close() } } else { console.log(` !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 繼續(xù)游戲,請(qǐng)輸入:【剪刀】、【石頭】、【布】 退出游戲,請(qǐng)輸入: 【quit】 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! `) } }) // 監(jiān)聽關(guān)閉 退出進(jìn)程 rl.on('close', function () { if (num > 3) { winText = score > 0 ? '玩家獲得了最終的勝利' : score < 0 ? '玩家最后還是輸啦,加油哦' : '不可思議的平局' console.log(` ========================== 本局結(jié)束,玩家總得分${score} ${winText} ========================== `) } process.exit(0) }) function scoreRule(player, npc) { // 剪刀 布 // 石頭 剪刀 // 布 石頭 if (player === npc) { return 0 } if ((player === '剪刀' && npc === '布') || (player === '石頭' && npc === '剪刀') || (player === '布' && npc === '石頭')) { return 1 } else { return -1 } }
拋磚引玉
node的學(xué)(mō)習(xí)(yú)的過程,我們會(huì)接觸到越來越多的依賴模塊和API,也從側(cè)面說明了npm庫(kù)的強(qiáng)大,我們想用的功能可能搜一搜就可以找到并且拿來用了。不要迷失在API的浪花中,我們了解到了,在用到的時(shí)候勿忘搜索技巧就好。
這里的【剪刀石頭布】好lou?。ê?jiǎn)直不能看),但是我們學(xué)習(xí)的過程可以始于lou,一lou一lou的深入下去,lou頂必將留下你精細(xì)的身影。歡迎吐槽我,歡迎深入node,加油~
以上就是如何寫Node.JS版本小游戲的詳細(xì)內(nèi)容,更多關(guān)于Node.JS版本小游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
node.JS事件機(jī)制與events事件模塊的使用方法詳解
本文將詳細(xì)介紹nodeJS事件機(jī)制與events事件模塊的使用方2020-02-02詳解nodejs微信公眾號(hào)開發(fā)——2.自動(dòng)回復(fù)
這篇文章主要介紹了詳解nodejs微信公眾號(hào)開發(fā)——2.自動(dòng)回復(fù),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04