腾讯面试官叫你使用冯诺依曼原理编写一个石头剪刀布的游戏啦!

目录
文章目录隐藏
  1. 冯·诺依曼原理
  2. 输入设备:通过键盘拿到用户的输入?
  3. 输出设备
  4. 正文

面试官:请使用冯诺依曼原理,给我编写一个石头剪刀布的游戏(3 局两胜)。

冯·诺依曼原理

冯·诺依曼原理,又称为冯·诺依曼体系结构,是现代计算机设计的基础理论之一,由著名数学家和科学家约翰·冯·诺依曼在 20 世纪 40 年代提出。这一原理主要包括以下几个核心要素:

  1. 存储程序概念:这是冯·诺依曼体系结构的核心,意味着计算机程序和数据都被存储在计算机的内存中。这意味着计算机可以自动地、顺序地取出并执行指令,而不需要人工干预来指定每一步的操作。
  2. 二进制表示:在冯·诺依曼体系中,无论是数据还是指令,都以二进制的形式存储和处理。这是因为二进制系统简单、易于电子硬件实现,并且能够精确表示逻辑运算。
  3. 五大组成部分:计算机被划分为五个主要部分:
  • 运算器:负责执行算术和逻辑运算。
  • 控制器:控制计算机各部件协调工作,包括读取指令、解码指令以及发出控制信号。
  • 存储器:用于存储程序和数据,使得计算机能够根据存储的指令序列自动工作。
  • 输入设备:用于将外部信息转换为计算机可理解的形式并输入到计算机中。
  • 输出设备:将计算机处理的结果转换为人类或其他系统可以理解的形式输出。
  1. 程序顺序执行:计算机按照程序中指令的排列顺序执行,每个指令的地址由程序计数器(PC)给出,控制器根据 PC 的值从内存中取出指令并执行。
  2. 数据与指令无差别存储:在存储器中,程序指令和数据没有本质上的区别,都是以同等地位的二进制形式存放,由控制器区分并处理。

输入设备:通过键盘拿到用户的输入?

后端运行 js 访问输入设备 stdin。

输出设备

输出到 命令行。

正文

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('再重新来一局!');
    }
})

电脑赢得情况:

电脑赢得情况

平局的情况:

平局的情况

用户赢得情况:

用户赢得情况

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系maynote@foxmail.com处理
码云笔记 » 腾讯面试官叫你使用冯诺依曼原理编写一个石头剪刀布的游戏啦!

发表回复