H14 Multimedia

Leerdoelen

Na het bestuderen van dit hoofdstuk wordt van je verwacht dat je:

  • weet hoe je willekeurige (random) getallen kunt aanmaken
  • weet hoe je afbeeldingen en geluid in je programma kunt gebruiken

Praktijk

Willekeurige getallen

Met de random-functie kunnen we willekeurige getallen genereren, dat betekent dat telkens als de functie aangeroepen wordt er een willekeurig getal van 0.0 tot 1.0 wordt aangemaakt. Let op: De 1.0 komt dus nooit voor.

//Voorbeeld 14.1

import java.awt.*;
import java.applet.*;

public class Random extends Applet {
	
    double r;
	
    public void init() {
        r = Math.random();		
    }

    public void paint(Graphics g) {
        g.drawString("" + r, 50, 60 );
    }
}

random() is een statische functie uit de klasse Math. Vandaar de punt tussen Math en random(). Door de regel r = Math.random(); wordt een getal gegenereerd en dat getal wordt in de variable r gezet. Omdat het gaat om een getal vanaf 0.0 tot 1.0 is r als double gedeclareerd.

Veel stelt dit programma niet voor. Maar met deze functie kunnen we bijvoorbeeld het werpen van een dobbelsteen simuleren. Een dobbelsteen heeft echter hele waarden die lopen vanaf 1 tot en met 6. Het volgende programma laat zien hoe een dobbelsteen wordt gesimuleerd:

//Voorbeeld 14.2

import java.awt.*;
import java.applet.*;

public class Random extends Applet {
	
    double r;
    int worp;
	
    public void init() {
        r = Math.random();
        worp = (int)(r * 6 + 1);		
    }

    public void paint(Graphics g) {
        g.drawString("" + worp, 50, 60 );
    }
}

Er zijn twee regels bijgekomen. De eerste is de declaratie van de integer worp. De tweede regel die erbij is gekomen, is interessanter:

worp = (int) (r * 6 + 1);

r heeft de willekeurige waarde vanaf 0.0 tot 1.0. Stel de laagste waarde 0.0 staat in r. De laagste waarde van een worp met een dobbelsteen is altijd 1, de hoogste 6. Dus moet r met 6 vermenigvuldigd worden om bij maximaal 5.4 uit te komen. Omdat de laagste waarde 1 moet zijn, moet er 1 bij opgeteld worden. Dan wordt de minimale waarde 1.0, als in r 0.0 staat en de hoogste waarde 6.4 als er in r 0.9 staat. Dat laatste is te hoog en de getallen zijn nog steeds geen gehele getallen. Vandaar de conversie van een double naar int. Dat betekent dat een van een 1.0 een 1 wordt gemaakt en van 6.4 een 6. Door de conversie van een double naar een int wordt alles wat achter de punt staat afgekapt. De laagste waarde is dus nu 1 en de hoogste waarde een 6 en alle waarden zijn gehele getallen.

De algemene formule waarmee een reeks binnen een begin- en een eindwaarde kan worden berekend, is:
RandomGetal * MaximumGetal + MinimumGetal

Afbeeldingen

In Java kun je afbeeldingen van schijf opvragen en deze in het venster van je applet laten zien. De afbeelding moet dan wel in gif-, jpeg- of jpg-formaat zijn opgeslagen. Ook bewegende gif-afbeeldingen worden getoond. Is de afbeelding niet in één van de drie formaten opgeslagen, dan kun je heel eenvoudig de afbeelding met een tekenprogramma zoals Paint of Paintshop converteren naar het juiste formaat.

De klasse Image maakt het mogelijk in Java te werken met afbeeldingen. Globaal zijn er twee stappen nodig om een afbeelding in het venster van de applet te tonen. De eerste is de afbeelding van schijf inlezen en de tweede is de afbeelding in het venster van de applet te tonen. Het programma hieronder laat dit zien.

//Voorbeeld 14.3

import java.awt.*;
import java.applet.*;
import java.net.*;

public class Afbeelding extends Applet {
	
    private Image afbeelding;
    URL pad;
	
    public void init() {
        pad = getDocumentBase();
        afbeelding = getImage(pad, "Afbeelding.gif");		
    }

    public void paint(Graphics g) {
        g.drawString(pad.toString(), 20, 10 );
        g.drawImage(afbeelding, 20, 20, 400, 300, this);
    }
}

Allereerst het inlezen: daarvoor moet eerst de variabele afbeelding van de klasse Image gedeclareerd worden. Hierin wordt de afbeelding geplaatst als deze is ingelezen. Verder moet bekend zijn waar de afbeelding op schijf gevonden wordt: Hiervoor wordt de variabele pad gedeclareerd als URL: Unified Resource Locator. Eigenlijk is dit de manier waarop bestanden op internet gevonden kunnen worden. Ook kan deze gebruikt worden voor bestanden die op schijf staan. Om URL te kunnen gebruiken moet java.net.* geïmporteerd worden. In de methode init wordt allereerst de variabele pad gevuld met de volledige verwijzing naar het pad waarvanuit het HTML-bestand is gestart die de applet heeft gestart. Dit gebeurt door de methode getDocumentBase(). Een andere mogelijke methode is getCodeBase() die de verwijzing doorgeeft naar het pad van het class-bestand. Als in pad staat waar het bestand zich bevindt, kan de afbeelding ingelezen worden en in afbeelding geplaatst worden. In de methode paint wordt het pad met de methode toString van de klasse pad in het venster getoond en wordt daaronder met de methode drawImage van de klasse g de afbeelding in het venster geplaatst. De werking van deze methode lijkt op die van het tekenen van rechthoeken. De eerste twee parameters geven de linkerbovenhoek van de afbeelding aan en de volgende twee de breedte en de hoogte van de afbeelding. Omdat drawImage() in de klasse Applet is geïmplementeerd, kan de laatste parameter met this naar de applet verwijzen.

Geluid

Ook geluid is in Java niet moeilijk te realiseren. Het lijkt heel veel op de wijze waarop afbeeldingen ingelezen en getoond worden. Zie het volgende voorbeeld:

//Voorbeeld 14.4

import java.awt.*;
import java.applet.*;
import javax.swing.*;

public class LoadAndPlay extends Applet {
	
    private AudioClip sound;
    
	
    public void init() {
        sound = getAudioClip(getDocumentBase(), "flourish.mid");
        		
    }

    public void paint(Graphics g) {
        sound.play();
    }
}

Allereerst wordt er een instantie van de klasse AudioClip gedeclareerd. De klasse AudioClip kan verschillende soorten geluidsbestanden aan, waarvan midi en wav de bekendste zijn. aan sound wordt in dit geval een midi-bestand gekoppeld in de functie init(). Dat gebeurt op dezelfde wijze als een afbeelding wordt ingelezen. Vervolgens wordt in de functie paint() het bestand afgespeeld.

Opdracht 14.1

Schrijf een applet waarin het delen van één kaart wordt gesimuleerd. Er wordt willekeurig een kleur en binnen die kleur een willekeurige kaart gekozen. Maak een tabel voor de kleuren en één voor de kaarten binnen de kleuren. Laat de keuze als volgt in het venster van de applet zien, bijvoorbeeld: Ruiten, aas.

Opdracht 14.2

Schrijf een applet waarin alle kaarten worden verdeeld over vier spelers. Maak voor iedere speler een tabel van 13. Let op: een kaart kan maar één keer gedeeld worden. Laat na het delen het resultaat in het venster van de applet zien. Als de kaarten verdeeld zijn, laat de computer dat door een geluid blijken.

Praktijkopdracht

Maak een spel waarbij een menselijke speler het tegen de computer opneemt. Er zijn 23 stenen (lucifers of knopen of iets anders mag ook). De bedoeling van het spel is dat de degene die de laatste steen wegneemt, verliest. Er mogen in één beurt 1, 2 of 3 stenen weggenomen worden en er moet altijd één of meerdere stenen weggenomen worden.

De computer vraagt eerst om menselijke invoer. De invoer wordt gecontroleerd (1, 2 of 3) en daarna vermindert de computer het aantal stenen. Vervolgens bepaalt de computer zijn eigen zet, deelt die aan de speler mee, vermindert het aantal stenen met zijn zet en vermeldt het aantal stenen. Dan is de speler weer aan de beurt enzovoorts totdat het aantal stenen nul is. Degene die de laatste steen heeft weggehaald, heeft verloren.

Om te bepalen welke strategie de computer moet volgen, beginnen we aan het einde van het spel. Aan het einde moet de computer ervoor zorgen dat er nog maar één steen over is. Verder moet hij ervoor zorgen dat de speler er nooit één kan overlaten, maar altijd minstens 2. Dat betekent dat de computer er bij de voorlaatste zet 5 moet overhouden. De speler kan er dan altijd 1, 2 of 3 wegnemen, daarna kan de computer ervoor zorgen dat er nog één steen overblijft. Die moet de speler dan nemen, waardoor de computer wint. De speler mag dus nooit 5 stenen kunnen overlaten, maar minstens 6. Dat kan als er nog 9 stenen overblijven. Als we zo doorredeneren, komen we tot de volgende getallen: 1, 5, 9, 13, 17, 21. Op de eerste na is dat dus een veelvoud van 4 + 1.

Voorbeeld uitwerking