手把手帶你寫Node.JS版本小遊戲
摘要:今天就利用Node.JS為大家帶來簡單有趣的的剪刀石頭布的小遊戲。
JavaScript的出現催動了前端開發的萌芽,前後端分離促進了Vue、React等開發框架的發展,Weex、React-Native等的演變賦予了並存多端開發的能力,而Node.JS的面世無疑是推動了Web全棧開發的步伐。
今天就利用Node.JS為大家帶來簡單有趣的的剪刀石頭布的小遊戲。
打造流程
- 引入模組
- 定義簡單石頭布行為命令、當前局數(三局兩勝)、得分情況、電腦隨機出的行為(剪刀/石頭/布)
- 定義關聯逐行讀取流
- 清屏
- 列印開局提示資訊
- 監聽line事件,根據讀取流(使用者輸入)判斷使用者是要結束遊戲,還是出招啦
- 監聽close 事件,如果玩夠了3局就列印最終結果,否則直接結束程式
- 定義scoreRule 方法,根據規則判斷得分情況
相關api
先來看一看相關的API,我們按照呼叫順序瞭解一下API,整個流程也就通啦
readline
逐行讀取可讀流中的資料
基礎使用
- readline.createInterface() 方法建立一個新的 readline.Interface 例項,定義關聯的input 可讀流和output 可寫流,output 流可以讀取input 流內容並輸出列印提示。
- `process.stdin` 和 `process.stdout` 對應程式的可讀流和可寫流。
- readline.close() 呼叫方法,表示例項完成,放棄對input流和output流的控制,Game Over ~
- process.exit([code]) 方法:終止node程式,code預設值是0,標識成功終止退出。
不論是可讀流的讀取還是例項的完成事件,都需要我們來監聽做點啥,要不然還有什麼意義呢?
- 監聽line 事件:每當input 流接收到行尾輸入(n 、 r 或者rn )時就會觸發,也就是我們在node控制檯按下Enter 或者 Return 鍵的時候,呼叫監聽回撥函式時攜帶可讀流接收的字串。
chalk
粉筆,node終端的樣式庫,修改終端輸出字串的顏色、加粗、隱藏以及背景色等樣式
const chalk = require('chalk') const logText = chalk.green(` Hello,一起遊戲吧! `) console.log(logText)
clear
清屏指令,node終端清屏,清除當前終端檢視顯示
這個使用起來最簡單,在你需要清屏的地方執行一下clear() 方法就行了。
const clear = require('clear') clear()
步驟補充說明
// 定義指令列表, // 判斷玩家輸入的指令是否正確以及電腦的隨機輸出都從這裡拿 const act = ['剪刀', '石頭', '布'] // 根據讀取流判斷玩家輸入資訊
// 監聽讀取流輸入 rl.on('line', function (input) { if (input === 'quit') { // 如果輸入【quit】 執行close()方法 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) // 如果已經玩了3個回合,則執行close()方法 if (num > 3) { rl.close() } } else { // 其他輸入 列印正確的輸入提示 console.log(` !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 繼續遊戲,請輸入:【剪刀】、【石頭】、【布】 退出遊戲,請輸入: 【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(` ============================================ 開始遊戲,請輸入:【剪刀】、【石頭】、【布】 退出遊戲,請輸入: 【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(` !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 繼續遊戲,請輸入:【剪刀】、【石頭】、【布】 退出遊戲,請輸入: 【quit】 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! `) } }) // 監聽關閉 退出程式 rl.on('close', function () { if (num > 3) { winText = score > 0 ? '玩家獲得了最終的勝利' : score < 0 ? '玩家最後還是輸啦,加油哦' : '不可思議的平局' console.log(` ========================== 本局結束,玩家總得分${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的學(mō)習(yú)的過程,我們會接觸到越來越多的依賴模組和API,也從側面說明了npm庫的強大,我們想用的功能可能搜一搜就可以找到並且拿來用了。不要迷失在API的浪花中,我們瞭解到了,在用到的時候勿忘搜尋技巧就好。
這裡的【剪刀石頭布】好lou啊(簡直不能看),但是我們學習的過程可以始於lou,一lou一lou的深入下去,lou頂必將留下你精細的身影。歡迎吐槽我,歡迎深入node,加油~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3209/viewspace-2796428/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 手把手帶你接入小程式訂閱訊息
- 手把手帶你寫AR應用--AR尺子簡介
- 手把手帶你寫AR應用--AR尺子預覽
- 手把手帶你寫 Flutter 系統音量外掛(Android\iOS)FlutterAndroidiOS
- 手摸手帶你實現 小遊戲<別踩白塊兒 -- 內有遊戲連結>遊戲
- canvas手寫辨色力小遊戲Canvas遊戲
- 手把手帶你玩轉LinuxLinux
- 手把手帶你寫一個JavaScript型別判斷小工具JavaScript型別
- 【Playwright+Python】系列教程(二)手把手帶你寫一個指令碼Python指令碼
- 25行程式碼帶你爬取4399小遊戲資料,看下童年的遊戲是否還在行程遊戲
- 用jQuery手寫一個小遊戲jQuery遊戲
- 用 JavaScript 寫一個卡片小遊戲JavaScript遊戲
- 如何用python編寫猜拳小遊戲?Python遊戲
- 用GDX寫個安卓小遊戲安卓遊戲
- win10自帶的遊戲在哪_win10如何開啟自帶小遊戲Win10遊戲
- .NET MAUI候選版本,能帶給你什麼小驚喜?UI
- 手把手帶你解析Handler原始碼原始碼
- 手把手帶你入門 Spring Security!Spring
- 手把手帶你利用棧來實現一個簡易版本的計算器
- 寫一個狼吃羊的小遊戲遊戲
- Python寫個“點球大戰”小遊戲Python遊戲
- 為了讓你們進階Canvas,我花7小時寫了3個有趣的小遊戲!!!Canvas遊戲
- 手把手帶你快速上手香橙派AIproAI
- ES6 手寫一個“辨色”小遊戲遊戲
- 微信小遊戲爆發式增長,如何保證小遊戲的版本迭代又快又穩?遊戲
- 手把手帶你擼一個路由(2)--帶參跳轉路由
- 小強帶你掙小錢v
- 微信小遊戲使用者持續增長,高品質小遊戲帶來更多機會遊戲
- 隨機組句小遊戲-V1.13版本隨機遊戲
- 如何帶你的遊戲打入中東土豪市場?遊戲
- 手把手帶你進行Golang環境配置Golang
- 帶你手把手實操一個RPC框架RPC框架
- 【專案實踐】手把手帶你搞定SSMSSM
- 程式碼怎麼寫才能被面試官看上?小編帶你瞧瞧面試
- 用C語言編寫小遊戲——“井字棋”C語言遊戲
- MATLAB 簡易版 你畫我猜小遊戲Matlab遊戲
- Python入門塔防小遊戲,開發步驟和原始碼,帶你輕鬆學pythonPython遊戲原始碼
- A股遊戲公司四成虧損 遊戲製作人轉行寫網路小說遊戲