Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Bygga en Gissningsspel-Konsolapplikation | Bygga Konsolapplikationer med Node.js
Backendutveckling med Node.js och Express.js

Bygga en Gissningsspel-Konsolapplikation

Svep för att visa menyn

I det här kapitlet får du möjlighet att utveckla dina färdigheter i att skapa konsolapplikationer när vi bygger ett spännande Gissa numret-spel. Det här interaktiva spelet utmanar spelare att använda sin intuition för att gissa ett slumpmässigt genererat nummer inom ett fördefinierat intervall. Under arbetets gång kommer vi att utforska grundläggande koncept som:

  • Slumpmässig talgenerering;
  • Inmatningsvalidering;
  • Användarinteraktion;
  • Även spara spelresultat till en fil.

Utmaning

Föreställ dig att utforska en app som lovar spänning och nyfikenhet. Spelare bjuds in att gissa ett mystiskt valt nummer inom ett fördefinierat intervall. Appen ger omedelbar återkoppling på varje gissning och håller noggrant räkning på antalet försök.

Detta praktiska exempel är din möjlighet att finslipa dina färdigheter i att bygga CLI-appar och visar konsten att skapa interaktiva program.

Slutlig app

Se magin i praktiken! Nedan visas en GIF som illustrerar det spännande Gissa numret-spelet som du kommer att bygga:

Bygga en gissningsspel-konsolapp

Du står inför två vägar. Det första alternativet lockar dig att påbörja resan utan hjälp, medan det andra erbjuder en hjälpsam guide för att säkerställa din framgång. Oavsett om du kastar dig in modigt eller följer den strukturerade guiden väntar en fascinerande upplevelse som lämnar dig med en funktionell och fängslande konsolapp.

Huvudplan

  • Steg 1: Installation och initiering;
  • Steg 2: Definiera spelparametrar;
  • Steg 3: Definiera hjälpfunktioner;
  • Steg 4: Spellogik;
  • Steg 5: Spara spelresultat;
  • Steg 6: Starta spelet;
  • Slutsats;
  • Komplett appkod.

Steg 1: Installation och initiering

Förbered arbetsytan genom att skapa en ny katalog och en fil med namnet app.js. I denna fil importerar vi de nödvändiga modulerna:

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

Skapa ett Readline-gränssnitt:

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
Kodbeskrivning
expand arrow
  • readline: tillhandahåller ett gränssnitt för att läsa inmatning från och skriva utdata till konsolen;

  • readline.createInterface({ ... }): skapar en instans av klassen readline.Interface. Den accepterar ett objekt med egenskaperna input och output;

  • input: process.stdin: ställer in inmatningsströmmen till process.stdin, vilket gör att programmet kan läsa användarens inmatning från tangentbordet;

  • output: process.stdout: ställer in utmatningsströmmen till process.stdout, vilket gör att programmet kan visa text i konsolen.

Förklaring: Vi importerar de nödvändiga modulerna: readline för användarinteraktion och fs.promises för filoperationer. Därefter skapar vi ett Readline-gränssnitt med namnet rl för att hantera in- och utmatning.

Steg 2: Definiera spelparametrar

Ange minsta och största tal:

const minNumber = 1;
const maxNumber = 100;

Generera det hemliga numret:

const secretNumber =
  Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
Kodbeskrivning
expand arrow
  • Math.random(): genererar ett slumpmässigt flyttal mellan 0 (inklusive) och 1 (exklusive);

  • maxNumber - minNumber + 1: beräknar intervallet av möjliga tal. Att lägga till 1 säkerställer att både minNumber och maxNumber inkluderas i intervallet;

  • Math.random() * (maxNumber - minNumber + 1): genererar ett slumpmässigt tal mellan 0 och det beräknade intervallet;

  • Math.floor(...): avrundar det genererade flyttalet nedåt till närmaste heltal, vilket säkerställer att resultatet är ett heltal inom önskat intervall;

  • ... + minNumber: förskjuter det genererade talet så att intervallet börjar vid minNumber istället för 0.

Initiera räknaren för försök:

let attempts = 0;

Förklaring: Vi definierar intervallet av tal (minNumber och maxNumber) inom vilket det hemliga numret kommer att genereras. Det hemliga numret genereras slumpmässigt med hjälp av Math.random() och tilldelas secretNumber. Variabeln attempts initieras för att hålla reda på användarens försök.

Steg 3: Definiera hjälpfunktioner

Utrusta med en hjälpfunktion för felfri validering:

function isValidGuess(guess) {
  return !isNaN(guess)
    && guess >= minNumber
    && guess <= maxNumber;
}
Kodbeskrivning
expand arrow
  • !isNaN(guess): kontrollerar om guess är ett giltigt tal. Funktionen isNaN() returnerar false för giltiga tal, och !-operatorn vänder detta till true;

  • guess >= minNumber: verifierar att guess är större än eller lika med minNumber, vilket säkerställer att det inte är under det tillåtna intervallet;

  • guess <= maxNumber: verifierar att guess är mindre än eller lika med maxNumber, vilket säkerställer att det inte är över det tillåtna intervallet;

  • &&: kombinerar alla villkor med hjälp av den logiska OCH-operatorn. Alla villkor måste vara true för att hela uttrycket ska utvärderas till true.

Förklaring: Funktionen isValidGuess kontrollerar om användarens gissning är ett giltigt tal inom det angivna intervallet (minNumber till maxNumber).

Steg 4: Spellogik

Spelets kärnmekanik via funktionen playGame:

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();
    }
  });
}
Kodbeskrivning
expand arrow
  • rl.question(\Guess a number between ${minNumber} and ${maxNumber}: `, guess => { ... }): prompts the user to enter a number within the specified range. The user's input is passed to the callback function as the guess`;

  • if (isValidGuess(guess)) { ... }: kontrollerar om det angivna värdet är en giltig gissning med hjälp av funktionen isValidGuess();

  • attempts++;: ökar räknaren attempts för att hålla reda på hur många gissningar spelaren har gjort;

  • const guessNumber = parseInt(guess);: konverterar användarens inmatning från en sträng till ett heltal med parseInt();

  • if (guessNumber === secretNumber) { ... }: kontrollerar om spelarens gissning matchar det hemliga talet. Om så är fallet visas ett meddelande om framgång, resultatet sparas, readline-gränssnittet stängs och spelet avslutas;

  • else if (guessNumber < secretNumber) { ... }: informerar spelaren om att det hemliga talet är högre och anropar playGame() igen för att fortsätta spelet;

  • else { ... }: informerar spelaren om att det hemliga talet är lägre och anropar playGame() igen för att fortsätta spelet;

  • else { ... } (efter valideringskontrollen): hanterar ogiltig inmatning genom att be spelaren ange ett giltigt tal inom det tillåtna intervallet och anropar sedan playGame() igen.

Förklaring: Funktionen playGame utgör spelets huvudloop. Den använder rl.question för att be användaren om en gissning. Om gissningen är giltig kontrollerar funktionen om gissningen matchar det hemliga numret. Om inte, ger den feedback till användaren och fortsätter spel-loopen rekursivt.

Steg 5: Spara spelresultat

Implementera logiken för att spara användarens spelprestationer i filen 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.');
  }
}
Kodbeskrivning
expand arrow
  • async function saveGameResult(result) { ... }: definierar en asynkron funktion med namnet saveGameResult() som tar emot en parameter result och möjliggör användning av await-nyckelordet i funktionskroppen;

  • try { ... } catch (err) { ... }: hanterar potentiella fel som kan uppstå under den asynkrona filoperationen;

  • await fs.appendFile('game_results.txt', \${result}\n`);: appends the provided resultfollowed by a newline character to thegame_results.txtfile. Theawait` pausar exekveringen tills filoperationen har slutförts framgångsrikt;

  • console.log('Game result saved.');: visar ett bekräftelsemeddelande när spelresultatet har skrivits till filen;

  • console.log('Failed to save game result.');: visar ett felmeddelande om filoperationen misslyckas och ett undantag fångas av catch-blocket.

Förklaring: Funktionen saveGameResult använder fs.promises för att lägga till spelresultatet i en fil med namnet game_results.txt. Den ger återkoppling om det lyckades eller misslyckades att spara resultatet.

Steg 6: Starta spelet

Skapa välkomstmeddelandet och starta spelet:

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

Förklaring: Vi visar ett välkomstmeddelande och startar spelloppet genom att anropa funktionen playGame.

Fullständig appkod

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();
Kodbeskrivning
expand arrow
  • Rader 1-2: importerar den inbyggda modulen readline och fs-modulens promises-API för asynkrona filoperationer;

  • Rader 4-7: skapar ett readline-gränssnitt med namnet rl för att läsa användarinmatning och visa utdata i konsolen;

  • Rader 9-10: definierar minimi- och maximivärden för gissningsintervallet;

  • Rader 12-13: genererar ett slumpmässigt hemligt tal inom det angivna intervallet med hjälp av Math.random();

  • Rad 14: initierar räknaren attempts för att hålla reda på antalet gissningar som spelaren gör;

  • Rader 16-18: definierar funktionen isValidGuess() för att validera att det inmatade värdet är ett tal inom det tillåtna intervallet;

  • Rader 20-47: definierar den rekursiva funktionen playGame() som:

    • ber spelaren ange en gissning;
    • validerar det inmatade värdet;
    • kontrollerar om gissningen matchar det hemliga talet;
    • ger återkoppling om gissningen är för hög eller för låg;
    • fortsätter spelet genom att anropa sig själv igen vid behov;
    • sparar resultatet och avslutar spelet när rätt tal gissas;
  • Rader 49-56: definierar den asynkrona funktionen saveGameResult() som sparar spelresultatet till filen game_results.txt och hanterar eventuella fel;

  • Rad 58: visar ett välkomstmeddelande till spelaren;

  • Rad 59: startar spelet genom att anropa funktionen playGame().

Sammanfattning

Detta program skapar ett gissningsspel med tal. Spelaren försöker gissa ett slumpmässigt genererat tal inom ett angivet intervall. Spelet ger återkoppling efter varje gissning, håller reda på antalet försök och sparar lyckade resultat till en textfil med hjälp av asynkrona filoperationer.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 8

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Bygga en Gissningsspel-Konsolapplikation

I det här kapitlet får du möjlighet att utveckla dina färdigheter i att skapa konsolapplikationer när vi bygger ett spännande Gissa numret-spel. Det här interaktiva spelet utmanar spelare att använda sin intuition för att gissa ett slumpmässigt genererat nummer inom ett fördefinierat intervall. Under arbetets gång kommer vi att utforska grundläggande koncept som:

  • Slumpmässig talgenerering;
  • Inmatningsvalidering;
  • Användarinteraktion;
  • Även spara spelresultat till en fil.

Utmaning

Föreställ dig att utforska en app som lovar spänning och nyfikenhet. Spelare bjuds in att gissa ett mystiskt valt nummer inom ett fördefinierat intervall. Appen ger omedelbar återkoppling på varje gissning och håller noggrant räkning på antalet försök.

Detta praktiska exempel är din möjlighet att finslipa dina färdigheter i att bygga CLI-appar och visar konsten att skapa interaktiva program.

Slutlig app

Se magin i praktiken! Nedan visas en GIF som illustrerar det spännande Gissa numret-spelet som du kommer att bygga:

Bygga en gissningsspel-konsolapp

Du står inför två vägar. Det första alternativet lockar dig att påbörja resan utan hjälp, medan det andra erbjuder en hjälpsam guide för att säkerställa din framgång. Oavsett om du kastar dig in modigt eller följer den strukturerade guiden väntar en fascinerande upplevelse som lämnar dig med en funktionell och fängslande konsolapp.

Huvudplan

  • Steg 1: Installation och initiering;
  • Steg 2: Definiera spelparametrar;
  • Steg 3: Definiera hjälpfunktioner;
  • Steg 4: Spellogik;
  • Steg 5: Spara spelresultat;
  • Steg 6: Starta spelet;
  • Slutsats;
  • Komplett appkod.

Steg 1: Installation och initiering

Förbered arbetsytan genom att skapa en ny katalog och en fil med namnet app.js. I denna fil importerar vi de nödvändiga modulerna:

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

Skapa ett Readline-gränssnitt:

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
Kodbeskrivning
expand arrow
  • readline: tillhandahåller ett gränssnitt för att läsa inmatning från och skriva utdata till konsolen;

  • readline.createInterface({ ... }): skapar en instans av klassen readline.Interface. Den accepterar ett objekt med egenskaperna input och output;

  • input: process.stdin: ställer in inmatningsströmmen till process.stdin, vilket gör att programmet kan läsa användarens inmatning från tangentbordet;

  • output: process.stdout: ställer in utmatningsströmmen till process.stdout, vilket gör att programmet kan visa text i konsolen.

Förklaring: Vi importerar de nödvändiga modulerna: readline för användarinteraktion och fs.promises för filoperationer. Därefter skapar vi ett Readline-gränssnitt med namnet rl för att hantera in- och utmatning.

Steg 2: Definiera spelparametrar

Ange minsta och största tal:

const minNumber = 1;
const maxNumber = 100;

Generera det hemliga numret:

const secretNumber =
  Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
Kodbeskrivning
expand arrow
  • Math.random(): genererar ett slumpmässigt flyttal mellan 0 (inklusive) och 1 (exklusive);

  • maxNumber - minNumber + 1: beräknar intervallet av möjliga tal. Att lägga till 1 säkerställer att både minNumber och maxNumber inkluderas i intervallet;

  • Math.random() * (maxNumber - minNumber + 1): genererar ett slumpmässigt tal mellan 0 och det beräknade intervallet;

  • Math.floor(...): avrundar det genererade flyttalet nedåt till närmaste heltal, vilket säkerställer att resultatet är ett heltal inom önskat intervall;

  • ... + minNumber: förskjuter det genererade talet så att intervallet börjar vid minNumber istället för 0.

Initiera räknaren för försök:

let attempts = 0;

Förklaring: Vi definierar intervallet av tal (minNumber och maxNumber) inom vilket det hemliga numret kommer att genereras. Det hemliga numret genereras slumpmässigt med hjälp av Math.random() och tilldelas secretNumber. Variabeln attempts initieras för att hålla reda på användarens försök.

Steg 3: Definiera hjälpfunktioner

Utrusta med en hjälpfunktion för felfri validering:

function isValidGuess(guess) {
  return !isNaN(guess)
    && guess >= minNumber
    && guess <= maxNumber;
}
Kodbeskrivning
expand arrow
  • !isNaN(guess): kontrollerar om guess är ett giltigt tal. Funktionen isNaN() returnerar false för giltiga tal, och !-operatorn vänder detta till true;

  • guess >= minNumber: verifierar att guess är större än eller lika med minNumber, vilket säkerställer att det inte är under det tillåtna intervallet;

  • guess <= maxNumber: verifierar att guess är mindre än eller lika med maxNumber, vilket säkerställer att det inte är över det tillåtna intervallet;

  • &&: kombinerar alla villkor med hjälp av den logiska OCH-operatorn. Alla villkor måste vara true för att hela uttrycket ska utvärderas till true.

Förklaring: Funktionen isValidGuess kontrollerar om användarens gissning är ett giltigt tal inom det angivna intervallet (minNumber till maxNumber).

Steg 4: Spellogik

Spelets kärnmekanik via funktionen playGame:

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();
    }
  });
}
Kodbeskrivning
expand arrow
  • rl.question(\Guess a number between ${minNumber} and ${maxNumber}: `, guess => { ... }): prompts the user to enter a number within the specified range. The user's input is passed to the callback function as the guess`;

  • if (isValidGuess(guess)) { ... }: kontrollerar om det angivna värdet är en giltig gissning med hjälp av funktionen isValidGuess();

  • attempts++;: ökar räknaren attempts för att hålla reda på hur många gissningar spelaren har gjort;

  • const guessNumber = parseInt(guess);: konverterar användarens inmatning från en sträng till ett heltal med parseInt();

  • if (guessNumber === secretNumber) { ... }: kontrollerar om spelarens gissning matchar det hemliga talet. Om så är fallet visas ett meddelande om framgång, resultatet sparas, readline-gränssnittet stängs och spelet avslutas;

  • else if (guessNumber < secretNumber) { ... }: informerar spelaren om att det hemliga talet är högre och anropar playGame() igen för att fortsätta spelet;

  • else { ... }: informerar spelaren om att det hemliga talet är lägre och anropar playGame() igen för att fortsätta spelet;

  • else { ... } (efter valideringskontrollen): hanterar ogiltig inmatning genom att be spelaren ange ett giltigt tal inom det tillåtna intervallet och anropar sedan playGame() igen.

Förklaring: Funktionen playGame utgör spelets huvudloop. Den använder rl.question för att be användaren om en gissning. Om gissningen är giltig kontrollerar funktionen om gissningen matchar det hemliga numret. Om inte, ger den feedback till användaren och fortsätter spel-loopen rekursivt.

Steg 5: Spara spelresultat

Implementera logiken för att spara användarens spelprestationer i filen 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.');
  }
}
Kodbeskrivning
expand arrow
  • async function saveGameResult(result) { ... }: definierar en asynkron funktion med namnet saveGameResult() som tar emot en parameter result och möjliggör användning av await-nyckelordet i funktionskroppen;

  • try { ... } catch (err) { ... }: hanterar potentiella fel som kan uppstå under den asynkrona filoperationen;

  • await fs.appendFile('game_results.txt', \${result}\n`);: appends the provided resultfollowed by a newline character to thegame_results.txtfile. Theawait` pausar exekveringen tills filoperationen har slutförts framgångsrikt;

  • console.log('Game result saved.');: visar ett bekräftelsemeddelande när spelresultatet har skrivits till filen;

  • console.log('Failed to save game result.');: visar ett felmeddelande om filoperationen misslyckas och ett undantag fångas av catch-blocket.

Förklaring: Funktionen saveGameResult använder fs.promises för att lägga till spelresultatet i en fil med namnet game_results.txt. Den ger återkoppling om det lyckades eller misslyckades att spara resultatet.

Steg 6: Starta spelet

Skapa välkomstmeddelandet och starta spelet:

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

Förklaring: Vi visar ett välkomstmeddelande och startar spelloppet genom att anropa funktionen playGame.

Fullständig appkod

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();
Kodbeskrivning
expand arrow
  • Rader 1-2: importerar den inbyggda modulen readline och fs-modulens promises-API för asynkrona filoperationer;

  • Rader 4-7: skapar ett readline-gränssnitt med namnet rl för att läsa användarinmatning och visa utdata i konsolen;

  • Rader 9-10: definierar minimi- och maximivärden för gissningsintervallet;

  • Rader 12-13: genererar ett slumpmässigt hemligt tal inom det angivna intervallet med hjälp av Math.random();

  • Rad 14: initierar räknaren attempts för att hålla reda på antalet gissningar som spelaren gör;

  • Rader 16-18: definierar funktionen isValidGuess() för att validera att det inmatade värdet är ett tal inom det tillåtna intervallet;

  • Rader 20-47: definierar den rekursiva funktionen playGame() som:

    • ber spelaren ange en gissning;
    • validerar det inmatade värdet;
    • kontrollerar om gissningen matchar det hemliga talet;
    • ger återkoppling om gissningen är för hög eller för låg;
    • fortsätter spelet genom att anropa sig själv igen vid behov;
    • sparar resultatet och avslutar spelet när rätt tal gissas;
  • Rader 49-56: definierar den asynkrona funktionen saveGameResult() som sparar spelresultatet till filen game_results.txt och hanterar eventuella fel;

  • Rad 58: visar ett välkomstmeddelande till spelaren;

  • Rad 59: startar spelet genom att anropa funktionen playGame().

Sammanfattning

Detta program skapar ett gissningsspel med tal. Spelaren försöker gissa ett slumpmässigt genererat tal inom ett angivet intervall. Spelet ger återkoppling efter varje gissning, håller reda på antalet försök och sparar lyckade resultat till en textfil med hjälp av asynkrona filoperationer.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 8
some-alt