小言_互联网的博客

手把手带你写Node.JS版本小游戏

414人阅读  评论(0)

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 或者\r\n )时就会触发,也就是我们在node控制台按下Enter 或者 Return 键的时候,调用监听回调函数时携带可读流接收的字符串。

chalk

粉笔,node终端的样式库,修改终端输出字符串的颜色、加粗、隐藏以及背景色等样式


   
  1. const chalk =  require( 'chalk')
  2. const logText = chalk.green( `
  3. Hello,一起游戏吧!
  4. `)
  5. console.log(logText)

 

clear

清屏指令,node终端清屏,清除当前终端视图显示

这个使用起来最简单,在你需要清屏的地方执行一下clear() 方法就行了。


  
  1. const clear =  require( 'clear')
  2. clear()

步骤补充说明


   
  1. // 定义指令列表,
  2. // 判断玩家输入的指令是否正确以及电脑的随机输出都从这里拿
  3. const act = [ '剪刀''石头''布']
  4. // 根据读取流判断玩家输入信息
  5. // 监听读取流输入
  6. rl.on( 'line', function (input) {
  7.  if (input ===  'quit') {
  8.    // 如果输入【quit】 执行close()方法
  9.    rl.close()
  10.  } else if (act.indexOf(input) !== - 1) {
  11.    // 如果输入字符串在指令列表内
  12.    // 随机生成电脑的对应指令
  13.    const idx = Math.floor((Math.random() *  3))
  14.    gamer = act[idx]
  15.    // 根据得分规则判断玩家是否得分
  16.    const curScore = scoreRule(input, gamer)
  17.    // 得分进行累计
  18.    score += curScore
  19.    // 打印本回合信息
  20.    let win = curScore ===  1 ?  '本次玩家获胜' : curScore === - 1 ?  '本次电脑获胜' :  '打平了,一定是巧合'
  21.    result = `
  22.    ※ ※ ※ ※ ※ ※ ※ ※ ※ ※
  23.    第${num}回合:
  24.    -------------------
  25.    玩家出了: ${input}
  26.    电脑出了: ${gamer}
  27.    ${win}
  28.    ※ ※ ※ ※ ※ ※ ※ ※ ※ ※
  29.    `
  30.    // 写入流后,继续下一回合
  31.    num++;
  32.    console.log(result)
  33.    // 如果已经玩了 3个回合,则执行close()方法
  34.    if (num >  3) {
  35.      rl.close()
  36.    }
  37.  } else {
  38.    // 其他输入 打印正确的输入提示
  39.    console.log(`
  40.    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  41.    继续游戏,请输入:【剪刀】、【石头】、【布】
  42.    退出游戏,请输入: 【quit】
  43.    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  44.    `)
  45.  }
  46. })

完整代码


   
  1. // stone.js
  2. const readline = require( 'readline')
  3. const clear = require( 'clear')
  4. const chalk = require( 'chalk')
  5. const act = [ '剪刀''石头''布']
  6. let num =  1
  7. let score =  0
  8. let gamer =  ''
  9. let result =  ''
  10. const rl = readline.createInterface({
  11.  input: process.stdin,
  12.  output: process.stdout
  13. })
  14. clear()
  15. const beginText = chalk.green(`
  16. ============================================
  17. 开始游戏,请输入:【剪刀】、【石头】、【布】
  18. 退出游戏,请输入: 【quit】
  19. ============================================
  20. `)
  21. console.log(beginText)
  22. rl.on( 'line', function (input) {
  23.  if (input ===  'quit') {
  24.    rl.close()
  25.  } else if (act.indexOf(input) !== - 1) {
  26.    const idx = Math.floor((Math.random() *  3))
  27.    gamer = act[idx]
  28.    const curScore = scoreRule(input, gamer)
  29.    score += curScore
  30.    let win = curScore ===  1 ?  '本次玩家获胜' : curScore === - 1 ?  '本次电脑获胜' :  '打平了,一定是巧合'
  31.    result = `
  32.    ※ ※ ※ ※ ※ ※ ※ ※ ※ ※
  33.    第${num}回合:
  34.    -------------------
  35.    玩家出了: ${input}
  36.    电脑出了: ${gamer}
  37.    ${win}
  38.    ※ ※ ※ ※ ※ ※ ※ ※ ※ ※
  39.    `
  40.    num++;
  41.    console.log(result)
  42.    if (num >  3) {
  43.      rl.close()
  44.    }
  45.  } else {
  46.    console.log(`
  47.    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  48.    继续游戏,请输入:【剪刀】、【石头】、【布】
  49.    退出游戏,请输入: 【quit】
  50.    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  51.    `)
  52.  }
  53. })
  54. // 监听关闭 退出进程
  55. rl.on( 'close', function () {
  56.  if (num >  3) {
  57.    winText = score >  0 ?  '玩家获得了最终的胜利' : score <  0 ?  '玩家最后还是输啦,加油哦' :  '不可思议的平局'
  58.    console.log(`
  59.    ==========================
  60.    本局结束,玩家总得分${score}
  61.    ${winText}
  62.    ==========================
  63.    `)
  64.  }
  65.  process.exit( 0)
  66. })
  67. function scoreRule(player, npc) {
  68.  // 剪刀 布
  69.  // 石头 剪刀
  70.  // 布 石头
  71.  if (player === npc) {
  72.    return  0
  73.  }
  74.  if ((player ===  '剪刀' && npc ===  '布')
  75.    || (player ===  '石头' && npc ===  '剪刀')
  76.    || (player ===  '布' && npc ===  '石头')) {
  77.    return  1
  78.  } else {
  79.    return - 1
  80.  }
  81. }

抛砖引玉

Node.JS的学(mō)(yú)的过程,我们会接触到越来越多的依赖模块和API,也从侧面说明了npm库的强大,我们想用的功能可能搜一搜就可以找到并且拿来用了。不要迷失在API的浪花中,我们了解到了,在用到的时候勿忘搜索技巧就好。

这里的【剪刀石头布】好lou啊(简直不能看),但是我们学习的过程可以始于lou,一loulou的深入下去,lou顶必将留下你精细的身影。欢迎吐槽我,欢迎深入Node.JS,加油~

点击这里→了解更多精彩内容


转载:https://blog.csdn.net/devcloud/article/details/108407957
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场