---
# System prepended metadata

title: Mastermind i Node JS
tags: [inlämningsuppgift]

---

# Mastermind i Node JS

![image](https://hackmd.io/_uploads/S1Pgmao11g.png)

I det här projektet ska vi öva på javascript programmering i Node JS. Projektet går ut på att bygga ett konsolspel som efterliknar det klassiska spelet [mastermind](https://sv.wikipedia.org/wiki/Mastermind). Du kan testa och [spela här](https://webgamesonline.com/codebreaker/).

### Del 1 - Generera en slumpmässig kod

Skapa en funktion som genererar den korrekta koden. Den här funktionen ska slumpa fram 4 stycken siffror mellan 0 och 9 samt spara dem i en array som funktionen sedan returnerar.

*Tips:*
Använd [Math.Random()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random) som returnerar ett tal mellan 0 och 1. Gångra sedan talet med 10 och använd [Math.Floor()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor) för att avrunda nedåt. 

### Del 2 - Kontrollera en gissning

Skapa en funktion som tar in två arrayer som argument. Den ena arrayen ska motsvara spelarens gissning, den andra ska motsvara den korrekta koden. Funktionen ska räkna hur många av siffrorna i gissningen som är helt korrekt, dvs har rätt värde på rätt plats.

Som utmaning kan man sedan försöka utveckla metoden så att den både räknar hur många som är helt korrekt (rätt värde på rätt plats) och hur många som är nästan korrekt (rätt värde men på fel plats.)

### Del 3 - Input loop för spelaren

För att ta in input från användaren i konsolen kan man använda ett bibliotek som heter `readline`. Då behöver vi importera biblioteket och skapa en variabel som innehåller läsfunktionaliteten.

```javascript
const readline = require("readline");

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

Vi kan nu ställa en fråga med funktionen `rl.question`. Den funktionen tar in en fråga samt en *callback*, dvs en funktion som kommer anropas med svaret som argument.

*Exempel kod på hur rl.question används:*
```javascript
function SayHello(input){
    console.log("Hej, " + input);
}

rl.question("Vad heter du?", SayHello);
```

Vi kan anropa rl.question på nytt inuti samma funktion för att skapa en loop som upprepar frågan.

#### Att göra

* importera `readline` och skapa en nytt readline-interface
* skapa en funktion som heter `PlayerGuess(input)` som ska hantera spelarens tur. I slutet av funktionen anropa `question`-funktionen med en fråga och `PlayerGuess` som callback
* anropa också `question`-funktionen på samma sätt utanför dina andra funktioner för att starta spelet.

### Del 4 - Kombinera funktionerna 

Nu vill vi sätta ihop våra funktioner för att bygga hela spelet. Flöde:

1. Den korrekta koden genereras
2. Spelet frågar efter en gissning
3. Gissningen kontrolleras mot korrekta koden, och antalet rätt skrivs ut
4. Om gissningen är helt korrekt, avbryt spelet
5. Annars gå tillbaka till steg 2.

### Del 5 - Utveckla spelet

Nu är grundfunktionalitetn helt klar. Det finns fler sätt att utveckla spelet, välj några av förslagen nedan eller lägg till egen funktionalitet.

* Räkna antalet gissningar spelaren gör och sätt ett maxantal man får göra innan man förlorar spelet.
* Lägg till att spelet kontrollerar att man skriver en korrekt input för en gissning, dvs 4 stycken siffror. Annars ska spelet upprepa frågan utan att räkna det som en gissning.
* Gör utmaningen i del 2. 
* Använda `fs`-biblioteket för att kunna skriva till filer, och lägg till att spelet håller koll på en highscore som sparas i en fil. 
* Byt ut siffrorna i koderna mot färger som i orginalspelet. Fundera på hur du ska representera färgerna och hur användaren ska skriva in sina gissningar.
