搜尋
首頁web前端js教程JavaScript 重點:Javascript 的部分策劃者)

JavaScript Essentials: Part Mastermind in Javascript)

在本節中,我們將用 JavaScript 實作一個名為 Mastermind 的遊戲。這個遊戲開發將涵蓋我們迄今為止討論過的許多概念。我們將定義函數、向它們傳遞參數、使用變數以及使用迴圈和 if 語句。我們將簡要介紹函數的另一個概念,即 IIFE,即立即呼叫函數表達式。我們還將了解如何透過命令列獲取用戶輸入。此時,它只是控制台應用程式。

您可以在這裡參考類似的實現,Master mind in python

Mastermind 是一款簡單的棋盤遊戲,使用顏色,但我們會使用數字。

摘要:條形後面是一名玩家放置的四種顏色。其他玩家看不到第一個玩家的顏色。第一個玩家的顏色稱為代碼製作者,另一個玩家的顏色稱為代碼破壞者。密碼破解者嘗試猜測密碼編寫者的密碼(包括 2 到 12 次)。嘗試次數必須是偶數。

執行

  • 在您的電腦(或放置項目的位置)上建立一個名為mastermind 的資料夾,並在mastermind 中,使用npm init -y (在命令列上)初始化節點項目。我在 Linux 機器上,所以這就是我設定專案的方式。

    • 打開我的終端,運行,cd 將我移動到用戶資料夾。
    • 然後,cd ~/projects。項目是我保存項目的地方。
    • 然後 mkdir mastermind 和 cd mastermind 建立 mastermind 資料夾並切換到該資料夾。
    • 使用 npm init -y 初始化節點項目。將建立 package.json 檔案。
    • 使用觸控 app.js 建立 app.js
    • 將 console.log("Mastermind") 寫入 app.js 並使用 Node app.js 運行它。我希望見到Mastermind,否則我的設定有問題。
  • 這個遊戲的起點(入口)將在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 



  • 其工作原理是,如果我們想得到某個數字min 和max 之間的隨機數,其中max 大於min,那麼我們可以這樣做, min Math.floor(Math.random() * (max -分鐘1))。 min 是最小期望值,max 是最大期望值。在我們的例子中,最小值為 0,最大值為 9。
  • 這是我用來產生隨機數的片段。我向函數添加了參數,因為我不希望函數具有內部狀態。
for (let i = 0; i 



  • 此時,我們現在可以回到 app.js 並加入上面的函數來為程式碼產生器產生隨機數。將其放在 App 函數上方。

  • 從摘要來看,使用的顏色數量是 4。因此我們需要為程式碼產生器產生 4 個數字。我們還必須處理是否允許重複。回到草稿本。

  • 我們有函數、if 和 else 語句、for 和 while 迴圈等。這些構造都有一個區塊或一個主體。在這些區塊中初始化的變數可以在區塊內使用,而不能在區塊外使用。這稱為變數的範圍。因此,變數可以存在於全域範圍內,這意味著該變數可以在任何地方使用或評估。當我們在區塊中聲明變數時。該變數成為內部變數或限制在該範圍內。在暫存器中運行它。

console.log("Mastermind");

function App() {
  console.log("App");
}

App();
  • 現在透過在 if 語句中初始化變數 x 來更新它,console.log(x) 在 if 區塊之外並執行便簽本。您應該會收到與此類似的錯誤。
for (let i = 0; i 



<p>此時我想提請您注意有關作用域的想法。 </p>

  • 產生程式碼產生器時,我們想知道是否允許重複,此時,我們知道程式碼產生器是一個數字(或數字字串)陣列。讓我們從便條本開始。我們想要實作一個函數,它接受一個布林參數來指示是否允許重複。該函數會將四個數字添加(推送)到程式碼產生器中,但在此之前,我們必須檢查是否允許重複,並在不允許時進行處理。
for (let i = 0; i 



  • 我們也以這樣的方式編寫程式碼,即程式碼產生器不能在程式碼產生器函數中全域存取。因此將返回代碼生成器。
function generateRandomNumbersBetween(min, max) {
  return min + Math.floor(Math.random() * (max - min + 1));
}

for (let i = 0; i 



  • app.js 中,我們現在可以加入程式碼產生器函數和用於程式碼產生的變數。
  • 現在回到草稿本。我們希望從終端獲取用戶的輸入。 JavaScript 也有辦法做到這一點。試試這個片段。
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();
  • 現在我們可以將 getInput 函數加入到 app.js 中。不要忘記導入,const readline = require("readline")。 app.js 的內容應類似下面的程式碼片段。
for (let i = 0; i 



  • 現在我們要求使用者輸入輪數以及是否允許重複。我們知道輪數必須是偶數並且在 2 到 12 之間。我們將實作一個函數來驗證值(數字)是否為偶數並且在 2 到 12 之間。它將傳回一個布林值。當數模 2 為零時,該數為偶數。 (即數字 % 2 == 0)。
for (let i = 0; i 



  • 在App函數的主體中,我們可以要求輸入並驗證它們。我們將不斷要求輸入正確的輪數。對於程式碼中的重複值,當使用者輸入預期之外的任何內容時,我們會假設使用者不想要重複值。我們將使用while 循環並將條件設為true,並且僅在回合有效時才中斷,但使用try 和catch(用於錯誤處理),當使用者輸入無效值時,我們會記錄一條訊息,指示輸入的值無效。嘗試一下。
function generateRandomNumbersBetween(min, max) {
  return min + Math.floor(Math.random() * (max - min + 1));
}

for (let i = 0; i 



運行 app.js 並與其互動。這是交互過程中的類似輸出。

const HP = 100;

if (true) {
  console.log("IF BLOCK::", HP);
}

console.log("End::", HP);

// IF BLOCK:: 100
// End:: 100
  • 我們已經計算了輪數和重複值。現在我們可以產生程式碼產生器了。為此,我們可以呼叫generateCodeMaker函數並將複製選項值傳遞給它(或保留它,因為它預設為false)。
 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
</anonymous>
  • 現在我們可以向使用者詢問代碼破解器並將其與代碼產生器進行比較。破碼器也是一個數字數組。我們還將添加一個提示,讓用戶知道他們距離特定代碼有多遠。因此,如果破碼者的程式碼大於破碼者的程式碼,我們就說得更多。當它們相等時我們說相等,而當來自破碼器的代碼小於破碼器的代碼時我們說更少。讓我們進入草稿本。
  • 我們將建立一個函數,該函數將採用 4 個元素的數字數組,然後比較使用者的輸入(程式碼斷路器)。
// 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 



  • 我們有一個變數來處理提示,以及與程式碼創建者和破壞者相關的每個程式碼的值。
  • 我們將程式碼產生器傳遞給函數,以將其與使用者的輸入進行比較。
  • 我們更新了提示,讓使用者知道如何更新程式碼斷路器中的值
  • 現在我們可以將 HINTS 和 CompareCode 函數加入到 app.js 中。現在是在 App 功能之上運行 app.js 的好時機。

  • 現在我們實作了一個比較程式碼產生器和程式碼破解器的函數,現在我們可以將其放入循環中以計算輪數(輪數 = 玩遊戲的次數)。因此,如果輪數為 6,那麼遊戲將進行 6 次,但當使用者正確猜出所有程式碼時,即 HINTS 中的值全為 0 時,我們必須終止遊戲。因此,當我們數出 HINTS 中 0 的數量並且為 4 時,我們就可以終止遊戲並說用戶獲勝。

console.log("Mastermind");

function App() {
  console.log("App");
}

App();
  • 回合數減少,如果回合數不為0,我們就知道使用者是否獲勝。
for (let i = 0; i 



  • 執行程式時的某些輸出
for (let i = 0; i 



  • 當我按下回車鍵時
function generateRandomNumbersBetween(min, max) {
  return min + Math.floor(Math.random() * (max - min + 1));
}

for (let i = 0; i 



  • 我想我們可以享受到目前為止的辛苦工作了。我有大約130行。你有多少個?

  • 這是完整程式碼

const HP = 100;

if (true) {
  console.log("IF BLOCK::", HP);
}

console.log("End::", HP);

// IF BLOCK:: 100
// End:: 100

還有改進的空間嗎?

儘管這是一個簡單的控制台/終端/基於文字的應用程序,但我們可以做更多的事情。

  • 我們可以替換所有常數,例如字串和數字。
  • 我們可以從比較程式碼中提取(重構)程式碼斷路器輸入並將其拆分,然後將程式碼斷路器和程式碼產生器作為參數傳遞。我們甚至可以讓函數傳回提示,而不是全域存取提示。我們將創建一個新的提示變數並返回它。因此,compareCode 將傳回指派給hints 變數的提示。
 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
</anonymous>
  • 我們也可以將 console.clear() 包裝到一個函數中。
  • 我們可以在下一場比賽前讓程式放慢速度
  • 我們可以將 HINTS.filter((value) => 0 === value).length === 4 取出為函數。其目的是檢查密碼破解者是否正確猜出密碼製作者。
  • 我們也可以用同樣的方法來宣布誰贏了比賽
// 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 



  • 將所有可以獨立的函數放入自己的檔案functions.js中並匯出它們。然後,我們可以重構依賴全域變數的獨立函數,然後使用參數將該資料作為參數傳遞給函數。
  • 我們甚至可以有一個單獨的文件
// 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 



<h2>
  
  
  結論
</h2>

<p>我們已經使用了在這個專案中學到的所有知識,而且還有更多。我提到我們可以對一些函數進行分組並導出它們。為此,我們將討論如何在 Javascript 中匯入和匯出。我將提供另一個我認為對您有用的項目。智者遊戲到此結束,希望大家也能進行一些重構,因為還有很多需要重構的地方。祝你好運...<br>
</p>

<pre class="brush:php;toolbar:false">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();
});

來源

  • wiki-play-mastermind
  • 維基百科-mastermind
  • Python 大師思想

以上是JavaScript 重點:Javascript 的部分策劃者)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
了解JavaScript引擎:實施詳細信息了解JavaScript引擎:實施詳細信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:學習曲線和易用性Python vs. JavaScript:學習曲線和易用性Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python vs. JavaScript:社區,圖書館和資源Python vs. JavaScript:社區,圖書館和資源Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C到JavaScript:所有工作方式從C/C到JavaScript:所有工作方式Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript引擎:比較實施JavaScript引擎:比較實施Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)