likes
comments
collection
share

"冯·诺依曼架构下的用户输入处理:探索进程对象与后端通信机制"

作者站长头像
站长
· 阅读数 27

前言:

冯诺依曼原理:

核心特点:

  1. 存储程序:这是冯·诺依曼体系最核心的概念之一,意味着计算机程序和数据一同存储在计算机的内存中。这意味着计算机能够自动地、顺序地读取和执行指令,无需人工干预来切换程序或数据。
  2. 二进制表示:在冯·诺依曼体系中,无论是指令还是数据,都使用二进制形式表示和处理,这是因为二进制便于电子元件实现逻辑运算和存储。
  3. 程序控制:计算机通过一系列指令控制其操作,这些指令按照特定的顺序从内存中取出、解码并执行。控制器负责这个过程,确保指令的有序执行。
  4. 统一的存储结构:指令和数据存储在同一地址空间内,虽然它们可能有不同的逻辑角色,但在物理存储上没有区别,都作为信息的集合被处理。
  5. 基本硬件组成:冯·诺依曼计算机由五大部分组成:运算器(负责算术逻辑运算)、控制器(管理指令执行流程)、存储器(保存程序和数据)、输入设备(接收外部信息)和输出设备(展示处理结果)。

构建思路:

  1. 根据用户输入,输出胜或赢
  2. 冯诺依曼计算设备 process 对象 输入设备
  3. win or lose

正文

  • 参数action 用户输入的动作,期望值为 'rock'(石头)、'scissor'(剪刀)或'paper'(布)之一。

  • 功能:

    1. 输入验证: 检查用户输入是否有效,如果action不在预设数组['rock', 'scissor', 'paper']中,则抛出错误。
    2. 计算机出拳: 使用Math.random()生成一个0到2之间的随机数,对应数组中的一个元素作为计算机的选择。
    3. 判断胜负: 根据用户和计算机的选择比较结果,打印出结果(赢、输或平局),并返回相应的结果代码(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;
    }

}

  1. 已经实现了用户的出拳,这个时候我们要得到对方的出拳才能来开始这个游戏,要实现一个特定的功能,这个时候我们可以用函数来实现,来提高代码的可维护性。

  2. 定义一个函数game来实现随机出拳:定义一个数组arr用于存石头、剪刀、布三个元素,接着对输入进行判断。

  3. 判断用户的出拳是否合理,不合理就报错,合理就再出拳,通过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
评论
请登录