Herkennen van gewonnen spel en gelijkspel.

Op deze pagina ga je je Boter-Kaas-en-Eieren project zo programmeren dat overwinning en gelijkspel herkend worden.

Het opslaan van alle manieren om te winnen

Voordat we een manier bedenken om een gewonnen spel te herkennen, moeten we eerst vaststellen op welke manier je kan winnen. Dit doen we door elke mogelijkheid voor een gewonnen spel op te slaan door middel van een lijst van drie posities. Dit winnende drietal kan er bijvoorbeeld uit zien als Geen Afbeelding, want het gewonnen drietal staat op de 3e, 5e en 7e positie:
Geen Afbeelding

  1. Geen Afbeelding
    1. Hoeveel manieren zijn er om te winnen?
    2. Schrijf alle mogelijkheden uit als drietallen.

We gaan nu een lijst maken waarin we alle mogelijkheden zetten waarop je kan winnen. Dit vergelijken we met bord.

  1. Open je project H3L2-BoterKaasEieren.
  2. Geen Afbeelding
  3. Maak een resultaatblok aan dat alle gewonnen drietallen rapporteert. Het ziet er ongeveer zo uit:

    Geen Afbeelding

Een manier om te winnen controleren

We hebben een manier nodig om te achterhalen of er werkelijk een gewonnen drietal is. We gebruiken map om iedere positie te checken van een drietal om te kijken of een van de twee spelers wint met dat drietal.

Je hebt geleerd over map in Hoofdstuk 3 Les 1 Pagina 4: Transformeren van alle items in een lijst.

Map past de functie in de grijze ring (rond het groene blok) toe op elk item in de invoerlijst, en rapporteert een lijst met alle resultaten.
Geen Afbeelding

Bedenk dat het lege invoervak van de functie in de grijze ring de plek is waar een item uit de lijst terecht komt als de functie wordt uitgevoerd.

  1. Klik op Geen Afbeelding om een nieuw spel te starten. Speel een spel en laat X expres winnen.
  2. Bouw het blok hieronder na en kijk wat het rapporteert.

    Geen Afbeelding
    Hoe werkt map hier? Klik voor een hint...

    Deze map werkt hetzelfde als het voeg samenvoorbeeld hierboven, maar het is wat ingewikkelder als je erover nadenkt. map voert elk lijstitem in het lege vakje van de functie in de grijze ring en rapporteert een lijst met de resultaten, net als voorheen .

    Maar nu is de functie in de grijze ring item ( ) van ( bord ) , dus map checkt de items 1, 2, en 3 van de lijst en rapporteert een lijst met wat er in de drie posities staan.

    Als je niet kan zien wat er in de bordvariabele staat, zorg dan dat het vakje is aangevinkt in het Variabelenpalet. Maak het kijkvenster groot genoeg zodat je elke lijstitems kan zien, net zoals in het plaatje hieronder.
    Geen Afbeelding Geen Afbeelding


  3. Geen Afbeelding
    Wat zegt het resultaat van dit blok je over de staat waarin het spel zich bevindt?


  4. Als {1, 2, 3} niet het drietal is waarin X het spel heeft gewonnen, vervang dan de lijst in map met het werkelijke winnende drietal en klik opnieuw op het blok.

  5. Gebruik dit idee om een Geen Afbeelding blok te maken dat een mogelijk winnend drietal (zoals Geen Afbeelding) als invoer heeft en een lijst rapporteert met wat er in die drie posities staat.
    Je hebt geleerd hoe je het invoertype Geen Afbeelding moet specificeren in Hoofdstuk 2 Les 2 Pagina 1: Verwerken van elk item in een lijst.
  6. Speel een nieuw spel waarin speler O wint en test je status van drietalblok met het winnende drietal.
    Fix de bugs, als die er zijn.

    Geen Afbeelding



Alle manieren om te winnen controleren

Je hebt net een blok gebouwd dat voor één drietal zal laten zien of een speler alle drie de posities heeft gekozen. Nu ga je een blok, status van alle winnende drietallen bouwen om diezelfde functie op alle drietallen toe te passen waarmee een speler kan winnen. Daarna zal je dit blok gebruiken om te controleren of een van die drietallen drie zetten van dezelfde speler bevat.

Hieronder heeft Speler O bijvoorbeeld gewonnen en het status van alle winnende drietallen blok bevat de status van ieder drietal. De computer kan dit blok gebruiken om te controleren of een winnend drietal alleen X of alleen O bevat.

Geen Afbeelding Geen Afbeelding

De volgorde van je drietallen of de nummering van de posities in je project is misschien anders. Dit is prima, zolang je project maar werkt.

  1. Gebruik map samen met een paar andere blokken die je gebouwd hebt om status van alle winnende drietallen te bouwen. Het zou de status van alle winnende drietallen moeten rapporteren als een lijst met lijsten, zoals hierboven.
  2. Klik hier voor een hint voor het werken met map.
    Wanneer je map gebruikt, denk dan na over:
    1. Welke functie probeer je toe te passen? Dat moet in de grijze ring staan.
    2. Op welke gegevens voer je dei functie toe? Dat is de lijst waarop je map toepast.
    Je wilt in dit geval de status van ieder winnend drietal weten.
  3. Maak nu een Geen Afbeeldingblok dat de letter X of O als invoer neemt en waar rapporteert alleen als die speler gewonnen heeft.
  4. Pas je programma aan zodat wanneer een speler het spel wint, het programma dit aan de speler vertelt.
  5. Klik hier voor een hint voor het bouwen van gewonnen?

    Druk het uit in woorden: wat wil je precies controleren?

    Zijn er blokken die je daarmee kunnen helpen?

    Klik hier voor nog een hint.

    Geen Afbeelding

  6. Speel het spel een aantal keer om te controleren of het werkt en fix bugs als die er zijn. Zorg ervoor dat iedere speler minstens één keer wint.

Geen Afbeelding


Gelijkspel controleren

De definitie van een gelijkspel is dat er geen lege vakjes meer zijn en geen van beide spelers gewonnen heeft.

  1. Ontwikkel een manier om te controleren of er een gelijkspel is en als dat zo is, zorg dan dat het programma de spelers daarvan op de hoogte stelt.
  2. Speel het spel een paar keer om de gelijkspelcontrole te testen en fix bugs als die er zijn.
  3. Waarom maakt de volgorde van de tests (voor een winnaar of gelijkspel) uit? Geen Afbeelding
  4. Geen Afbeelding
  5. Je kan verder werken aan dit project in Hoofdstuk 5, Optioneel Project: Je boter-kaas-en-eieren project herzien.


  1. Er zijn veel kleine verbeteringen die je zou kunnen maken. Bijvoorbeeld, als een speler wint kan je ervoor zorgen dat er geen zetten meer mogen worden gedaan. Wat zou je nog meer willen verbeteren?
Geen Afbeelding
  1. Je programma kan slimmer gelijkspel ontdekken. Als er nog maar één leeg vakje op het bord is en de speler die de volgende keer aan zet is niet zou winnen, dan is er al sprake van gelijkspel. De uitdaging hier is dat je moet testen of je wint op een bord dat niet het huidige bord is.
  2. In plaats van dat de sprite iets zegt zoals 'X wint' is het veel leuker als je een lijn tekent door de drie winnende vakjes. Dit is best lastig omdat op het moment dat er een winnaar is, je tegelijk niet meer weet welk drietal daarvoor zorgde. Zorg dat je code leesbaar blijft.
Terug Volgende