"冯·诺依曼架构下的用户输入处理:探索进程对象与后端通信机制"
前言:
冯诺依曼原理:
核心特点:
- 存储程序:这是冯·诺依曼体系最核心的概念之一,意味着计算机程序和数据一同存储在计算机的内存中。这意味着计算机能够自动地、顺序地读取和执行指令,无需人工干预来切换程序或数据。
- 二进制表示:在冯·诺依曼体系中,无论是指令还是数据,都使用二进制形式表示和处理,这是因为二进制便于电子元件实现逻辑运算和存储。
- 程序控制:计算机通过一系列指令控制其操作,这些指令按照特定的顺序从内存中取出、解码并执行。控制器负责这个过程,确保指令的有序执行。
- 统一的存储结构:指令和数据存储在同一地址空间内,虽然它们可能有不同的逻辑角色,但在物理存储上没有区别,都作为信息的集合被处理。
- 基本硬件组成:冯·诺依曼计算机由五大部分组成:运算器(负责算术逻辑运算)、控制器(管理指令执行流程)、存储器(保存程序和数据)、输入设备(接收外部信息)和输出设备(展示处理结果)。
构建思路:
- 根据用户输入,输出胜或赢
- 冯诺依曼计算设备 process 对象 输入设备
- win or lose
正文
-
参数:
action
用户输入的动作,期望值为'rock'
(石头)、'scissor'
(剪刀)或'paper'
(布)之一。 -
功能:
- 输入验证: 检查用户输入是否有效,如果
action
不在预设数组['rock', 'scissor', 'paper']
中,则抛出错误。 - 计算机出拳: 使用
Math.random()
生成一个0到2之间的随机数,对应数组中的一个元素作为计算机的选择。 - 判断胜负: 根据用户和计算机的选择比较结果,打印出结果(赢、输或平局),并返回相应的结果代码(1代表赢,0代表平局,-1代表输)。
- 输入验证: 检查用户输入是否有效,如果
主体逻辑
-
初始化变量
winCount
用于记录玩家胜利的次数。 -
监听
process.stdin
的'data'
事件,即当有数据从标准输入(通常是键盘)发送到Node.js进程时触发此事件。-
数据处理: 将接收到的二进制数据转换为字符串,并去除首尾空白字符得到用户实际输入的动作
action
。 -
游戏进行: 调用
game(action)
函数,根据函数返回的结果判断游戏结果。- 如果玩家胜利(
result == 1
),则增加胜利计数winCount
。 - 当玩家赢得三局(
winCount == 3
)时,打印“不玩了”并调用process.exit()
终止进程
- 如果玩家胜利(
-
这是游戏构建的主要布局,下面用代码演示:
process.stdin.on('data', (buffer) =>{
const action = buffer.toString();
console.log(action,'------');
})
这个代码片段是在Node.js中使用process.stdin
来读取标准输入的数据:这段代码是使用Node.js编写的,它用于处理标准输入(stdin)的事件。在Node.js环境中,process
是一个全局对象,提供了与当前Node.js进程相关的各种属性和方法,其中包括对标准输入、输出的支持的作用是持续监听控制台的输入,一旦有输入内容,就将其打印出来,常用于构建需要接收用户命令行输入的简单交互式程序。
const game = (action) => {
const arr = ['rock', 'scissor', 'paper'];
console.log(action);
// 输入校验
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')
) {
console.log('你输了')
return -1;
} else {
console.log('你赢了');
return 1;
}
}
-
已经实现了用户的出拳,这个时候我们要得到对方的出拳才能来开始这个游戏,要实现一个特定的功能,这个时候我们可以用函数来实现,来提高代码的可维护性。
-
定义一个函数game来实现随机出拳:定义一个数组arr用于存石头、剪刀、布三个元素,接着对输入进行判断。
-
判断用户的出拳是否合理,不合理就报错,合理就再出拳,通过Math库的random方法来随机生成0-1的数,再对其*3然后向下取整,这个时候生成的随机数为0、1、2三种,刚好通过以随机数为下标来获取数组arr的元素,所有元素都有可能获取,输出随机的出拳,通过if语句判断输赢,平局返回0,赢返回1,输返回-1,并返回相应的提示消息。
let winCount = 0;
process.stdin.on('data', (buffer) => {
// 存储和通信的底层是二进制
// console.log(buffer);
const action = buffer.toString().trim();
// console.log(action, '------');
// 独立的随机出拳业务
const result = game(action);
if(result == 1){
winCount ++
if(winCount == 3){
console.log('不玩了');
process.exit();
}
}
})
进行用户输赢的判断来决定最终的结果。
给上完整代码:
let userWinCount = 0;//用户分数
let computerWinCount = 0;//电脑分数
process.stdin.on('data', (buffer) => {
const action = buffer.toString().trim();
const result = game(action);
if (result == 1) {
userWinCount++;
if (userWinCount == 3) {
console.log('恭喜你,你获胜了');
process.exit();
}
}
else if (result == -1) {
computerWinCount++;
if (computerWinCount == 3) {
console.log('电脑获胜了,你输了');
process.exit();
}
}
else {
console.log('平局,再来一局');
}
})
/*
*@func 根据用户输入的参数,输出结果
*@return win(1) or lose(-1) or draw(0)
*/
const game = (action) => {
const arr = ['rock', 'paper', 'scissors'];
//输入校验
if (arr.indexOf(action) == -1) {
throw new Error('用户输入错误')
}
let computerAction;
let random = Math.floor(Math.random() * 3);
computerAction = arr[random];
console.log('电脑出了' + computerAction);
if (action == computerAction) {
//平局
return 0;
}
else if ((computerAction == 'rock' && action == 'scissors') || (computerAction == 'scissors' && action == 'paper') || (computerAction == 'paper' && action == 'rock')) {
console.log('电脑赢');
return -1;
}
else {
console.log('用户赢');
return 1;
}
}
最终执行出的结果:
总结:
此可以作为腾讯面试题,运用了冯诺依曼原理来进行最根本的计算机的输入操作,大家可以去试试。
转载自:https://juejin.cn/post/7368758932154204212