Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Arvaa Peli -Konsolisovelluksen Rakentaminen | Konsolisovellusten Rakentaminen Node.js:llä
Backend-kehitys Node.js:llä ja Express.js:llä

bookArvaa Peli -Konsolisovelluksen Rakentaminen

Tässä luvussa pääset kehittämään konsolisovellustaitojasi rakentamalla jännittävän Arvaa luku -pelin. Tämä interaktiivinen peli haastaa pelaajat käyttämään intuitiotaan arvaamalla satunnaisesti valitun luvun ennalta määritellyltä alueelta. Matkan varrella perehdytään keskeisiin käsitteisiin, kuten

  • Satunnaislukujen generointi;
  • Syötteen validointi;
  • Käyttäjän vuorovaikutus;
  • Pelitulosten tallentaminen tiedostoon.

Haaste

Kuvittele sovellus, joka lupaa jännitystä ja arvoituksellisuutta. Pelaajat kutsutaan arvaamaan salaperäisesti valittu luku ennalta määritellyltä alueelta. Sovellus antaa välitöntä palautetta jokaisesta arvauksesta ja pitää tarkkaa kirjaa yrityksistä.

Tämä käytännön esimerkki tarjoaa mahdollisuuden hioa taitojasi CLI-sovellusten rakentamisessa ja havainnollistaa interaktiivisten ohjelmien toteutuksen taidon.

Lopputulos

Katso, miten sovellus toimii! Alla oleva GIF havainnollistaa jännittävää Arvaa luku -peliä, jonka tulet rakentamaan:

Arvaa luku -konsolipelin rakentaminen

Sinulle tarjotaan kaksi polkua. Ensimmäinen vaihtoehto kutsuu sinut aloittamaan matkan ilman apua, kun taas toinen tarjoaa hyödyllisen oppaan onnistumisen varmistamiseksi. Valitsitpa rohkean etenemisen tai rakenteellisen ohjeen seuraamisen, edessäsi on kiehtova kokemus, jonka lopputuloksena on toimiva ja mukaansatempaava konsolisovellus.

Pääsuunnitelma

  • Vaihe 1: Ympäristön valmistelu ja alustukset;
  • Vaihe 2: Pelin parametrien määrittely;
  • Vaihe 3: Apufunktioiden määrittely;
  • Vaihe 4: Pelilogiikka;
  • Vaihe 5: Pelituloksen tallentaminen;
  • Vaihe 6: Pelin käynnistäminen;
  • Yhteenveto;
  • Koko sovelluksen koodi.

Vaihe 1: Alustaminen ja valmistelut

Valmistele ympäristö luomalla uusi hakemisto ja tiedosto nimeltä app.js. Tässä tiedostossa otetaan käyttöön tarvittavat moduulit:

const readline = require('readline');
const fs = require('fs').promises;

Luo Readline-rajapinta:

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

Selitys: Tuodaan tarvittavat moduulit: readline käyttäjän vuorovaikutukseen ja fs.promises tiedostojen käsittelyyn. Tämän jälkeen luodaan Readline-rajapinta nimeltä rl syötteen ja tulosteen hallintaan.

Vaihe 2: Määritä pelin parametrit

Aseta pienin ja suurin numero:

const minNumber = 1;
const maxNumber = 100;

Luo salainen numero:

const secretNumber =
  Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;

Alusta yritysten laskuri:

let attempts = 0;

Selitys: Määritellään lukujen alue (minNumber ja maxNumber), jonka sisällä salainen numero luodaan. Salainen numero generoidaan satunnaisesti käyttäen Math.random()-funktiota ja tallennetaan muuttujaan secretNumber. Muuttuja attempts alustetaan käyttäjän arvausten määrän seuraamiseksi.

Vaihe 3: Apufunktioiden määrittely

Varusta sovellus apufunktiolla virheettömään validointiin:

function isValidGuess(guess) {
  return !isNaN(guess)
    && guess >= minNumber
    && guess <= maxNumber;
}

Selitys: isValidGuess-funktio tarkistaa, onko käyttäjän arvaus kelvollinen numero määritellyllä alueella (minNumbermaxNumber).

Vaihe 4: Pelilogiikka

Pelin ydinmekaniikka playGame-funktion kautta:

function playGame() {
  rl.question(`Guess a number between ${minNumber} and ${maxNumber}: `, guess => {
    if (isValidGuess(guess)) {
      attempts++;
      const guessNumber = parseInt(guess);

      if (guessNumber === secretNumber) {
        console.log(`Congratulations! You guessed the number in ${attempts} attempts.`);
        saveGameResult(`Player won in ${attempts} attempts.`);
        rl.close();
      } else if (guessNumber < secretNumber) {
        console.log('Try higher.');
        playGame();
      } else {
        console.log('Try lower.');
        playGame();
      }
    } else {
      console.log('Please enter a valid number within the specified range.');
      playGame();
    }
  });
}

Selitys: playGame-funktio muodostaa pelin pääsilmukan. Se käyttää rl.question-metodia kysyäkseen käyttäjältä arvausta. Jos arvaus on kelvollinen, funktio tarkistaa vastaako arvaus salaisuutta numeroa. Muussa tapauksessa se antaa palautetta käyttäjälle ja jatkaa pelisilmukkaa rekursiivisesti.

Vaihe 5: Pelituloksen tallentaminen

Toteuta logiikka käyttäjän pelisaavutusten tallentamiseksi tiedostoon game_results.txt.

async function saveGameResult(result) {
  try {
    await fs.appendFile('game_results.txt', `${result}\n`);
    console.log('Game result saved.');
  } catch (err) {
    console.log('Failed to save game result.');
  }
}

Selitys: saveGameResult-funktio käyttää fs.promises-kirjastoa lisätäkseen pelituloksen tiedostoon nimeltä game_results.txt. Funktio antaa palautteen tallennuksen onnistumisesta tai epäonnistumisesta.

Vaihe 6: Pelin käynnistäminen

Luo tervetuloviesti ja käynnistä peli:

console.log('Welcome to the Guess the Number game!');
playGame();

Selitys: Näytämme tervetuloviestin ja käynnistämme pelisilmukan kutsumalla playGame-funktiota.

Sovelluksen koko koodi

const readline = require("readline");
const fs = require("fs").promises;

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const minNumber = 1;
const maxNumber = 100;

const secretNumber =
  Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
let attempts = 0;

function isValidGuess(guess) {
  return !isNaN(guess) && guess >= minNumber && guess <= maxNumber;
}

function playGame() {
  rl.question(
    `Guess a number between ${minNumber} and ${maxNumber}: `,
    (guess) => {
      if (isValidGuess(guess)) {
        attempts++;
        const guessNumber = parseInt(guess);

        if (guessNumber === secretNumber) {
          console.log(
            `Congratulations! You guessed the number in ${attempts} attempts.`
          );
          saveGameResult(`Player won in ${attempts} attempts.`);
          rl.close();
        } else if (guessNumber < secretNumber) {
          console.log("Try higher.");
          playGame();
        } else {
          console.log("Try lower.");
          playGame();
        }
      } else {
        console.log("Please enter a valid number within the specified range.");
        playGame();
      }
    }
  );
}

async function saveGameResult(result) {
  try {
    await fs.appendFile("game_results.txt", `${result}\n`);
    console.log("Game result saved.");
  } catch (err) {
    console.log("Failed to save game result.");
  }
}

console.log("Welcome to the Guess the Number game!");
playGame();
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 8

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

bookArvaa Peli -Konsolisovelluksen Rakentaminen

Pyyhkäise näyttääksesi valikon

Tässä luvussa pääset kehittämään konsolisovellustaitojasi rakentamalla jännittävän Arvaa luku -pelin. Tämä interaktiivinen peli haastaa pelaajat käyttämään intuitiotaan arvaamalla satunnaisesti valitun luvun ennalta määritellyltä alueelta. Matkan varrella perehdytään keskeisiin käsitteisiin, kuten

  • Satunnaislukujen generointi;
  • Syötteen validointi;
  • Käyttäjän vuorovaikutus;
  • Pelitulosten tallentaminen tiedostoon.

Haaste

Kuvittele sovellus, joka lupaa jännitystä ja arvoituksellisuutta. Pelaajat kutsutaan arvaamaan salaperäisesti valittu luku ennalta määritellyltä alueelta. Sovellus antaa välitöntä palautetta jokaisesta arvauksesta ja pitää tarkkaa kirjaa yrityksistä.

Tämä käytännön esimerkki tarjoaa mahdollisuuden hioa taitojasi CLI-sovellusten rakentamisessa ja havainnollistaa interaktiivisten ohjelmien toteutuksen taidon.

Lopputulos

Katso, miten sovellus toimii! Alla oleva GIF havainnollistaa jännittävää Arvaa luku -peliä, jonka tulet rakentamaan:

Arvaa luku -konsolipelin rakentaminen

Sinulle tarjotaan kaksi polkua. Ensimmäinen vaihtoehto kutsuu sinut aloittamaan matkan ilman apua, kun taas toinen tarjoaa hyödyllisen oppaan onnistumisen varmistamiseksi. Valitsitpa rohkean etenemisen tai rakenteellisen ohjeen seuraamisen, edessäsi on kiehtova kokemus, jonka lopputuloksena on toimiva ja mukaansatempaava konsolisovellus.

Pääsuunnitelma

  • Vaihe 1: Ympäristön valmistelu ja alustukset;
  • Vaihe 2: Pelin parametrien määrittely;
  • Vaihe 3: Apufunktioiden määrittely;
  • Vaihe 4: Pelilogiikka;
  • Vaihe 5: Pelituloksen tallentaminen;
  • Vaihe 6: Pelin käynnistäminen;
  • Yhteenveto;
  • Koko sovelluksen koodi.

Vaihe 1: Alustaminen ja valmistelut

Valmistele ympäristö luomalla uusi hakemisto ja tiedosto nimeltä app.js. Tässä tiedostossa otetaan käyttöön tarvittavat moduulit:

const readline = require('readline');
const fs = require('fs').promises;

Luo Readline-rajapinta:

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

Selitys: Tuodaan tarvittavat moduulit: readline käyttäjän vuorovaikutukseen ja fs.promises tiedostojen käsittelyyn. Tämän jälkeen luodaan Readline-rajapinta nimeltä rl syötteen ja tulosteen hallintaan.

Vaihe 2: Määritä pelin parametrit

Aseta pienin ja suurin numero:

const minNumber = 1;
const maxNumber = 100;

Luo salainen numero:

const secretNumber =
  Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;

Alusta yritysten laskuri:

let attempts = 0;

Selitys: Määritellään lukujen alue (minNumber ja maxNumber), jonka sisällä salainen numero luodaan. Salainen numero generoidaan satunnaisesti käyttäen Math.random()-funktiota ja tallennetaan muuttujaan secretNumber. Muuttuja attempts alustetaan käyttäjän arvausten määrän seuraamiseksi.

Vaihe 3: Apufunktioiden määrittely

Varusta sovellus apufunktiolla virheettömään validointiin:

function isValidGuess(guess) {
  return !isNaN(guess)
    && guess >= minNumber
    && guess <= maxNumber;
}

Selitys: isValidGuess-funktio tarkistaa, onko käyttäjän arvaus kelvollinen numero määritellyllä alueella (minNumbermaxNumber).

Vaihe 4: Pelilogiikka

Pelin ydinmekaniikka playGame-funktion kautta:

function playGame() {
  rl.question(`Guess a number between ${minNumber} and ${maxNumber}: `, guess => {
    if (isValidGuess(guess)) {
      attempts++;
      const guessNumber = parseInt(guess);

      if (guessNumber === secretNumber) {
        console.log(`Congratulations! You guessed the number in ${attempts} attempts.`);
        saveGameResult(`Player won in ${attempts} attempts.`);
        rl.close();
      } else if (guessNumber < secretNumber) {
        console.log('Try higher.');
        playGame();
      } else {
        console.log('Try lower.');
        playGame();
      }
    } else {
      console.log('Please enter a valid number within the specified range.');
      playGame();
    }
  });
}

Selitys: playGame-funktio muodostaa pelin pääsilmukan. Se käyttää rl.question-metodia kysyäkseen käyttäjältä arvausta. Jos arvaus on kelvollinen, funktio tarkistaa vastaako arvaus salaisuutta numeroa. Muussa tapauksessa se antaa palautetta käyttäjälle ja jatkaa pelisilmukkaa rekursiivisesti.

Vaihe 5: Pelituloksen tallentaminen

Toteuta logiikka käyttäjän pelisaavutusten tallentamiseksi tiedostoon game_results.txt.

async function saveGameResult(result) {
  try {
    await fs.appendFile('game_results.txt', `${result}\n`);
    console.log('Game result saved.');
  } catch (err) {
    console.log('Failed to save game result.');
  }
}

Selitys: saveGameResult-funktio käyttää fs.promises-kirjastoa lisätäkseen pelituloksen tiedostoon nimeltä game_results.txt. Funktio antaa palautteen tallennuksen onnistumisesta tai epäonnistumisesta.

Vaihe 6: Pelin käynnistäminen

Luo tervetuloviesti ja käynnistä peli:

console.log('Welcome to the Guess the Number game!');
playGame();

Selitys: Näytämme tervetuloviestin ja käynnistämme pelisilmukan kutsumalla playGame-funktiota.

Sovelluksen koko koodi

const readline = require("readline");
const fs = require("fs").promises;

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const minNumber = 1;
const maxNumber = 100;

const secretNumber =
  Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
let attempts = 0;

function isValidGuess(guess) {
  return !isNaN(guess) && guess >= minNumber && guess <= maxNumber;
}

function playGame() {
  rl.question(
    `Guess a number between ${minNumber} and ${maxNumber}: `,
    (guess) => {
      if (isValidGuess(guess)) {
        attempts++;
        const guessNumber = parseInt(guess);

        if (guessNumber === secretNumber) {
          console.log(
            `Congratulations! You guessed the number in ${attempts} attempts.`
          );
          saveGameResult(`Player won in ${attempts} attempts.`);
          rl.close();
        } else if (guessNumber < secretNumber) {
          console.log("Try higher.");
          playGame();
        } else {
          console.log("Try lower.");
          playGame();
        }
      } else {
        console.log("Please enter a valid number within the specified range.");
        playGame();
      }
    }
  );
}

async function saveGameResult(result) {
  try {
    await fs.appendFile("game_results.txt", `${result}\n`);
    console.log("Game result saved.");
  } catch (err) {
    console.log("Failed to save game result.");
  }
}

console.log("Welcome to the Guess the Number game!");
playGame();
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 8
some-alt