Hej
Så er jeg gået i stå med mit Java igen.
Jeg havde tidligere lavet et matadorspil (med hjælp fra bogen), og nu består opgaven så i at lave det grafisk.
Jeg har fået alle felterne til at blive vist grafisk, men jeg vil gerne have at der står under feltet hvem der ejer det. Jeg synes jeg har prøvet alt, men kan ikke få det til at virke.
I klassen Grund2, har jeg sat nogle udskrivninger ind, for at se hvad der sker. Det viser at metoden bliver kørt igennem, men den ikke vil tegne ejeren til grunden.
Håber i kan hjælpe.
Programmet er delt op i mange klasser, og jeg poster de mest relevante for at spillet kan fungere. Dog i rækkefølge efter relevans. Jeg er næsten sikker på at problemet ligger i MatadorGrafikpanel, Felt og Grund2.
Grafikpanelet:
import java.awt.*;
import javax.swing.*;
public class MatadorGrafikpanel extends JPanel{
Matadorspil spil = new Matadorspil();
public void paintComponent(Graphics g)
{
super.paintComponent(g);
for(int i = 0; i<spil.felter.size(); i++)
{
Felt felt = spil.felter.get(i);
double v = Math.PI * 2 * i / spil.felter.size(); //Vinkel i radianer
int x = 300 + (int) (250 * Math.cos(v)+1.5*Math.PI);
int y = 300 + (int) (250 * Math.sin(v));
g.setColor(Color.BLACK);
felt.tegn(g, x, y);
}
}
}
Felt:
import java.awt.*;
public class Felt {
String navn; //Feltets navn
//Kaldes når en spilelr passerer feltet
public void passeret(Spiller sp)
{
sp.besked("Du passerer "+navn);
}
//kaldes når en spiller lander på feltet
public void landet(Spiller sp)
{
}
public void tegn(Graphics g, int x, int y)
{
g.drawString(navn, x, y);
}
}
Grund2:
import java.awt.Graphics;
public class Grund2 extends Felt{
Spiller ejer;
double pris;
double grundleje;
public Grund2 (String navn, double pris, double grundleje)
{
this.navn = navn;
this.pris = pris;
this.grundleje = grundleje;
}
public double beregnLeje()
{
return grundleje;
}
public void landet(Spiller sp)
{
{
sp.besked("Du er landet på "+navn);
if(sp == ejer) //Spilleren ejer allerede grunden
{
sp.besked("Det er din egen grund");
}
else if (ejer == null) //Ingen ejer grunden, og spilleren får tilbudt den
{
if(sp.konto >= pris) //Hvis spilleren har penge nok til grunden
{
if(sp.spørgsmål("købe "+navn+" for "+pris)) //Vil spilleren købe?
{
sp.transaktion(-pris); //Spilleren betaler for grunden
ejer = sp;
}
}
else sp.besked("Du har ikke råd til at købe "+navn);
}
else //Feltet ejes af anden spiller
{
grundleje = beregnLeje();
sp.besked("Leje: "+grundleje);
sp.betal(ejer, grundleje); //Spilleren betaler til ejeren
}
}
}
public void tegn(Graphics g, int x, int y)
{
g.drawString(navn, x, y);
if(ejer != null)
{
g.drawString(ejer.navn, x, y+15);
System.out.println("Test1");
}
System.out.println("Test2");
}
}
Gade2:
import java.awt.Graphics;
public class Gade2 extends Grund2{
int antalHuse;
double huspris;
public Gade2(String navn, double pris, double grundleje, double huspris)
{
super(navn, pris, grundleje);
this.huspris = huspris;
antalHuse = 0;
}
public double beregnLeje()
{
return grundleje+antalHuse*grundleje;
}
public void landet(Spiller sp)
{
if(sp == ejer)
{
sp.besked("Du er landet på "+navn);
if(antalHuse<5 && sp.konto>huspris && sp.spørgsmål("købe hus for "+huspris))
{
ejer.transaktion(-huspris);
antalHuse++;
sp.besked("Du bygger hus på "+navn+" for "+huspris);
}
}
else super.landet(sp);
}
public void tegn(Graphics g, int x, int y)
{
super.tegn(g, x, y);
if(antalHuse > 0) g.drawString(antalHuse+" huse", x, y+15);
}
}
Spiller:
import java.awt.*;
public class Spiller {
String navn; //Navn på spiller
double konto; //Penge på spillerens konto
int feltnr; //Hvad feltnumret er
int slag;
//Opretter en spiller
public Spiller(String navn, double konto)
{
this.navn = navn;
this.konto = konto;
this.feltnr = 0;
this.slag = (int) (Math.random()*6)+1;
}
//Besked til spilleren
public void besked(String besked)
{
System.out.println(navn+": "+besked);
}
//Ja/nej spørgsmål. Hvis brugeren svarer Ja, returnerer true, ellers false
public boolean spørgsmål(String spørgsmål)
{
String spm = navn+": Vil du "+spørgsmål+"?";
String svar = javax.swing.JOptionPane.showInputDialog(spm, "Ja");
System.out.println(spm+" "+svar);
if(svar != null && svar.equals("Ja")) return true;
else return false;
}
//Modtag penge
public void transaktion(double kr)
{
konto = konto + kr;
System.out.println(navn+"s konto lyder nu på "+konto+" kr");
}
//Overfør penge til anden spiller
public void betal(Spiller modtager, double kr)
{
System.out.println(navn+" betaler "+modtager.navn+": "+kr+" kr");
modtager.transaktion(kr);
transaktion(-kr);
}
public void tegn(Graphics g, int x, int y)
{
g.drawString(navn, x, y-15);
}
}
Matadorspil:
import java.util.*;
import javax.swing.*;
public class Matadorspil extends JPanel{
ArrayList<Felt> felter = new ArrayList<Felt>(); //Indeholder alle felter
ArrayList<Spiller> spillere = new ArrayList<Spiller>(); // Indeholder alle spillere
int spillersTur = 0;
public Matadorspil()
{
felter.add(new Start(3000));
felter.add(new Gade2("Andevej", 18000, 900, 1800));
felter.add(new Gade2("Ællingevej", 18000, 900, 1800));
felter.add(new Helle(10000));
felter.add(new Rederi2("Stenaline", 20000, 4500));
felter.add(new Bryggeri2("Carlsberg", 20000, 1000));
felter.add(new Gade2("Nygade", 15000, 700, 1500));
felter.add(new Gade2("Gammelgade", 15000, 700, 1500));
felter.add(new Gade2("Slåenhaven", 17000, 800, 1700));
felter.add(new Gade2("Kærsangervænget", 17000, 800, 1700));
felter.add(new Bryggeri2("Coca Cola", 30000, 1200));
felter.add(new Gade2("Rødovrevej", 10000, 400, 1000));
felter.add(new Gade2("Hvidovrevej", 10000, 400, 1000));
felter.add(new Rederi2("Maersk", 17000, 4200));
felter.add(new Gade2("Trianglen", 12000, 500, 1200));
felter.add(new Gade2("Bredgade", 12000, 500, 1200));
felter.add(new Gade2("Frederiksberg Allé", 20000, 1000, 2000));
felter.add(new Gade2("Rådhuspladsen", 25000, 1200, 2500));
}
}
BenytMatadorspil:
import javax.swing.*;
public class BenytMatadorspil extends JPanel{
public static void main(String[] args) {
Matadorspil spil = new Matadorspil();
//Opret spillere
spil.spillere.add(new Spiller("Kristian", 300000));
spil.spillere.add(new Spiller("Signe", 300000));
spil.spillere.add(new Spiller("Sofie", 300000));
MatadorGrafikpanel panel = new MatadorGrafikpanel(); // opret panelet
JFrame vindue = new JFrame("MatadorGrafikpanel"); // opret et vindue på skærmen
vindue.add(panel); // vis panelet i vinduet
vindue.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // reagér på luk
vindue.setSize(650,650); // sæt vinduets størrelse
vindue.setLocation(550, 150); //Placering på skærmen
vindue.setVisible(true); // åbn vinduet
spil.spillersTur=0;
//20 runder (40 ture)
while (spil.spillere.size()>1)
{
vindue.repaint();
System.out.println("Repaint");
//Skifter mellem spillerne
Spiller sp = spil.spillere.get(spil.spillersTur % spil.spillere.size());
//Kast terning
sp.slag = (int) (Math.random()*6)+1;
System.out.println("*****************************");
System.out.println(sp.navn+" er på felt "+sp.feltnr+" og slår "+sp.slag);
for(int i=1; i<=sp.slag; i++)
{
//Gå til næste felt. Hvis vi kommer over antal felter, så start forfra (0)
sp.feltnr = (sp.feltnr + 1) % spil.felter.size();
Felt felt = spil.felter.get(sp.feltnr);
if(i<sp.slag) felt.passeret(sp); //Kald passeret på passerede felter
else felt.landet(sp); // Kald landet på sidste felt
if (sp.konto <0)
{
int plads = spil.spillere.indexOf(sp);
spil.spillere.remove(plads);
System.out.println(sp.navn+" er ude, da personen gik konkurs");
}
if (spil.spillere.size()==1)
{
spil.spillersTur++;
sp = spil.spillere.get(spil.spillersTur % spil.spillere.size());
System.out.println("*****************************");
System.out.println(sp.navn+" har vundet spillet!");
System.out.println("*****************************");
}
try { Thread.sleep(300); } catch (Exception e) {} //Vent 0.3 sekunder
}
try { Thread.sleep(3000); } catch (Exception e) {} //Vent 3 sekunder
spil.repaint();
spil.spillersTur++;
}
}
}