Heim > Artikel > Web-Frontend > JavaScript Essentials: Teil Mastermind in Javascript)
In diesem Abschnitt implementieren wir ein Spiel namens Mastermind in JavaScript. Diese Spielentwicklung würde viele der Konzepte abdecken, die wir bisher besprochen haben. Wir werden Funktionen definieren, Argumente an sie übergeben, Variablen verwenden und Schleifen und if-Anweisungen verwenden. Wir werfen einen kurzen Blick auf ein anderes Konzept rund um Funktionen, bekannt als IIFE, „Sofort aufgerufener Funktionsausdruck“. Wir werden uns auch ansehen, wie Benutzereingaben über die Befehlszeile entgegengenommen werden. Zu diesem Zeitpunkt handelt es sich lediglich um Konsolenanwendungen.
Sie können hier auf eine ähnliche Implementierung verweisen, Mastermind in Python
Mastermind ist ein einfaches Brettspiel, das Farben verwendet, aber wir würden stattdessen Zahlen verwenden.
Zusammenfassung: Hinter einer Leiste stehen vier Farben, die von einem Spieler aufgestellt wurden. Der andere Spieler kann die Farben des Startspielers nicht sehen. Die Farben des ersten Spielers werden als Code-Maker bezeichnet und die Farben des anderen Spielers als Code-Brecher. Der Code-Knacker hat insgesamt zwischen 2 und 12 Versuche, die Code-Ersteller zu erraten. Die Anzahl der Versuche muss gerade sein.
Erstellen Sie einen Ordner mit dem Namen mastermind auf Ihrem PC (oder dort, wo Sie Ihre Projekte ablegen) und initialisieren Sie in mastermind ein Knotenprojekt mit npm init -y (in der Befehlszeile). . Ich arbeite auf einem Linux-Rechner und werde mein Projekt so einrichten.
Der Startpunkt (Einstiegspunkt) dieses Spiels wird in der App sein, einer Funktion. Erstellen wir eine Funktion namens App und fügen wir console.log("App") hinzu. Anschließend können wir App() aufrufen und den Code mit dem Knoten app.js ausführen. Ich werde Ihnen nicht sagen, dass Sie Ihren Code ausführen sollen, aber es ist etwas, was Sie beim Programmieren tun sollten. Dies ist der aktuelle Inhalt meiner app.js-Datei.
console.log("Mastermind"); function App() { console.log("App"); } App();
Wenn das Spiel beginnt
Lassen Sie uns eine Funktion implementieren, um Zufallszahlen für den Code-Ersteller zu generieren und dadurch Zufallswerte für den Code-Ersteller festzulegen.
Zuerst brauchen wir eine Möglichkeit, Zufallszahlen zu generieren. Um den Code in app.js nicht zu beeinträchtigen, erstellen wir eine weitere Datei namens scratch_pad.js und experimentieren in dieser Datei.
JavaScript bietet eine einfache Möglichkeit, Zufallszahlen zu generieren, indem es Math.random() aufruft. Lassen Sie uns im Notizblock 4 Zufallszahlen mit einem Schleifenkonstrukt protokollieren.
console.log("Mastermind"); function App() { console.log("App"); } App();
Was wir wollen, sind ganze Zahlen (Zahlen wie) 0, 1, 2, ..., 9, keine Dezimalzahlen. Wir können den von Math.random() zurückgegebenen Wert mit 10 multiplizieren und hätten x.something, wobei x jetzt in 1,2,3,...,9 liegt. Denken Sie daran, dass diese Experimente alle auf dem Notizblock durchgeführt werden. Probieren Sie es aus.
Was wir wollen, ist eine Zahl vor dem Punkt, der ganze Zahlenteil. Wir können Code schreiben, um die Zahl in eine Zeichenfolge umzuwandeln und sie dann durch das „.“ zu teilen. und erhalte das erste Element. Es gibt jedoch eine Funktion namens „Boden“, die wir nutzen können.
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
An diesem Punkt können wir nun zu unserem app.js zurückkehren und die obige Funktion hinzufügen, um die Zufallszahlen für den Code-Ersteller zu generieren. Platzieren Sie es über der App-Funktion.
Aus der Zusammenfassung geht hervor, dass 4 Farben verwendet werden. Wir müssen also 4 Zahlen für den Code-Ersteller generieren. Wir müssen uns auch darum kümmern, ob Duplikate zulässig sind. Zurück zum Notizblock.
Wir haben Funktionen, if- und else-Anweisungen, for- und while-Schleifen usw. Diese Konstrukte haben alle einen Block oder einen Körper. In diesen Blöcken initialisierte Variablen können innerhalb des Blocks und nicht außerhalb davon verwendet werden. Dies wird als Gültigkeitsbereich einer Variablen bezeichnet. Eine Variable kann also im globalen Geltungsbereich existieren, was bedeutet, dass diese Variable überall verwendet oder ausgewertet werden kann. Wenn wir eine Variable in einem Block deklarieren. Die Variable wird in diesem Bereich intern oder begrenzt. Führen Sie dies im Notizblock aus.
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
An dieser Stelle möchte ich Sie auf die Idee von Zielfernrohren aufmerksam machen.
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
Bei diesem Ansatz, Benutzereingaben zu berücksichtigen, gibt es kein Problem. Wir müssen lediglich eine Callback-Funktion verwenden und es gibt keine Möglichkeit, die eingegebene Eingabe an den äußeren Bereich der Callback-Funktion von readlineOInstance.question zu übergeben.
Was denkst du? Probieren Sie es im „Rubbelblock“ aus. Wenn Sie darüber nachdenken, eine Variable im äußeren Bereich von readlineOInstance.question zu deklarieren und ihr die eingegebene Eingabe zuzuweisen, dann ist das ein guter Ansatz, aber ... Versuchen Sie es trotzdem.
Erinnern Sie sich an das Konzept der Versprechen? Wir können hier Promise verwenden und die Eingabe auflösen. Allerdings müssen wir den gesamten Prozess in eine Funktion umwandeln. Es gibt einige Teile der readlineOInstance.question hat einen Header ähnlich wie Frage(query: string, callback: (answer: string) => void. Die Abfrage ist die Abfrage (oder Eingabeaufforderung) an den Benutzer und der Rückruf ist wie Wir kümmern uns um die Eingabesammlung. Da wir dieselbe Funktion möglicherweise später irgendwo wiederverwenden, würden wir die Abfrage als Argument übergeben.
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)); }
Führen Sie app.js aus und interagieren Sie damit. Dies ist eine ähnliche Ausgabe während der Interaktion.
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 ]
Jetzt können wir die Funktion HINTS und CompareCode zur app.js hinzufügen. Es ist ein guter Zeitpunkt, Ihre app.js oberhalb der App-Funktion auszuführen.
Da wir nun eine Funktion zum Vergleichen des Code Makers und des Code Breakers implementiert haben, können wir diese nun in eine Schleife einfügen, um die Runden zu berücksichtigen (Runden = Anzahl der Spiele). Wenn die Anzahl der Runden also 6 beträgt, würde das Spiel 6 Mal gespielt, aber wir müssten das Spiel beenden, wenn der Benutzer alle Codes richtig erraten hat, das heißt, wenn die Werte in den HINTS alle Nullen sind. Wenn wir also die Anzahl der Nullen in HINTS zählen und es 4 ist, können wir das Spiel beenden und sagen, dass der Benutzer gewonnen hat.
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)); }
Ich denke, wir können unsere bisherige harte Arbeit genießen. Ich habe etwa 130 Zeilen. Wie viele hast du?
Dies ist der vollständige Code
const HP = 100; if (true) { console.log("IF BLOCK::", HP); } console.log("End::", HP); // IF BLOCK:: 100 // End:: 100
Auch wenn es sich um eine einfache konsolen-/terminal-/textbasierte App handelt, können wir noch mehr dagegen tun.
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 ]
Wir haben alles, was wir in diesem Projekt gelernt haben, genutzt und es gibt noch mehr. Ich erwähnte, dass wir einige Funktionen gruppieren und exportieren könnten. Dazu besprechen wir den Import und Export in Javascript. Ich werde ein weiteres Projekt bereitstellen, von dem ich denke, dass es für Sie nützlich sein wird. Dies ist das Ende des Mastermind-Spiels und ich hoffe, dass Sie auch einige Umgestaltungen vornehmen, da es viele Stellen gibt, die umgestaltet werden müssen. Viel Glück...
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(); });
Das obige ist der detaillierte Inhalt vonJavaScript Essentials: Teil Mastermind in Javascript). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!