이번 섹션에서는 Mastermind라는 게임을 JavaScript로 구현해 보겠습니다. 이 게임 개발에는 지금까지 논의한 많은 개념이 포함됩니다. 함수를 정의하고, 함수에 인수를 전달하고, 변수를 사용하고, 루프와 if 문을 사용합니다. IIFE(즉시 호출되는 함수 표현)로 알려진 함수에 대한 또 다른 개념을 간략하게 살펴보겠습니다. 또한 명령줄을 통해 사용자 입력을 받는 방법도 살펴보겠습니다. 현재로서는 콘솔 애플리케이션일 뿐입니다.
여기서 유사한 구현을 참조할 수 있습니다. Master Mind in Python
마스터마인드는 색상을 사용하는 간단한 보드게임이지만 우리는 숫자를 대신 사용합니다.
요약: 막대 뒤에는 한 명의 플레이어가 4가지 색상으로 그린 그림이 있습니다. 다른 플레이어는 첫 번째 플레이어의 색상을 볼 수 없습니다. 첫 번째 플레이어의 색상을 코드 메이커라고 하고, 다른 플레이어의 색상을 코드 브레이커라고 합니다. 코드 브레이커는 코드 작성자의 추측을 2~12회 시도합니다. 시도 횟수는 짝수여야 합니다.
PC(또는 프로젝트를 저장한 위치)에 mastermind라는 폴더를 만들고 mastermind에서 npm init -y(명령줄에서)를 사용하여 노드 프로젝트를 초기화합니다. . 저는 Linux 시스템을 사용하고 있으므로 이것이 프로젝트를 설정하는 방법입니다.
이 게임의 시작(진입) 지점은 앱이라는 기능입니다. 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가 1,2,3,...,9에 있는 x.something을 갖게 됩니다. 이 실험은 모두 스크래치 패드에서 수행된다는 점을 기억하세요. 한번 시도해 보세요.
우리가 원하는 것은 점 앞의 숫자, 정수 부분입니다. 숫자를 문자열로 변환한 다음 "."으로 나누는 코드를 작성할 수 있습니다. 첫 번째 요소를 가져옵니다. 그러나 우리가 사용할 수 있는 바닥이라는 기능이 있습니다.
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로 돌아가 위의 함수를 추가하여 코드 작성자를 위한 난수를 생성할 수 있습니다. 앱 기능 위에 올려주세요.
요약에 따르면 사용된 색상 수는 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에는 질문(query: string, callback: (답변: 문자열) => void와 유사한 헤더가 있는 부분이 있습니다. 쿼리는 사용자에게 보내는 쿼리(또는 프롬프트)이고 콜백은 방법입니다. 나중에 동일한 함수를 다른 곳에서 재사용할 수 있으므로 입력 컬렉션을 처리하므로 쿼리를 인수로 전달합니다.
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 ]
이제 app.js에 HINTS 및 CompareCode 함수를 추가할 수 있습니다. 이제 앱 기능 위에 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!