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

165 阅读3分钟

前言:

题目描述:请使用冯诺依曼原理,编写一个石头剪刀布的游戏。(三局两胜制)

冯诺依曼原理:

冯·诺依曼原理是现代计算机设计的基础理论,由著名数学家和计算机科学家约翰·冯·诺依曼提出。这一原理主要包括两个核心概念:存储程序和程序控制。

  1. 存储程序:这一概念指出计算机的程序和数据都应以同等地位存储在计算机的内存中。这意味着程序指令和处理的数据都被视为二进制信息,并且可以按地址访问。在计算机运行之前,程序会被加载到内存中,等待执行。
  2. 程序控制:计算机根据存储在内存中的程序指令序列自动执行任务,无需人工干预。计算机从第一条指令开始,控制器负责取出指令、解码并执行,然后依据指令的要求顺序执行后续指令,直到程序结束或者遇到停止指令。指令不仅指定了数据的运算方式,也指定了下一条要执行的指令地址,从而实现了流程控制。

process.stdin为Node.js进程的标准输入流,用户可以通过命令行向这个流写入数据。

process.stdin.on('data', (buffer) => {
    //存储和通信的底层是二进制
    //console.log(buffer)
    const action = buffer.toString().trim();
    //独立的随机出拳业务
    const result = game(action);
  1. process.stdin.on('data', (buffer) => { ... });

    这是一个事件监听器,用于监听stdindata事件。当从标准输入读取到数据时,这个回调函数将被触发。 传递给这个回调函数的参数buffer是一个Buffer对象,它包含了从stdin读取的原始二进制数据。

  2. const action = buffer.toString().trim();

    • 使用toString()方法将Buffer对象转换为字符串。默认情况下,这将使用UTF-8编码。
    • 使用trim()方法去除字符串两端的空白字符。
    • 将结果存储在名为action的常量中。
  3. const result = game(action);

    • 调用一个名为game的函数,并将action作为参数传递给它。这个函数会基于action的值来生成一个随机的“出拳”结果。 将game函数的返回值存储在名为result的常量中。

这个时候咱们已经实现了用户的出拳,然后我们需要得到电脑的出拳结果,要实现这个功能
1. 我们可以用一个函数来实现,定义一个函数game来实现电脑的随机出拳
2. 定义一个数组arr用于存石头、剪刀、布三个元素,接着对输入进行判断,判断用户的出拳是否合理,不合理就报错,合理就再出拳。
3. 通过Math库的random方法来随机生成0-1的数,再对其*3然后向下取整,这个时候生成的随机数为0、1、2三种,刚好通过以随机数为下标来获取数组arr的元素,所有情况都有可能获取,输出随机的出拳,通过if语句判断输赢,平局返回0,赢返回1,输返回-1。

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 (computerAction == action) {
        console.log("平局!");
        return 0;
    }else if (computerAction == "rock" && action == "scissors" || 
                computerAction == "paper" && action == "rock" || 
                computerAction == "scissors" && action == "paper") {
        console.log("你输了!");
        return -1;
    }else {
        console.log("你赢了!");
        return 1;
    }
}

通过用户的输赢来判断结果

给出全部代码:

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 (computerAction == action) {
        console.log("平局!");
        return 0;
    }else if (computerAction == "rock" && action == "scissors" || 
                computerAction == "paper" && action == "rock" || 
                computerAction == "scissors" && action == "paper") {
        console.log("你输了!");
        return -1;
    }else {
        console.log("你赢了!");
        return 1;
    }
}
let winCount = 0;
process.stdin.on('data', (buffer) => {
    const action = buffer.toString().trim();
    const result = game(action);
if(result==1){
    winCount++;
    if(winCount==3){
        console.log("不玩了!");
        process.exit();
    }
}
}) 

结果:

image.png 好啦,今天的分享就到这里啦。快去试试吧!