Linux - Friheden til at programmere i Java: Version 0.7.20040516 - 2020-12-31 | ||
---|---|---|
forrige | Kapitel 11. Grafiske brugergrænseflader | næste |
Denne opgave kræver, at du har læst Kapitel 6, Nedarvning og Kapitel 10, Appletter og grafik.
Lav matadorspillet om til at kunne vises grafisk i en applet. Der skal som minimum være en knap, som spiller en omgang.
Når du skal programmere, så vær systematisk, og del opgaven op i små delopgaver. Løs en delopgave ad gangen, og afprøv, at det fungerer, før du går videre.
Hent kildeteksten til matadorspillet (version 2: Felt.java, Gade2.java, Grund2.java, Helle.java, Rederi2.java, Start.java, Spiller.java og SpilMatador.java ændret til at bruge Gade2 og Rederi2), og prøv det.
Genbrug MinApplet ovenfor. Husk at initialisering skal ske i init()-metoden eller i konstruktøren. De variabler der skal deles mellem flere metoder, skal være objektvariabler (lokale eksisterer jo kun i den metode de er defineret i).
Lav en tur-knap, som spiller en runde.
Føj en metode til Felt, der tegner feltet. Hvert felt skal også have en position (den er en del af initialiseringen, så sæt den fra init()-metoden).
Løb igennem alle felter, og tegn dem i paint().
Udbyg derefter spillet efter egen smag.
Det er bedst at du bruger hovedet og kun ser på dem hvis du er gået i stå.
Prøve programmetHar du ikke allerede i sidste lektion prøvet matadorspillet, så prøv at køre programmet. Derefter er det naturligvis meget lettere at lave en grafisk udgave! Brug trinvis gennemgang (trace into/step over), indtil du føler, du har forstået programkoden. Først da er du klar til at prøve i en applet.
Struktur i en appletOpret en applet, eller genbrug MinApplet ovenfor. Flyt initialiseringen fra SpilMatador.java til init()-metoden eller konstruktøren. Husk at importere java.util.* øverst for at få adgang til Vector-klassen. Variablerne felter, sp1, sp2 skal nu være objektvariabler (før var de lokale variabler), for at de kan ses i resten af appletten:
import java.awt.*; import java.applet.*; import java.util.*; public class MatadorApplet extends Applet { // objektvariabler: Spiller sp1=new Spiller("Søren",50000,Color.green); // opret spiller 1 Spiller sp2=new Spiller("Gitte",50000,Color.yellow); // opret spiller 2 Vector felter=new Vector(); public MatadorApplet() // eller "public void init()" { felter.addElement(new Start(5000)); felter.addElement(new Gade2("Gade 1",10000, 400,1000)); felter.addElement(new Gade2("Gade 2",10000, 400,1000)); //... osv.
Husk, at appletten først tegner noget, når initialiseringen er færdig, så hvis du f.eks. kører 20 runder i initialiseringen, tager det lang tid, førend systemet når til at kalde paint()!
Definér en tur-knapFor at få spillet til at køre kan du lave en knap. Når brugeren trykker på knappen, så kald spillernes tur()-metode. (Alternativ: kald spillernes tur()-metode inde i paint() og afslut paint() med: repaint(1000); dette får systemet til at kalde paint() igen efter et sekund).
Hvert felt skal have en position. Føj en position (af typen Point) til Felt-klassen:
import java.awt.*; public class Felt { String navn; Point position = new Point();
og definér metoden tegn(Graphics g) på Felt, der tegner feltets navn på positionen:
public void tegn(Graphics g) { g.setColor(Color.black); g.drawString(navn,position.x,position.y); }
Husk at importere java.awt.* øverst for at få adgang til Point- og Graphics-klassen.
Løb alle felterne igennem i init(), og sæt koordinaterne på felterne:
felter.addElement(new Gade2("Gade 8",20000,1100,2000));
felter.addElement(new Gade2("Gade 9",30000,1500,2200));
for (int i=0; i<felter.size(); i++)
{
double v = Math.PI*2*i/felter.size(); // vinkel i radianer
Felt f = (Felt) felter.elementAt(i);
f.position = new Point(
100 + (int) (100*Math.cos(v)),
110 + (int) (100*Math.sin(v))
);
}
Definér applettens paint()-metode til at kalde felternes tegn() for at tegne brættet:
public void paint(Graphics g) { for (int i=0; i<felter.size(); i++) { Felt f = (Felt) felter.elementAt(i); f.tegn(g); }
En grund skal også have tegnet ejeren nedenunder, så den skal have en anderledes tegn(). Definér tegn() i Grund2. En gade skal også vise antallet af huse. Definér også tegn() i Gade2.
Find selv på flere ting:
Lav tekstfelter, der beskriver hver spillers beholdning.
Tegn spillernes biler på skærmen .
Automatisk spil (vink: kald spillernes tur()-metode inde i paint(). Start paint() med: repaint(1000); dette får systemet til at kalde paint() igen efter et sekund).