如何写Node.JS版本小游戏

2022-04-15 0 1,130
目录
  • 概述
  • 打造流程
  • 相关api
    • readline
    • 基础使用
    • chalk
    • clear
  • 步骤补充说明
    • 完整代码
      • 抛砖引玉

        概述

        今天就利用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 或者\r\n )时就会触发,也就是我们在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,加油~

        以上就是如何写Node.JS版本小游戏的详细内容,更多关于Node.JS版本小游戏的资料请关注NICE源码其它相关文章!

        免责声明:
        1、本网站所有发布的源码、软件和资料均为收集各大资源网站整理而来;仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 不得使用于非法商业用途,不得违反国家法律。否则后果自负!

        2、本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与www.niceym.com无关。
        如果您喜欢该程序,请支持正版源码、软件,购买注册,得到更好的正版服务。
        如有侵犯你版权的,请邮件与我们联系处理(邮箱:skknet@qq.com),本站将立即改正。

        NICE源码网 JavaScript 如何写Node.JS版本小游戏 https://www.niceym.com/27678.html