手把手带你写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 或者\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版本小游戏的更多相关文章
- 使用nvm管理node.js版本以及更换npm淘宝镜像源
目录 1,前言 2,安装nvm 3,nvm的使用 4,错误处理 5,修改npm默认镜像源 6,win10下cnpm报错 1,前言 注意:此教程仅限Windows,Mac可能不适用 在我们的日常开发中可 ...
- 限定项目的 Node.js 版本
限定项目运行所需的 Node.js 版本可保证项目在一个稳定可预期的环境中运行,减少不必要的故障.甚至有些依赖库只能工作于某些版本下.同时,不加以限制的话,在多人合作的项目中恐怕会引起环境不一致带来的 ...
- 使用Xcode IDE写node.js
最近在玩node.js 但是发现很多IDE就是用不顺手 后来发现Xcode可以剖析java script 于是试着使用Xcode来当做node.js的编辑器 首先,在Mac上必须先安装node.js的 ...
- Mac下nvm管理node.js版本问题
本篇文章主要是针对已经安装了node.js和nvm管理工具小伙伴遇到的问题. 管理工具有两个,一个是nvm,还有一个是nnvm的好处就是可以管理多个node版本,而且可以切换想要的版本,可以安装一个稳 ...
- 利用n 升级工具升级Node.js版本及在mac环境下的坑
一.利用n 升级Node.js 最近在用NPM安装一个nodejs工具时发现,我的nodejs的版本有些旧了.这不是大问题,只要升级就可以了,当然,重新从nodejs.org最新版本是一种方法,但我想 ...
- 使用 nvm 管理 node.js 版本
简介 在实际的前端开发过程中,可能会经常遇见 node.js 的版本问题,不同的项目需要使用不同的 node.js 版本. 直接安装的话,只能安装和使用 node.js 的一个版本.可以使用 nvm ...
- pixi.js 微信小游戏 入手
pixi是什么?一款h5游戏引擎 优点:简单简洁性能第一 缺点:大多数用的国产三大引擎,pixi资料少,工具少, 为什么学,装逼 用pixi开发小游戏行吗? 行.但要简单处理下 下载官网上的 weap ...
- 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- canvas写个简单的小游戏
之前在HTML5 Canvas属性和方法汇总一文中,介绍过Canvas的各种属性以及方法的说明,并列举了自己写的一些Canvas demo,接下来开始写一个简单的小游戏吧,有多简单,这么说吧,代码不到 ...
- node.js微信小程序配置消息推送
在开发微信小程序时,有一个消息推送,它的解释是这样的. 消息推送具体的内容是下面的这个网址 https://developers.weixin.qq.com/miniprogram/dev/fra ...
随机推荐
- 我试图扯掉这条 SQL 的底裤。
你好呀,我是歪歪. 这次带大家盘一个我觉得有点意思的东西,也是之前写<一个烂分页,踩了三个坑!>这篇文章时,遇到的一个神奇的现象,但是当时忙着做文章搞定这个主线任务,就没有去深究这个支线任 ...
- 揭秘计算机指令执行的神秘过程:CPU内部的绝密操作
计算机指令 从软件工程师的角度来看,CPU是执行计算机指令的逻辑机器.计算机指令可以看作是CPU能够理解的语言,也称为机器语言. 不同的CPU能理解的语言不同.例如,个人电脑使用Intel的CPU,苹 ...
- 一文详解贝叶斯优化(Bayesian Optimization)原理
参考资料: Expected Improvement formula for Bayesian Optimisation 通俗科普文:贝叶斯优化与SMBO.高斯过程回归.TPE 理解贝叶斯优化 A T ...
- KL-Divergence KL散度
KL散度(KL-divergence) 直观解释:KL 散度是一种衡量两个分布(比如两条线)之间的匹配程度的方法. 需要解决的问题:已知数据太大,逍遥使用较小的信息表示已知数据.用某种已知分布来表示真 ...
- 深度解析BERT:从理论到Pytorch实战
本文从BERT的基本概念和架构开始,详细讲解了其预训练和微调机制,并通过Python和PyTorch代码示例展示了如何在实际应用中使用这一模型.我们探讨了BERT的核心特点,包括其强大的注意力机制和与 ...
- 【scipy 基础】--线性代数
SciPy的linalg模块是SciPy库中的一个子模块,它提供了许多用于线性代数运算的函数和工具,如矩阵求逆.特征值.行列式.线性方程组求解等. 相比于NumPy的linalg模块,SciPy的li ...
- git 忽略已提交(commit)的文件/文件夹
git 忽略已提交的文件或文件夹 最好是在工程一开始就编辑好 .gitignore 文件, 在第一次提交的时候仔细检查避免添加那些无用的文件 因为 .gitignore 只能对未提交过的文件起效, 也 ...
- 从混乱到优雅:基于DDD的六边形架构的代码翻新指南
前言 趁着双十一备战封板,终于又有一些时间可以梳理一下最近的心得. 最近这半年跟同事讨论比较多的是分层架构,然后就会遇到两个触及灵魂的问题,一个是如何做好分层架构,二是DDD在架构层面该如何落地. 为 ...
- Pooling与马赛克的秘密
说到Pooling,相信学习过CNN的朋友们都不会感到陌生.Pooling在中文当中的意思是"池化",在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体 ...
- Django笔记四十三之使用uWSGI部署Django系统
本文首发于公众号:Hunter后端 原文链接:Django笔记四十三之使用uWSGI部署Django系统 目前部署 Django 的方式一般来说是使用 Nginx + uWSGI + Django 来 ...