Oefening 1: harder, beter, sneller, sterker

Doel

Schrijven, uitvoeren en testen van een eerste Java programma in de BlueJ IDE.

Opdracht

Maak een programma om het spel "hoger / lager" te spelen, zoals in oefening2.

BlueJ

Meer informatie m.b.t. de BlueJ programmeeromgeving.

  1. Installeer BlueJ: https://bluej.org/
  2. Open BlueJ en maak een nieuw project: HogerLager.

Merk op dat veel software en programmeertalen geen spaties in namen gebruiken. Kies daarom steeds namen zonder spaties. Bij het beginnen van een nieuw woord kan je bvb. een hoofdletter gebruiken om de naam leesbaar te houden.

Main methode

  1. Maak een nieuwe klasse, genaamd HogerLager.

    BlueJ klassen en objecten venster

    Figuur 1: Een BlueJ project met één klasse HogerLager. De klasse is grijs gearceerd om aan te duiden dat die nog niet gecompileerd is.

  2. Open de klasse HogerLager. Dubbelklik op de klasse HogerLager, of klik rechts en "open editor"

  3. Verwijder alle code tussen
     public class HogerLager
     {
       ...
     }
    
  4. Schrijf een main methode:

    public class HogerLager
    {
     public static void main(String[] args)
     {
         System.out.println("Hallo wereld!");
     }
    }
    

    BlueJ code editor voor de klasse HogerLager

    Figuur 2: Code editor voor de klasse HogerLager.

    De main methode is het aanvangspunt van de code van het programma. In deze methode staat er 1 statement: System.out.println("Hallo wereld!"); Een statement kan je herkennen doordat die eindigt met een puntkomma. In dit statement wordt een println methode aangeroepen. Een methode aanroep kan je herkennen doordat er een argumentenlijst wordt meegegeven. Soms is deze leeg, dan staat er niets tussen de haakjes. In dit geval wordt er 1 argument meegegeven, i.e. "Hallo wereld!". Dit is een String literal, een stukje tekst. Soms heb je meerdere argumenten bij een methode aanroep, de argumenten worden dan 1 voor 1 opgesomd, gescheiden door een komma.

  5. Druk op Compile. Indien er geen syntax fouten zijn, verschijnt onderaan de boodschap Class compiled - no syntax errors. Veel voorkomende fouten zijn bvb.:

    1. Vergeten van een puntkomma teken ;. Foutboodschap: ';' expected
    2. Vergeten van een "sluit de accolade" teken }. Foutboodschap: reached end of file while parsing.
    3. Een typfout zoals SysTem ipv. System. Let op Java is hoofdlettergevoelig! Foutboodschap: package SysTem does not exist
    4. Een typfout zoals ut ipv. out. Foutboodschap: cannot find symbol - variable ut.
    5. Vergeten van een aanhalingsteken ". Foutboodschap:')' expected of not a statement of unclosed string literal.
    6. Vergeten van een "open het vierkante haakje" [. Foutboodschap: <identifier expected>

    Merk op dat de foutboodschap niet altijd de juiste informatie geeft. Indien code meerdere fouten bevat, begin dan bovenaan het bestand en werk 1 voor 1 de fouten weg.

  6. Keer terug naar het project venster, klik rechts op de klasse en roep de main methode aan. Bij het venster Method call klik op OK zonder iets te veranderen.

    Uitvoeren van de klasse HogerLager

    Figuur 3: Klik op void main(String[] args) om het programma uit te voeren.

  7. In het uitvoer venster, verschijnt de tekst Hallo wereld!. Indien het uitvoer venster niet verschijnt, klik dan op View -> Show Terminal

    Uitvoeren van de klasse HogerLager

    Figuur 4: Het uitvoer venster.

Types en variabelen

  1. Maak het volgende programma, voer het uit en bekijk de resultaten.

    public class HogerLager
    {
     public static void main(String[] args)
     {
       int getal = 0;
       System.out.println(getal);
    
       getal = 10;
       System.out.println(getal);
    
       getal = getal + 10;
       System.out.println(getal);
    
       System.out.println(getal / 2);
    
       System.out.println(getal);
    
       System.out.println(getal / 6);
     }    
    }
    
    1. int geheelGetal is de declaratie van de variabele. Het type int staat voor een geheel getal (i.e. integer). Een variabele moet slechts 1 keer gedeclareerd worden.
    2. Met de = operator doe je een toewijzing. Aan een int wijs je gehele getallen toe.
    3. Dit kunnen ook wiskundige expressies zijn, zoals + en /.
    4. Een expressie kan je ook zonder toewijzing gebruiken. bvb. getal / 2
    5. Bij integer getallen staat / voor de gehele deling.
  2. Verander in bovenstaand programma het type int naar double, i.e. double getal = 0 Een double stelt een kommagetal voor. Voer het programma opnieuw uit.

Vraag 1

  Wat is de uitvoer van het volgende stukje code?
double getal = 20;
System.out.println(getal / 6);

Invoer en uitvoer

  1. Om invoer van de gebruiker te voorzien, moet een klasse geladen worden. Plaats de volgende code op de eerste regel van de code van HogerLager.

    import java.util.Scanner;
    

    Een import statement laadt een reeds gedefinieerde klasse. In dit geval de klasse Scanner. Meer informatie over de Scanner klasse kan je terugvinden in de Java API. https://docs.oracle.com/javase/8/docs/api/

  2. Plaats de volgende code in de main methode:

    public static void main(String[] args)
    {
         // Dit is een regel commentaar
         Scanner invoer = new Scanner(System.in);
    
         /*
           Alles tussen slash ster en ster slash is ook commentaar.
           Dit kan meerdere lijnen omvatten.   
         */
         System.out.println("Typ een tekstje en sluit af met enter");
         String echo = invoer.next();
         System.out.println("Echo: " + echo);        
    }
    
    1. Scanner invoer = new Scanner(System.in); Deze regel code maakt een nieuwe Scanner, genaamd invoer. Het type van de variabele invoer is een Scanner en gaat de variabele naam vooraf. Deze Scanner wordt gebruikt om de invoer van de gebruiker te analyseren.
    2. Commentaar wordt niet gecompileerd. Commentaar bevat typisch uitleg over de code.
    3. String echo = invoer.next(); Roept de methode next() aan zonder argumenten. Het resultaat hiervan wordt toegekend aan de echo variabele. Het type van deze variabele wordt eerst gedeclareerd, i.e. String wat een stukje tekst voorstelt.
    4. System.out.println("Echo: " + echo); Print een stukje tekst op de uitvoer. In dit geval wordt de String literal "Echo: " geconcateneerd met de echo variabele. Concatenatie van Strings wordt aangegeven met het plusteken.

    Vraag 2

     Wat is de uitvoer van het volgende stukje code?
    
     System.out.println("Uitvoer 1: " + 20 + 22);
     System.out.println("Uitvoer 2: " + (20 + 22));
    

Willekeurige getallen

  1. Om een willekeurig getal te berekenen, moet de klasse ThreadLocalRandom geladen worden. Plaats het volgende import statement bij de andere import statements. Meer informatie over de ThreadLocalRandom klasse kan je terugvinden in de Java API. https://docs.oracle.com/javase/8/docs/api/

    import java.util.concurrent.ThreadLocalRandom;
    
  2. De methode nextInt(min, max+1) genereert een willekeurig geheel getal tussen min en max. bvb.

    int random = ThreadLocalRandom.current().nextInt(5, 25);
    

Vraag 3

  Wat is de maximale waarde bij het uitvoeren van bovenstaand statement?

do/while lus

  1. Genereer 2 verschillende gehele getallen tussen 1 en 13 (inclusief).

    1. Maak gebruik van een do/while constructie.

      int eersteGetal = ThreadLocalRandom.current().nextInt(1, 14);
      int tweedeGetal = 0;
      do
      {
      /*Plaats hier alle statements die op zijn minst 1 keer uitgevoerd moeten worden,
       zolang de voorwaarde geldt.*/
      } while(/*Plaats hier de voorwaarde*/);
      
    2. Plaats in het do block de toewijzing van een willekeurig getal aan de variabele tweedeGetal. Een block omvat alle statements tussen de accolades. Een block duidt typisch een scoop aan. Een scoop kan een andere scoop omvatten. Een variabele is enkel gekend binnen de scoop waarin de variabele werd gedeclareerd.

      De BlueJ code editor duidt de verschillende blokken aan in een verschillend kleur

      Figuur 5: De BlueJ code editor duidt de verschillende blokken aan in een verschillend kleur. Zo heeft de klasse HogerLager een scoop aangeduid in het geel. De methode main heeft een scoop aangeduid in het wit en de do/while een scoop aangeduid in het paars. De scoop van de klasse omvat de scoop van de methode die op zijn beurt de scoop van de lus omvat.

    3. Plaats tussen de haakjes van de while de voorwaarde waarbij de lus verder uitgevoerd moet worden. Let op: om twee getallen met elkaar te vergelijken wordt een dubbel gelijkteken == gebruikt. Een enkel gelijkteken wordt gebruikt voor een toewijzing.

    Vraag 4

     Wat is het probleem bij de volgende code?
    
    public static void main(String[] args)
    {
     int eersteGetal = ThreadLocalRandom.current().nextInt(1, 14);
     do
     {
           int tweedeGetal = ThreadLocalRandom.current().nextInt(1, 14);
     } while(eersteGetal == tweedeGetal);        
    }
    

Selectie

  1. Vraag aan de gebruiker of het tweede getal groter of kleiner zal zijn dan het eerste getal. Geef hiervoor eerst het eerst getal weer.
  2. Bepaal of de gebruiker correct of verkeerd gegokt heeft. Geef dit aan door "Correct!" of "Verkeerd!" weer te geven.

    1. Maak gebruik van een if/else structuur

      if(/*voorwaarde*/){
      //Voer deze code uit indien de voorwaarde juist was
      }
      else {
      //In het andere geval voer deze code uit.
      }
      
    2. Om twee Strings met elkaar te vergelijken, maak gebruik van de methode equals. Bvb.

      Scanner invoer = new Scanner(System.in);
      String tekst = invoer.next();
      if(tekst.equals("Hallo")){
        //doe iets
      }
      
    3. Tip: Maak eventueel gebruik van geneste if structuren.

Booleaanse variabelen

  1. Maak een lus in het programma zodat de gebruiker verder blijft spelen zolang de hij of zij correct gokt.
    1. Hou bij hoeveel keer de gebruiker correct heeft gegokt en geef dit aantal weer na het aflopen van het spel.
    2. Telkens de gebruiker een correcte gok heeft gemaakt wordt het tweede getal het eerste getal en wordt een nieuw tweede getal gegenereerd.
  2. Hou de toestand van het spel bij in een booleaanse variabele. Deze variabele heeft maar 2 mogelijke waarden: true of false. Bvb.
    boolean stop = false;
    do {
    //...
    stop = true;
    }  
    while(!stop);
    
  3. Bemerking: Het uitroepingsteken is een booleaanse NOT.

Afwerking

  1. Indien de gebruiker een onverwachte invoer geeft, bvb. "Hallo" ipv. "Hoger" of "Lager", dan wordt de gebruiker hiervan verwittigd en krijgt de gebruiker opnieuw de kans om een correcte invoer te geven.
  2. Na het aflopen van het spelletje krijgt de gebruiker de mogelijkheid een nieuw spelletje te starten of af te sluiten.

Extra

  1. Maak het spelletje Blackjack. Hierbij wordt iedere keer aan de gebruiker gevraagd indien nog een kaart gedraaid moet worden. De waarde van alle kaarten wordt telkens opgeteld. De koning, dame en boer hebben hierbij de waarde 10, een aas heeft ofwel de waarde 1 of 11. Zolang de som van alle kaarten lager is dan 21 kan de gebruiker een kaart bijvragen. De bedoeling is om een zo hoog mogelijke waarde te halen zonder boven de 21 te gaan.
  2. Maak een eenvoudige AI voor Blackjack, bvb. zolang de waarde van de gedraaide kaarten lager is dan 17 blijft de AI een kaart bijvragen.

results matching ""

    No results matching ""