likes
comments
collection
share

如何用冯诺依曼原理编写石头剪刀布游戏

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

引言

在本文中,我们将通过编写一个简单的石头剪刀布游戏来展示冯诺依曼原理在计算机程序设计中的应用。首先,我们将介绍冯诺依曼原理的基本概念,然后详细解释代码的实现过程,并介绍代码中如何体现冯诺依曼原理。

冯·诺依曼原理

冯·诺依曼原理构成了计算机系统的基础,并沿用至今,其主要特点和组成部分包括:

  1. 存储程序型计算机:冯·诺依曼体系结构的计算机能够存储程序和数据在同一个存储器中。这意味着计算机不仅可以存储数据,还可以存储操作这些数据的指令序列。当计算机运行时,它可以自动地从存储器中取出指令并执行,而无需人工干预。

  2. 二进制:计算机内部使用二进制(0和1)表示数据和指令,这是因为二进制容易用电子元件实现,且逻辑运算简单明了。

  3. 五大组成部件:一个典型的冯·诺依曼体系结构计算机由五个主要部分构成:

    • 运算器(Arithmetic Logic Unit, ALU):执行基本的算术和逻辑运算。
    • 控制器(Control Unit, CU):负责协调计算机各个部件的工作,包括从存储器取出指令、解码指令、管理指令执行的时序以及控制数据的流动。
    • 存储器(Memory):用于存放程序和数据,包括程序指令和执行程序所需的数据。
    • 输入设备:用于向计算机输入数据或指令,例如键盘、鼠标。
    • 输出设备:用于展示计算机处理结果,如显示器、打印机。
  4. 指令执行周期:计算机的工作可以概括为一个循环的过程,包括取指令、解码指令、执行指令、访问存储器(读/写数据)、跳转到下一个指令地址等步骤,这一循环直到遇到停止指令或外部中断才会结束。

代码实现

编写了一个名为game的函数,该函数实现了一个简单的石头剪刀布游戏。该函数接受用户输入的动作,并根据用户输入和电脑随机生成的动作进行比较,最终输出游戏结果。以下是代码的实现过程:

  1. 定义了游戏的动作列表,包括石头、剪刀和布。
const game = (userAction) => { // 根据用户输入进行游戏
    const actions = ['rock', 'scissors', 'paper']; // 定义游戏的动作
}
  1. 对用户输入的动作进行校验,确保用户输入的动作在游戏规则内。
// 校验用户输入的动作是否有效
    if (actions.indexOf(userAction) === -1) { // 如果用户输入不在动作列表中
        console.log('请输入有效的动作:rock, scissors 或 paper'); // 提示用户输入有效动作
        return null; // 返回空值,表示输入无效
    }
  1. 随机生成电脑的动作,模拟电脑的选择过程。
// 随机生成电脑的动作
    const computerAction = actions[Math.floor(Math.random() * 3)]; // 生成随机数来模拟电脑的动作选择   
  1. 根据用户输入和电脑选择的动作,判断游戏结果,并输出相应的提示信息。
console.log('电脑出了' + computerAction); // 显示电脑的动作
// 判断游戏结果
    if (computerAction === userAction) { // 如果电脑和用户选择相同
        console.log('平局'); // 显示平局结果
        return 'draw'; // 返回平局结果,使用字符串表示
    } else if (
        (computerAction === 'rock' && userAction === 'scissors') || // 如果电脑出石头而用户出剪刀
        (computerAction === 'scissors' && userAction === 'paper') || // 如果电脑出剪刀而用户出布
        (computerAction === 'paper' && userAction === 'rock') // 如果电脑出布而用户出石头
    ){
        console.log('你输了'); // 显示用户输了
        return 'lose'; // 返回输了的结果,使用字符串表示
    } else {
        console.log('你赢了'); // 显示用户赢了
        return 'win'; // 返回赢了的结果,使用字符串表示
    }
}

5.监听用户的输入事件,获取用户的输入,调用game函数并传入用户输入作为参数,获取游戏结果。

// 监听用户输入事件
process.stdin.on('data', (buffer) => { // 监听用户输入
    const userAction = buffer.toString().trim(); // 获取用户输入并去除首尾空格
    const result = game(userAction); // 调用游戏函数并传入用户输入作为参数,获取游戏结果
})

6.三局两胜。声明winCounter表示胜利的次数,先判断用户的输赢情况,如果用户赢了,则胜利次数加一,如果winCounter === 2则说明用户两局胜利,赢得比赛,process.exit()结束游戏;声明loseCounter表示失败的次数,先判断用户的输赢情况,如果用户输了,则失败次数加一,如果loseCounter === 2则说明用户两局失败,输掉比赛,process.exit()结束游戏。

let winCounter = 0; // 初始化胜利次数计数器
let loseCounter = 0; // 初始化失败次数计数器

    // 根据游戏结果更新胜利或失败次数并判断游戏是否结束
    if (result === 'win') { // 如果用户赢了
        winCounter++; // 胜利次数加一
        if (winCounter === 2) { // 如果胜利次数达到2次(两局胜利)
            console.log('你赢得了比赛!'); // 提示用户赢得比赛
            process.exit(); // 结束游戏
        }
    } else if (result === 'lose') { // 如果用户输了
        loseCounter++; // 失败次数加一
        if (loseCounter === 2) { // 如果失败次数达到2次(两局失败)
            console.log('你输了比赛!'); // 提示用户输掉比赛
            process.exit(); // 结束游戏
        }
    }

输出结果

你赢了比赛

如何用冯诺依曼原理编写石头剪刀布游戏

你输了比赛

如何用冯诺依曼原理编写石头剪刀布游戏

总结

在这段JavaScript代码中,虽然没有直接提及冯·诺依曼架构的每个细节,但我们可以观察到一些体现这一架构原则的间接表现:

  • 存储程序概念:代码中定义了game函数以及变量如winCounter和loseCounter,这些都可以视作存储在内存中的程序指令和数据。通过调用函数和操作变量,体现了程序和数据存储在统一的存储器中并按需执行的理念。

  • 输入输出:使用process.stdin.on('data', ...)监听用户的键盘输入,这是典型的输入设备交互。而通过console.log(...)向用户显示信息,则模拟了输出设备的功能。这体现了程序能接收外部输入并产生输出,符合冯·诺依曼架构的输入输出设备概念。

  • 控制单元与逻辑运算:虽然JavaScript代码中没有明确分离出控制器和运算器的概念,但if...else条件判断、循环控制以及函数调用等结构,可以视为控制逻辑的体现。例如,基于用户输入和随机生成的电脑动作判断游戏结果,以及根据游戏结果更新计数器并决定游戏是否结束,这些逻辑处理过程类似于控制器的工作,而具体的比较运算则涉及运算器的功能。

综上所述,这段代码通过程序的组织结构、数据处理流程及与用户的交互方式,间接体现了冯·诺依曼体系结构的一些基本原理,尽管没有直接展示硬件层面的分离,但在软件抽象层面上遵循了存储程序和控制流的概念。

完整代码

const game = (userAction) => { 
    const actions = ['rock', 'scissors', 'paper']; 
    
    if (actions.indexOf(userAction) === -1) {
        console.log('请输入有效的动作:rock, scissors 或 paper'); 
        return null; 
    }

    const computerAction = actions[Math.floor(Math.random() * 3)]; 

    console.log('电脑出了' + computerAction); 
    
    if (computerAction === userAction) {
        console.log('平局'); 
        return 'draw'; 
    } else if (
        (computerAction === 'rock' && userAction === 'scissors') || 
        (computerAction === 'scissors' && userAction === 'paper') || 
        (computerAction === 'paper' && userAction === 'rock') 
    ){
        console.log('你输了'); 
        return 'lose'; 
    } else {
        console.log('你赢了'); 
        return 'win'; 
    }
}

let winCounter = 0; 
let loseCounter = 0; 

// 监听用户输入事件
process.stdin.on('data', (buffer) => { 
    const userAction = buffer.toString().trim(); 
    const result = game(userAction); 

    if (result === 'win') { 
        winCounter++;
        if (winCounter === 2) {
            console.log('你赢得了比赛!'); 
            process.exit(); 
        }
    } else if (result === 'lose') { 
        loseCounter++; 
        if (loseCounter === 2) { 
            console.log('你输了比赛!');
            process.exit(); 
        }
    }
})
转载自:https://juejin.cn/post/7369143633419010057
评论
请登录