在本節中,我們將用 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 的文件,並在這個檔案中進行實驗。
JavaScript 有一個簡單的方法來呼叫 Math.random() 產生隨機數。在便條本中,讓我們使用循環構造記錄 4 個隨機數。
console.log("Mastermind"); function App() { console.log("App"); } App();
我們要的是整數(如數字)0、1、2、...、9,而不是小數。我們可以將 Math.random() 傳回的值乘以 10,得到 x.something,其中 x 現在是 1,2,3,...,9。請記住,這些實驗都是在草稿本上完成的。嘗試一下。
我們想要的是點之前的數字,也就是整數部分。我們可以編寫程式碼將數字轉換為字串,然後用“.”分隔它。並獲取第一個元素。然而,我們可以使用一個名為「地板」的功能。
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 函數上方。
從摘要來看,使用的顏色數量是 4。因此我們需要為程式碼產生器產生 4 個數字。我們還必須處理是否允許重複。回到草稿本。
我們有函數、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中文網其他相關文章!