手把手帶你寫Node.JS版本小遊戲

nintyuui發表於2021-09-11
摘要:今天就利用Node.JS為大家帶來簡單有趣的的剪刀石頭布的小遊戲。

JavaScript的出現催動了前端開發的萌芽,前後端分離促進了Vue、React等開發框架的發展,Weex、React-Native等的演變賦予了並存多端開發的能力,而Node.JS的面世無疑是推動了Web全棧開發的步伐。

今天就利用Node.JS為大家帶來簡單有趣的的剪刀石頭布的小遊戲。

手把手帶你寫Node.JS版本小遊戲手把手帶你寫Node.JS版本小遊戲手把手帶你寫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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章