在本节中,我们将用 JavaScript 实现一个名为 Mastermind 的游戏。这个游戏开发将涵盖我们迄今为止讨论过的许多概念。我们将定义函数、向它们传递参数、使用变量以及使用循环和 if 语句。我们将简要介绍一下函数的另一个概念,即 IIFE,即立即调用函数表达式。我们还将了解如何通过命令行获取用户输入。此时,它只是控制台应用程序。
您可以在这里参考类似的实现,Master mind in python
Mastermind 是一款简单的棋盘游戏,使用颜色,但我们会使用数字。
摘要:条形后面是一名玩家放置的四种颜色。其他玩家看不到第一个玩家的颜色。第一个玩家的颜色称为代码制作者,另一个玩家的颜色称为代码破坏者。密码破译者尝试猜测密码编写者的密码(包括 2 到 12 次)。尝试次数必须是偶数。
在您的电脑(或放置项目的位置)上创建一个名为 mastermind 的文件夹,并在 mastermind 中,使用 npm init -y (在命令行上)初始化节点项目。我在 Linux 机器上,所以这就是我设置项目的方式。
这个游戏的起点(入口)将在App中,一个函数。让我们创建一个名为 App 的函数并添加 console.log("App")。然后我们可以调用 App() 并使用 Node app.js 执行代码。我不会告诉您运行代码,但这是您在编写代码时应该做的事情。这是我的 app.js 文件的当前内容。
console.log("Mastermind"); function App() { console.log("App"); } App();
比赛开始时
让我们实现一个为代码生成器生成随机数的函数,从而为代码生成器设置随机值。
app.js 中的代码,让我们创建另一个名为 scratch_pad.js 的文件,并在这个文件中进行实验。
console.log("Mastermind"); function App() { console.log("App"); } App();
for (let i = 0; i < 4; i++) { console.log(Math.random()); } // 0.10037268097853191 // 0.20981624777230534 // 0.47828165742292583 // 0.8160883929470153
for (let i = 0; i < 4; i++) { console.log(Math.floor(Math.random() * 10)); } // 4 // 7 // 3 // 4
app.js 并添加上面的函数来为代码生成器生成随机数。将其放在 App 函数上方。
我们有函数、if 和 else 语句、for 和 while 循环等。这些构造都有一个块或一个主体。在这些块中初始化的变量可以在块内使用,而不能在块外使用。这称为变量的范围。因此,变量可以存在于全局范围内,这意味着该变量可以在任何地方使用或评估。当我们在块中声明变量时。该变量成为内部变量或限制在该范围内。在暂存器中运行它。
console.log("Mastermind"); function App() { console.log("App"); } App();
for (let i = 0; i < 4; i++) { console.log(Math.random()); } // 0.10037268097853191 // 0.20981624777230534 // 0.47828165742292583 // 0.8160883929470153
此时我想提请您注意有关作用域的想法。
for (let i = 0; i < 4; i++) { console.log(Math.floor(Math.random() * 10)); } // 4 // 7 // 3 // 4
function generateRandomNumbersBetween(min, max) { return min + Math.floor(Math.random() * (max - min + 1)); } for (let i = 0; i < 4; i++) { console.log(generateRandomNumbersBetween(0, 9)); }
const HP = 100; if (true) { console.log("IF BLOCK::", HP); } console.log("End::", HP); // IF BLOCK:: 100 // End:: 100
这种获取用户输入的方法没有问题。只是我们必须使用回调函数,并且无法将输入的输入传递到 readlineOInstance.question 回调函数的外部范围。
你在想什么?在“便笺簿”中尝试一下。如果您正在考虑在 readlineOInstance.question 的外部范围中声明一个变量并将输入的输入分配给它,那么这是一个很好的方法,但是......仍然尝试一下。
你还记得 Promise 的概念吗?我们可以在这里使用 Promise 并解析输入。然而,我们必须将整个过程包装在函数中。 readlineOInstance.question 有几个部分有一个类似于 Question(query: string, callback: (answer: string) => void 的 header。query 是对用户的查询(或提示),callback 是如何我们处理输入集合。由于稍后可能会在某个地方重用相同的函数,因此我们会将查询作为参数传递。
console.log("Mastermind"); function App() { console.log("App"); } App();
for (let i = 0; i < 4; i++) { console.log(Math.random()); } // 0.10037268097853191 // 0.20981624777230534 // 0.47828165742292583 // 0.8160883929470153
for (let i = 0; i < 4; i++) { console.log(Math.floor(Math.random() * 10)); } // 4 // 7 // 3 // 4
function generateRandomNumbersBetween(min, max) { return min + Math.floor(Math.random() * (max - min + 1)); } for (let i = 0; i < 4; i++) { console.log(generateRandomNumbersBetween(0, 9)); }
运行 app.js 并与其交互。这是交互过程中的类似输出。
const HP = 100; if (true) { console.log("IF BLOCK::", HP); } console.log("End::", HP); // IF BLOCK:: 100 // End:: 100
IF BLOCK:: 100 /home/Projects/mastermind/scratch_pad.js:8 console.log(x) ^ ReferenceError: x is not defined at Object.<anonymous> (/home/Projects/mastermind/scratch_pad.js:8:13) at Module._compile (node:internal/modules/cjs/loader:1469:14) at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) at Module.load (node:internal/modules/cjs/loader:1288:32) at Module._load (node:internal/modules/cjs/loader:1104:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12) at node:internal/main/run_main_module:28:49 Node.js v20.17.0
// a global code maker that is accessible inside any other scope let CODE_MAKER = []; function generateRandomNumbersBetween(min, max) { return min + Math.floor(Math.random() * (max - min + 1)); } function generateCodeMaker(isDuplicatesAllowed = false) { let counter = 0; while (counter < 4) { let code = generateRandomNumbersBetween(0, 9); if (isDuplicatesAllowed) { CODE_MAKER.push(code); counter += 1; } else if (!CODE_MAKER.includes(code)) { CODE_MAKER.push(code); counter += 1; } } } console.log(CODE_MAKER); generateCodeMaker(true); console.log(CODE_MAKER); // reset the code maker CODE_MAKER = []; generateCodeMaker(false); console.log(CODE_MAKER); // [] // [ 6, 6, 0, 9 ] // [ 2, 5, 0, 8 ]
现在我们可以将 HINTS 和 CompareCode 函数添加到 app.js 中。现在是在 App 功能之上运行 app.js 的好时机。
现在我们实现了一个比较代码生成器和代码破解器的函数,现在我们可以将其放入循环中以计算轮数(轮数 = 玩游戏的次数)。因此,如果轮数为 6,那么游戏将进行 6 次,但当用户正确猜出所有代码时,即 HINTS 中的值全为 0 时,我们必须终止游戏。因此,当我们数出 HINTS 中 0 的数量并且为 4 时,我们就可以终止游戏并说用户获胜。
console.log("Mastermind"); function App() { console.log("App"); } App();
for (let i = 0; i < 4; i++) { console.log(Math.random()); } // 0.10037268097853191 // 0.20981624777230534 // 0.47828165742292583 // 0.8160883929470153
for (let i = 0; i < 4; i++) { console.log(Math.floor(Math.random() * 10)); } // 4 // 7 // 3 // 4
function generateRandomNumbersBetween(min, max) { return min + Math.floor(Math.random() * (max - min + 1)); } for (let i = 0; i < 4; i++) { console.log(generateRandomNumbersBetween(0, 9)); }
我想我们可以享受到目前为止的辛苦工作了。我有大约130行。你有多少个?
这是完整代码
const HP = 100; if (true) { console.log("IF BLOCK::", HP); } console.log("End::", HP); // IF BLOCK:: 100 // End:: 100
尽管这是一个简单的控制台/终端/基于文本的应用程序,但我们可以做更多的事情。
IF BLOCK:: 100 /home/Projects/mastermind/scratch_pad.js:8 console.log(x) ^ ReferenceError: x is not defined at Object.<anonymous> (/home/Projects/mastermind/scratch_pad.js:8:13) at Module._compile (node:internal/modules/cjs/loader:1469:14) at Module._extensions..js (node:internal/modules/cjs/loader:1548:10) at Module.load (node:internal/modules/cjs/loader:1288:32) at Module._load (node:internal/modules/cjs/loader:1104:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12) at node:internal/main/run_main_module:28:49 Node.js v20.17.0
// a global code maker that is accessible inside any other scope let CODE_MAKER = []; function generateRandomNumbersBetween(min, max) { return min + Math.floor(Math.random() * (max - min + 1)); } function generateCodeMaker(isDuplicatesAllowed = false) { let counter = 0; while (counter < 4) { let code = generateRandomNumbersBetween(0, 9); if (isDuplicatesAllowed) { CODE_MAKER.push(code); counter += 1; } else if (!CODE_MAKER.includes(code)) { CODE_MAKER.push(code); counter += 1; } } } console.log(CODE_MAKER); generateCodeMaker(true); console.log(CODE_MAKER); // reset the code maker CODE_MAKER = []; generateCodeMaker(false); console.log(CODE_MAKER); // [] // [ 6, 6, 0, 9 ] // [ 2, 5, 0, 8 ]
// a global code maker that is accessible inside any other scope let CODE_MAKER = []; function generateRandomNumbersBetween(min, max) { return min + Math.floor(Math.random() * (max - min + 1)); } function generateCodeMaker(isDuplicatesAllowed = false) { let counter = 0; let codeMaker = []; while (counter < 4) { let code = generateRandomNumbersBetween(0, 9); if (isDuplicatesAllowed) { codeMaker.push(code); counter += 1; } else if (!codeMaker.includes(code)) { codeMaker.push(code); counter += 1; } } return codeMaker; } console.log(CODE_MAKER); CODE_MAKER = generateCodeMaker(true); console.log(CODE_MAKER); CODE_MAKER = generateCodeMaker(false); console.log(CODE_MAKER); // [] // [ 6, 6, 0, 9 ] // [ 2, 5, 0, 8 ]
我们已经使用了在这个项目中学到的所有知识,而且还有更多。我提到我们可以对一些函数进行分组并导出它们。为此,我们将讨论如何在 Javascript 中导入和导出。我将提供另一个我认为对您有用的项目。智者游戏到此结束,希望大家也进行一些重构,因为还有很多需要重构的地方。祝你好运...
const readline = require("readline"); const readlineOInstance = readline.createInterface({ input: process.stdin, output: process.stdout, }); readlineOInstance.question("Enter code maker: ", (userInput) => { console.clear(); console.log(`INPUT: ${userInput}`); readlineOInstance.close(); });
以上是JavaScript 要点:Javascript 的部分策划者)的详细内容。更多信息请关注PHP中文网其他相关文章!