Rumah > Artikel > hujung hadapan web > JavaScript Essentials: Bahagian Dalang dalam Javascript)
Dalam bahagian ini, kami akan melaksanakan permainan yang dipanggil Mastermind dalam JavaScript. Pembangunan permainan ini akan merangkumi banyak konsep yang telah kita bincangkan setakat ini. Kami akan mentakrifkan fungsi, menyampaikan hujah kepada mereka, menggunakan pembolehubah, dan menggunakan pernyataan gelung dan if. Kami akan melihat secara ringkas konsep lain di sekitar fungsi, yang dikenali sebagai IIFE, Ungkapan Fungsi yang Dikenakan Segera. Kami juga akan melihat cara mengambil input pengguna melalui baris arahan. Pada ketika ini, ia hanyalah aplikasi konsol.
Anda boleh merujuk pelaksanaan yang serupa di sini, Master mind dalam python
Mastermind ialah permainan papan mudah yang menggunakan warna tetapi sebaliknya kami akan menggunakan nombor.
Ringkasan: Di belakang palang terdapat empat warna yang dipasang oleh seorang pemain. Pemain lain tidak dapat melihat warna pemain pertama. Warna pemain pertama dipanggil pembuat kod dan warna pemain lain ialah pemutus kod. Pemecah kod mempunyai, secara inklusif, antara 2 hingga 12 percubaan untuk meneka pembuat kod. Bilangan percubaan mestilah genap.
Buat folder bernama mastermind pada pc anda (atau tempat anda meletakkan projek anda) dan dalam mastermind, mulakan projek nod menggunakan npm init -y (pada baris arahan) . Saya menggunakan mesin Linux jadi beginilah cara saya menyediakan projek saya.
Titik permulaan (masuk) permainan ini akan berada dalam Apl, satu fungsi. Mari buat fungsi yang dipanggil App dan tambah console.log("App"). Kami kemudiannya boleh memanggil App() dan melaksanakan kod dengan nod app.js. Saya tidak akan memberitahu anda untuk menjalankan kod anda tetapi ia adalah sesuatu yang anda harus lakukan semasa anda mengekod bersama. Ini ialah kandungan semasa fail app.js saya.
console.log("Mastermind"); function App() { console.log("App"); } App();
Apabila permainan bermula
Mari kita laksanakan fungsi untuk menjana nombor rawak untuk pembuatan kod, dengan itu menetapkan nilai rawak kepada pembuat kod.
Pertama, kita memerlukan cara untuk menjana nombor rawak. Untuk tidak mengganggu kod dalam app.js, mari buat fail lain yang dipanggil scratch_pad.js dan dalam fail ini kami bereksperimen.
JavaScript mempunyai cara mudah untuk menjana nombor rawak memanggil Math.random(). Dalam pad calar, mari kita log 4 nombor rawak menggunakan binaan gelung.
console.log("Mastermind"); function App() { console.log("App"); } App();
apa yang kita mahu ialah integer (nombor seperti) 0, 1, 2, ..., 9 bukan perpuluhan. Kita boleh mendarab nilai yang dikembalikan daripada Math.random() dengan 10 dan kita akan mempunyai x.sesuatu di mana x kini berada dalam 1,2,3,...,9. Ingat eksperimen ini semuanya dilakukan pada pad calar. Cubalah.
Apa yang kita mahu ialah nombor sebelum titik, bahagian nombor bulat. Kita boleh menulis kod untuk menukar nombor kepada rentetan dan kemudian memisahkannya dengan "." dan dapatkan elemen pertama. Walau bagaimanapun, terdapat fungsi untuk lantai yang dipanggil yang boleh kami gunakan.
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
Pada ketika ini, kita kini boleh kembali ke app.js kami dan menambah fungsi di atas untuk menjana nombor rawak bagi pembuat kod. Letakkannya di atas fungsi Apl.
Daripada ringkasan bilangan warna yang digunakan ialah 4. Jadi kita perlu menjana 4 nombor untuk pembuat kod. Kami juga perlu mengendalikan jika pendua dibenarkan. Kembali ke pad calar.
Kami mempunyai fungsi, pernyataan if and else, gelung for dan while, dsb. Semua binaan ini mempunyai blok atau badan. Pembolehubah yang dimulakan dalam blok ini boleh digunakan di dalam blok dan bukan di luarnya. Ini dikenali sebagai skop pembolehubah. Jadi pembolehubah boleh wujud dalam skop global, yang bermaksud bahawa pembolehubah itu boleh digunakan atau dinilai di mana-mana. Apabila kita mengisytiharkan pembolehubah dalam blok. Pembolehubah menjadi dalaman atau terhad dalam skop itu. Jalankan ini dalam pad conteng.
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
Pada ketika ini saya ingin membawa kepada perhatian anda idea tentang skop.
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
Tiada masalah dengan pendekatan mengambil input pengguna ini. Cuma kita perlu menggunakan fungsi panggil balik dan tiada cara untuk menghantar input yang dimasukkan ke skop luar fungsi panggil balik readlineOInstance.question.
Apa yang anda fikirkan? Cubalah dalam "pad calar". Jika anda berfikir tentang mengisytiharkan pembolehubah dalam skop luar readlineOInstance.soalkan memberikan input yang dimasukkan kepadanya, maka ia adalah pendekatan yang baik tetapi ... Masih mencubanya.
Adakah anda masih ingat konsep Janji? Kita boleh menggunakan janji di sini dan menyelesaikan input. Walau bagaimanapun, kita perlu membungkus keseluruhan proses dalam fungsi. Terdapat beberapa bahagian readlineOInstance.question mempunyai pengepala yang serupa dengan question(query: string, callback: (answer: string) => void. Query ialah pertanyaan (atau prompt) kepada pengguna dan callback ialah bagaimana kami mengendalikan koleksi input Memandangkan kami mungkin menggunakan semula fungsi yang sama di suatu tempat kemudian, kami akan memberikan pertanyaan sebagai hujah.
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)); }
Jalankan app.js dan berinteraksi dengannya. Ini adalah output yang serupa semasa interaksi.
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 ]
Kini kita boleh menambah PETUA dan fungsi compareCode pada app.js. Ia adalah masa yang sesuai untuk menjalankan app.js anda, di atas fungsi Apl.
Sekarang kami melaksanakan fungsi untuk membandingkan pembuat kod dan pemutus kod, kini kami boleh meletakkan ini dalam gelung untuk mengambil kira pusingan (pusingan = bilangan kali untuk bermain permainan). Jadi jika bilangan pusingan ialah 6, maka permainan akan dimainkan 6 kali tetapi kami perlu menamatkan permainan apabila pengguna meneka semua kod dengan betul, iaitu apabila nilai dalam PETUNJUK semuanya 0s. Jadi apabila kita mengira bilangan 0 dalam PETUNJUK dan ia adalah 4, kita boleh menamatkan permainan dan mengatakan pengguna menang.
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)); }
Saya rasa kita boleh menikmati kerja keras kita setakat ini. Saya mempunyai kira-kira 130 baris. Berapa banyak yang anda ada?
Ini ialah kod penuh
const HP = 100; if (true) { console.log("IF BLOCK::", HP); } console.log("End::", HP); // IF BLOCK:: 100 // End:: 100
Walaupun ini ialah apl berasaskan konsol/terminal/teks yang ringkas, banyak lagi yang boleh kita lakukan mengenainya.
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 ]
Kami telah menggunakan semua yang telah kami pelajari dalam projek ini dan banyak lagi. Saya menyebut bahawa kita boleh mengumpulkan beberapa fungsi dan mengeksportnya. Untuk ini, kita akan membincangkan cara mengimport dan mengeksport dalam Javascript. Saya akan menyediakan satu lagi projek yang saya fikir akan berguna kepada anda. Ini adalah pengakhiran permainan dalang dan saya harap anda juga akan melakukan beberapa pemfaktoran semula kerana terdapat banyak tempat yang perlu difaktorkan semula. Semoga berjaya...
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(); });
Atas ialah kandungan terperinci JavaScript Essentials: Bahagian Dalang dalam Javascript). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!