应用冯诺依曼原理:编写石头剪刀布游戏的计算机程序

500 阅读6分钟

引言

今天,我们将探索计算机科学中一个基础而重要的原理:冯诺依曼原理。作为计算机领域的一名学习者,我深知冯诺依曼原理对于理解计算机结构和设计的重要性。它不仅是理论知识,更是我们编写高效、可靠程序的基石。

在本次学习中,我们将通过一个有趣的实例来深入理解冯诺依曼原理的应用:石头剪刀布游戏。通过这个简单而富有挑战的游戏,我们将了解如何利用冯诺依曼原理的思想,设计并实现一个完整的计算机程序。从获取用户输入、处理游戏逻辑到输出结果,我们将一步步地领略冯诺依曼原理在实际编程中的威力。

让我们一起开始这个有趣而富有启发性的学习之旅吧!

冯诺依曼原理

在开始之前,我们先来简单了解一下冯诺依曼原理。

在计算机科学中,冯诺依曼原理是一项基本的原理,它描述了一种通用的计算机结构,将程序和数据存储在同一内存中,并通过控制单元对程序进行操作。这种结构的特点是程序具有指令和数据的等价地位,计算机可以根据存储在内存中的程序来执行指令,从而完成各种计算任务。

游戏设计

石头剪刀布是一种简单而经典的游戏,通常由两个玩家参与。每个玩家同时出示一种手势,可能是石头、剪刀或布。根据两个玩家的手势,确定胜负关系:石头胜剪刀,剪刀胜布,布胜石头。如果两个玩家出的手势相同,则游戏平局。

程序设计

这个程序涵盖了输入、处理和输出三个模块,完整地体现了计算机程序设计的基本原理。

输入处理

process.stdin.on('data', (buffer) => {
    // 存储和通信的底层是二进制
    // console.log(buffer, '------');
    const action = buffer.toString().trim();
    // console.log(action, '------');
    // 独立的随机出拳业务
    const result = game(action);
    if (result == 1) {
        winCount++;
        console.log('你赢了' + winCount + '次');
        if (winCount == 3) {
            console.log('你赢了' + winCount + '次,电脑不玩了');
            process.exit();
        }
    }
});

在这个部分,我们通过 process.stdin.on('data', ...) 监听了用户的输入,获取用户出拳的动作。process.stdin 是 Node.js 中的一个可读流(Readable Stream),它表示了标准输入流,可以用来从控制台获取用户输入。on('data', ...) 是一个事件监听器,当有新的数据输入时,会触发该事件,并执行对应的回调函数。buffer.toString().trim() 将输入转换为字符串,并去除首尾的空白字符,确保输入的准确性。

游戏逻辑处理

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); // 0-3 floor: 向下取整 0-2
    computerAction = arr[random];
    console.log('电脑出了' + computerAction);
    
    if (computerAction == action) {
        console.log('平局')
        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;
    }
}

game 函数是我们实现游戏逻辑的地方。首先,我们定义了一个包含石头、剪刀和布的数组 arr,用于存储游戏的可能选择。然后,我们通过 Math.random() 方法生成一个随机数,乘以3取整,得到一个范围在0到2之间的随机数,用于表示计算机的随机选择。接着,我们根据玩家和计算机的选择,判断胜负关系,并通过 console.log 输出结果。

输出结果

let winCount = 0;
if (result == 1) {
        winCount++;
        console.log('你赢了' + winCount + '次');
        if (winCount == 3) {
            console.log('你赢了' + winCount + '次,电脑不玩了');
            process.exit();
        }
    }

在这一部分,我们通过 console.log 方法输出游戏的结果,并记录玩家的胜利次数。这个方法用于将信息输出到控制台,便于用户观察程序的运行状态。我们还利用了 process.exit() 方法来结束程序的运行,当玩家连续获胜达到3次时,通过 process.exit() 结束游戏。这个方法用于终止 Node.js 应用程序的执行,参数可选,通常用于指定退出码。在这个程序中,我们没有传入参数,表示正常退出程序。

代码整合:

/**
 * @func 根据用户输入,输出胜或赢
 * @return win/lose
 */
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); // 0-3 floor: 向下取整 0-2
    computerAction = arr[random];
    console.log('电脑出了' + computerAction);
    if (computerAction == action) {
        console.log('平局')
        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;
    }

}

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++;
        console.log('你赢了' + winCount + '次');
        if (winCount == 3) {
            console.log('你赢了' + winCount + '次,电脑不玩了');
            process.exit();
        }
    }
});

总结

今天我们通过一个简单的石头剪刀布游戏,深入理解了冯诺依曼原理在计算机程序设计中的应用。以下是我们从这个游戏中学到的几个关键点:

  1. 冯诺依曼原理的应用
  • 在游戏程序中,我们使用了冯诺依曼原理的基本思想:将程序和数据存储在同一内存中,并通过控制单元执行程序。这种结构使得程序具有了灵活性和通用性,能够完成各种计算任务。
  1. 模块化的程序设计
  • 我们将程序分解成了输入处理、游戏逻辑处理和输出结果三个模块,通过模块化的设计使得程序结构清晰,易于理解和维护。这也是冯诺依曼原理的体现,即将复杂的问题分解成简单的模块来处理。
  1. 底层通信的实现
  • 通过底层通信方式 process.stdin.on('data', ...),我们实现了程序与用户之间的交互。这展示了冯诺依曼原理中控制单元与外部环境之间的通信方式,加深了我们对计算机底层工作原理的理解。
  1. 错误处理和程序稳健性
  • 在程序设计中,我们对用户输入进行了有效性检查,以及对无效输入进行了错误处理。这体现了良好的程序设计实践,保证了程序的稳健性和可靠性。
  1. 实践与理论的结合
  • 通过这个简单的游戏程序,我们将计算机科学的理论知识与实际编程相结合,深入理解了冯诺依曼原理在实际应用中的重要性。这种实践与理论相结合的学习方式有助于我们更好地理解和应用所学知识。

总的来说,通过划拳游戏的实现,我们不仅加深了对冯诺依曼原理的理解,还锻炼了程序设计和编程能力,如果你觉得有学到东西,希望你能够点赞收藏哟~