80行代码教你用Node+TypeScript写一个心灵预测魔术的终端应用
前言:
中学有一段时间痴迷于各种魔术,课间给女同学变魔术炫技,放学就苦练魔术还有花式切牌,.后来,魔术在我的世界里沉沦了好一段时间,感叹当了程序员后放弃好多爱好,这一次我想把它们融合起来.圆规正转,这篇教你写出一个心灵预测魔术的终端应用
1.技术介绍
node依赖包 | 简述 |
---|---|
commander | 常用作手脚架命令的,根据用户输入的命令响应不同逻辑 |
inquirer | 获取用户输入信息 |
chalk | 终端打印高亮显示 |
2.体验魔术
安装
npm install magic_game_node -g
开始游戏
magic_game_node --start
这时候游戏就开始了:
还没有把玩的同学赶紧去体验下魔术的魅力吧~~~
3.原理解析
聪明的你可能已经猜到大概是什么情况了,没错,这其实是一个简单的数学问题
在0-100以内的两位数,减去个位加十位之和,得出来永远的是9的倍数 一个数学公式可以说明结论
(10x+y)−(x+y)=9x (10x+y)-(x+y) = 9x(10x+y)−(x+y)=9x
ps: (10x+y)是在0-100以内的两位数,(x+y)是去个位加十位之和
既然你每次算出来都是9的倍数,那我让9的倍数的图腾每次运行都保持一致图腾就可以了,剩下非9倍数都是随机图腾
4.源码分析
这个程序只有一个文件,游戏本主要逻辑并不难,知道原理以后大家基本都可以写出来逻辑,下面就是要考虑良好的交互体验了,我希望的是用npm就可以下载下来,然后输入命令就开始游戏,这时候我就用到了commder.js,它经常用在手脚架的注册命令上
// index.ts
#!/usr/bin/env node
const chalk = require('chalk')
const inquirer = require('inquirer')
const commander = require('commander');
// 实例化 commander
const program = new commander.Command();
// 封装chalk,输出颜色
function color_str(color: string, str: string): string {
const colorStrings = chalk.keyword(color)
return colorStrings(str)
}
// 随机数函数
function Random(min: number, max: number) {
return Math.floor(Math.random() * (max - min)) + min
}
//注册命令
function registerCommend() {
program
.version('1.0.4', '-v, --version')
// 开始游戏命令
.option('-s, --start', 'Add peppers')
program.on('option:start', function () {
// 执行游戏逻辑
game_main()
})
.parse(process.argv);
}
async function game_main() {
console.log(color_str("red", "现在游戏开始~"))
console.log(color_str("green", "大家好,我叫作曲家种太阳"))
console.log(color_str("green", "是一个虚拟文明的魔术师,接下来开始我的表演~"))
await inquirer.prompt({
type: 'input',
name: "type",
message: color_str("orange", '请随机想一个10到100的数字,假设这个数字是x,请将x减去它个位与十位之和得出一个数字Q,请你心里默念三次数字Q,请按任意键继续~')
})
console.log(color_str("purple", "我们的文明,每一个数字背后都代表一个图腾,我已画好了对应关系,请你把默念的数字所对应的图腾画在记在心里,让我预测一下~"))
// 放非9的倍数的图标
const list1: string[] = ["☄", "☬", "♝", "♬", "◐", "♣", "▲", "♦", "☺", "√", "♞", "♍", "♒", "♓", "♑", "♐", "♎", "♌", "♉", "♈"];
// 放9的倍数的图标
const list2: string[] = ["§", "〼", "◎", "¤", "☼", "☽", "■", "★", "♠", "♥", "☑", "♛",]
// list2的下标,放在for循环外,为了让九的倍数的图标一致
const index2: number = Random(1, 12)
for (let i = 1; i < 101; i++) {
// 单个
let item: string;
const index1: number = Random(1, 20)
// 九倍数的时候
if (i % 9 === 0) {
item = `${i}:${list2[index2]}`
} else {
item = `${i}:${list1[index1]}`
}
// 输出换行逻辑
if (i % 5 == 0 && i > 4) {
process.stdout.write(item + "\n")
process.stdout.write("\n")
} else {
process.stdout.write(item + " ")
}
}
await inquirer.prompt({
type: 'input',
name: "waite",
message: color_str("orange", '您选择好了么,来让我预言下~~')
})
console.log(color_str("yellow", "------------------------------"))
console.log(color_str("yellow", "------------------------------"))
console.log(color_str("yellow", "------------------------------"))
console.log(`你选择的是:${list2[index2]}`)
console.log(color_str("red", "如果预言的对的话,欢迎给我的文章点赞哦~~~"))
console.log(color_str("yellow", "------------------------------"))
console.log(color_str("yellow", "------------------------------"))
}
registerCommend()
5.把程序发布到npm上
blog.csdn.net/taoerchun/a… 这篇文章写得很详细,按照这个来发布npm即可
不过,你需要注意的点是:
- pageck.json中的name不能与npm发布过的包名字重合,version每次发布都需要更新
- 在index.ts文件上加入 #!/usr/bin/env node ,让终端知道用什么加载文件
- pageck.json中的bin字段指向打包后的js文件
最后
源码你可以下载下来自己运行下,把玩儿下 github地址 运行命令 : npm run dev
如果就你觉得文章对你有帮助或者给我一些建议,欢迎评论和start
你的鼓励就是我创作的动力
转载自:https://juejin.cn/post/6961214445158662151