前言
什么是冯诺依曼原理?
冯·诺依曼原理,又称为“存储程序控制”原理,是1946年由美籍匈牙利数学家约翰·冯·诺依曼提出的,奠定了现代计算机设计和运作的基础。这一原理的核心内容包括以下几个方面:
- 计算机硬件组成:冯·诺依曼架构的计算机由五大基本部件构成,即控制器、运算器、存储器、输入设备和输出设备。这些部件相互配合,共同完成计算任务。
- 存储程序:这是冯·诺依曼原理的核心思想,即程序指令和数据一起存储在计算机的内存中。这意味着计算机能够自动访问并执行这些预先存储的指令,而无需人工干预每一步操作,实现了自动计算。
- 二进制系统:在冯·诺依曼体系结构下,计算机内部使用二进制数制(即仅用0和1两个符号)来表示数据和指令,这是因为二进制易于电子元件实现,且逻辑清晰。
- 程序执行顺序:计算机按照程序中指令的排列顺序执行,从内存中读取一条指令,解码并执行它,然后继续进行下一条,直至程序结束或遇到跳转指令改变执行序列。
计算机的 五大组成部分:
- 运算器:负责执行算术和逻辑运算。
- 控制器:控制计算机各部件协调工作,包括读取指令、解码指令以及发出控制信号。
- 存储器:用于存储程序和数据,使得计算机能够根据存储的指令序列自动工作。
- 输入设备:用于将外部信息转换为计算机可理解的形式并输入到计算机中。
- 输出设备:将计算机处理的结果转换为人类或其他系统可以理解的形式输出。
正文
- process.stdin为Node.js进程的标准输入流,用户可以通过命令行向这个流写入数据,再为其添加一个事件监听器,监听data事件,当有数据可读的时候,这个事件就会被触发。
// - 冯诺依曼原理
// - 获得用户的输入
// 后端的进程对象 程序运行的最小单元
// process 进程对象
// 冯诺依曼计算设备 process 对象 输入设备
// on data 监听输入事件 enter
process.stdin.on('data', (buffer) =>{
// 存储和通信的底层是二进制
console.log(buffer);
const action = buffer.toString().trim();
console.log(action, '------');
})
等待用户的输入:

- buffer是事件处理器的参数,当data事件触发时,Node.js会将接收到的数据一次性封装到一个Buffer对象中,并传递给这个回调函数。Buffer是用来处理二进制数据的,适合存储任何类型的数据,包括文本和图像等。
- action将接收到的二进制数据转换成字符串,并去除字符串两端的空白字符(因为在终端输入的时候,输入完按回车,会有一个空格)。

- 已经实现了用户的出拳,这个时候我们要得到对方的出拳才能来开始这个游戏,要实现一个特定的功能,这个时候我们可以用函数(适当的写些注释)来实现,来提高代码的可维护性,定义一个函数game来实现随机出拳:定义一个数组arr用于存石头、剪刀、布三个元素,接着对输入进行判断,判断用户的出拳是否合理,不合理就报错,合理就再出拳,通过Math库的random方法来随机生成0-1的数,再对其*3然后向下取整,这个时候生成的随机数为0、1、2三种,刚好通过以随机数为下标来获取数组arr的元素,所有元素都有可能获取,输出随机的出拳,通过if语句判断输赢,平局返回0,赢返回1,输返回-1,并返回相应的提示消息。
/**
* @func 根据用户输入,输出赢与输
* @return win/lose
*/
const game = (action) => {
const arr = ['rock', 'scissor', 'paper'];
// 输入的校验
if (arr.indexOf(action) == -1){
throw new Error('用户输入错误');
}
let computerAction;
let random = Math.floor(Math.random() * 3);
computerAction = arr[random];
console.log(computerAction);
if (computerAction == action) {
console.log('平局~')
return 0;
}else if ((computerAction == 'rock' && action == 'scissor') ||
(computerAction == 'scissor' && action == 'paper') ||
(computerAction == 'paper' && action == 'rock')){
return -1;
}else {
return 1;
}
}
- 在process.stdin的监听事件的回调函数中调用该函数,来得到游戏的结果,定义一个winUser、winComputer和count来记录用户赢得次数、电脑赢得次数和总回合,保证三局两胜,如果三局完成了,还没有两胜出现,则重新三个回合:
let winUser = 0;
let winComputer = 0;
let count = 0;
process.stdin.on('data', (buffer) =>{
// 存储和通信的底层是二进制
// console.log(buffer);
const action = buffer.toString().trim();
// console.log(action, '------');
// 独立的随机出拳业务
const result = game(action);
count++;
if (result == 1) {
++winUser;
console.log('你赢'+winUser+'局!');
}
if (result == -1) {
++winComputer;
console.log('我赢'+winComputer+'局!');
}
if (count == 3 && winUser >= 2) {
console.log('你赢了!');
process.exit();
}
if (count == 3 && winComputer >= 2) {
console.log('我赢了!');
process.exit();
}
if ((count == 3 && winUser < 2) || (count == 3 && winComputer < 2)){
count = 0;
winUser = 0;
winComputer = 0;
console.log('再重新来一局!');
}
})
- 电脑赢得情况

- 平局的情况

- 用户赢得情况

结语
良好的代码
- 计算机的底层原理
- 模块化
- 先做输入校验,报错