Avatar billede jarret Nybegynder
13. november 2005 - 04:08 Der er 8 kommentarer og
1 løsning

Hvem gider tjekke vores program??

Det er nok ikke så let lige at over skue sammenhængen, men alle kommentarer og forslag til forbedringer har interesse  - evt. bare til enkelte klasser.
*********************************************************


import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import java.io.IOException;

public class Start extends JFrame implements ActionListener{

        JButton startGame, instruks;
        JPanel top;

        public void actionPerformed(ActionEvent evt)
        {
            if(evt.getSource()== startGame ){

            Model model = new Model();
            View view = new View(model);

            view.setSize(758, 580);
            view.setVisible(true);
            view.setDefaultCloseOperation(view.EXIT_ON_CLOSE);
            setVisible(false);

      }  else{
              remove(top);
              setTitle("Instruktioner");
        setSize(500, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        JTextArea text = new JTextArea();
        text.setEditable(false);


        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("instruks.txt")));

            String line;

            while((line = in.readLine()) != null) {
                text.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

            getContentPane().add(text);
            }
        }

    public Start() {
        setTitle("Traffic");
        setSize(500, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        top = new JPanel();

        ImageIcon billede = new ImageIcon("empire_ampel.jpg");
        JLabel icon = new JLabel(billede);
        top.add(icon);

        JPanel bund = new JPanel();
        startGame = new JButton("START");
        instruks = new JButton("Instruktioner");
        bund.add(startGame);
        bund.add(instruks);

        getContentPane().add(top, BorderLayout.NORTH);
        getContentPane().add(bund, BorderLayout.SOUTH);

        setVisible(true);

        startGame.addActionListener(this);
        instruks.addActionListener(this);
    }

    public static void main (String [] args) {

        Start frame = new Start();

    }
}

***********************************************************************************
import java.util.ArrayList;
import java.util.Random;

public class Model {
    boolean gameOver;
    int point;

    static final int POINT = 30;
    ArrayList biler = new ArrayList();
    Lyskryds lyskryds[] = new Lyskryds[6];

    public Model(){
    lyskryds[0] = new Lyskryds(new Placering(140,140));
    lyskryds[1] = new Lyskryds(new Placering(340,140));
    lyskryds[2] = new Lyskryds(new Placering(540, 140));
    lyskryds[3] = new Lyskryds(new Placering(140,340));
    lyskryds[4] = new Lyskryds(new Placering(340, 340));
    lyskryds[5] = new Lyskryds(new Placering(540,340));
    }

  public void rykAlle(){
      for(int i = 0; i < biler.size(); i++ ){
          Vehicle b = (Vehicle) biler.get(i);
          b.ryk = true;

          for(int j = 0; j < lyskryds.length; j++ )
          {
              b.tjekLyskryds(lyskryds[j]);
          }
          for(int j = 0; j < biler.size(); j++ )
          {
              if(j!=i){
              Vehicle vehicle = (Vehicle) biler.get(j);
              b.tjekCar(vehicle);
              }
          }
      b.ryk();
      }
    }
  public void addCar(){
        int i = getRandom();
        if (i == 1)biler.add(new CarNorth1());
        else if (i == 2)biler.add(new CarNorth2());
        else if (i == 3 )biler.add(new CarNorth3());
        else if (i == 4 )biler.add(new CarEast1());
        else if (i == 5)biler.add(new CarEast1());
        else if (i == 6)biler.add(new CarSouth1());
        else if (i == 7 )biler.add(new CarSouth2());
        else if (i == 8 )biler.add(new CarSouth3());
        else if (i == 9)biler.add(new CarWest1());
        else biler.add(new CarWest2());
    }

  public void addAmbulance(){
        int j  = getRandom();
        if (j < 3)biler.add(new AmbulanceWest1());
        else if (j > 2 || j < 6)biler.add(new AmbulanceWest2());
        else if (j > 5 || j < 9)biler.add(new AmbulanceEast1());
        else biler.add(new AmbulanceEast2());
    }

  public int getRandom(){
        Random rng = new Random();
        return  rng.nextInt(10) + 1;
    }

}

**********************************************************************************
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class View extends JFrame implements ActionListener {

    static int KNAPBREDDE = 60;
    static String KNAPBILLEDE = "kryds.gif";
    String dyt = "beepbeep.wav";
    String crash = "carcrach.wav";
    int tæller = 0;
    int frekvens = 50;

    Driver puls;
    Model model;
    JPanel vej, knapper;
    JButton knap1, knap2, knap3, knap4, knap5, knap6;

    public View(Model model) {

        this.model = model;

        puls= new Driver(this);
        puls.start();

        knapper = new JPanel();
        vej = new JPanel();

        vej.setLayout(null);
        knapper.setLayout(null);
        setLayout(null);

        vej.setBounds(0,0,758,555);
        knapper.setBounds(0,0,758,555);

        knap1 = new JButton("1", new ImageIcon(KNAPBILLEDE));
        knap1.setBounds(145,145,KNAPBREDDE,KNAPBREDDE);
        knap1.addActionListener(this);
        knapper.add(knap1);

        knap2 = new JButton("2",new ImageIcon(KNAPBILLEDE));
        knap2.setBounds(345,145,KNAPBREDDE,KNAPBREDDE);
        knap2.addActionListener(this);
        knapper.add(knap2);

        knap3 = new JButton("3",new ImageIcon(KNAPBILLEDE));
        knap3.setBounds(545,145,KNAPBREDDE,KNAPBREDDE);
        knap3.addActionListener(this);
        knapper.add(knap3);

        knap4 = new JButton("4",new ImageIcon(KNAPBILLEDE));
        knap4.setBounds(145,345,KNAPBREDDE,KNAPBREDDE);
        knap4.addActionListener(this);
        knapper.add(knap4);

        knap5 = new JButton("5",new ImageIcon(KNAPBILLEDE));
        knap5.setBounds(345,345,KNAPBREDDE,KNAPBREDDE);
        knap5.addActionListener(this);
        knapper.add(knap5);

        knap6 = new JButton("6",new ImageIcon(KNAPBILLEDE));
        knap6.setBounds(545,345,KNAPBREDDE,KNAPBREDDE);
        knap6.addActionListener(this);
        knapper.add(knap6);

        add(vej);
        add(knapper);
    }


    public void actionPerformed(ActionEvent e) {

// der trækkes 1 fra i fordi arrayet starter ved 0
      JButton knap = (JButton) e.getSource();
      int i = Integer.parseInt(knap.getLabel())  - 1;
      Thread t = new Thread(model.lyskryds[i]);
      t.start();
    }

    void draw(){

      vej.removeAll();
      for(int i = 0; i < model.lyskryds.length; i++ )
      {
        Lyskryds lyskurv = model.lyskryds[i];
        JLabel lyskryds = new JLabel("");
        String sbillede = "kryds" + lyskurv.kryds + ".gif";
        lyskryds.setIcon( new ImageIcon(sbillede) );
        lyskryds.setBounds(lyskurv.p.x-10, lyskurv.p.y, 92, 83);

        vej.add(lyskryds);
      }

      for(int i = 0; i < model.biler.size(); i++ ){
      Vehicle bil = (Vehicle) model.biler.get(i);
      JLabel bilLabel = new JLabel("");
      String billede = "bil"+ bil.billede + ".gif";
      bilLabel.setIcon( new ImageIcon(billede));
      bilLabel.setBounds(bil.x, bil.y, bil.width, bil.height);
      vej.add(bilLabel);
      }
        JTextField point = new JTextField("POINT : " + model.point);
        point.setBounds(680,10, 80, 20);
        vej.add(point);
        JLabel vejbillede = new JLabel("");
        vejbillede.setIcon(new ImageIcon("vej.jpg"));
        vejbillede.setBounds(0,0, 753, 552);
        vej.add(vejbillede);
        repaint();
    }

public void puls(){

      model.rykAlle();
      tæller ++;
                if(tæller > frekvens)
                {
                    model.addCar();
                    tæller = 0;
                    if(model.getRandom()== 3){
                        model.addAmbulance();                       
                    }
                }
    //Tjekker om bilerne er ude af spillebrættet
    tjekBoard();
    //data er ændret derfor klades draw
    draw();

}

  public void vundet(){

        JOptionPane.showMessageDialog(null, "Spillet er slut. Du opnåede " + model.point +
                " points.", "Nyt spil", JOptionPane.INFORMATION_MESSAGE);
        model.biler.clear();
        setVisible(false);
        puls.stop();
      }

  public void tjekBoard(){
      if (tjekVundet()){
          model.gameOver = true;
          vundet();
      }

      for(int i = 0; i < model.biler.size(); i++ ){
            Vehicle bil = (Vehicle) model.biler.get(i);
            if (bil.x < 0 || bil.x >850 || bil.y < 0 || bil.y >700){ model.biler.remove(i); model.point++;}
      }
    }

  public boolean tjekVundet(){
        if(model.point > model.POINT){
            return true;
        }
        else return false;
    }

    public void gameOver(){
              JOptionPane.showMessageDialog(null, "Game Over "
                , "Game over", JOptionPane.INFORMATION_MESSAGE);
       
        setVisible(false);
        puls.stop();

    }
}

***********************************************************************************

import java.awt.*;
import java.applet.AudioClip;
import java.applet.Applet;
import java.net.URL;

public abstract class Vehicle extends Rectangle {

    boolean ryk;
    String retning;
    String billede;
    int type;
   
  public Vehicle(){}

  public abstract void ryk();

  public abstract void tjekLyskryds(Lyskryds l);

  public boolean tjekCarSide(Placering p){
      return false;
  }

  public abstract boolean tjek(Vehicle vehicle);

  public abstract void queue();
  public abstract void crash();


  public void Sound(String file){
        AudioClip testClip;
        try{
            testClip= Applet.newAudioClip(new URL("file:" + file));
            testClip.play();
        }catch(Exception e){
            System.out.println(e.toString());
        }
    }

    //themplate metode
  public void tjekCar(Vehicle vehicle){

    if(tjek(vehicle)){

      if(vehicle.retning.equals(retning)){
      //hook metode
          queue();
      }
      else crash();
  }

  }
}
***********************************************************************************

import java.util.Random;

public abstract class Car extends Vehicle {

    final static int AFSTANDMELLEMBILER = 8;
    final static int BILLÆNGDE = 38;
    final static int BILBREDDE = 20;
    int SPEED = 2;

    //skal ikke implementeres i sub klasser når den er her
  public void queue(){
        ryk = false;
    }

  public void crash(){
      ryk = false;
      Sound("beepbeep.wav");
  }
public int getRandom(){
        Random rng = new Random();
        int i = rng.nextInt(10) + 1;
        if (i == 1|| i == 2 || i == 3)return 1;
        else if (i == 4|| i == 5 )return 2;
        else if (i == 6|| i == 7 || i == 8)return 3;
        else return 4;
    }

}
*************************************************************************************

public abstract class Ambulance extends Vehicle{
    View view;
    boolean wrongside = false;
    final static int AFSTANDMELLEMBILER = 30;
    final static int BILLÆNGDE = 50;
    final static int BILBREDDE = 24;
    final static int SPEED = 4;

  public Ambulance(){

      Sound("ambulancelip36.wav");
      height = BILBREDDE;
      width = BILLÆNGDE;
  }

  protected int jump;
  public void queue(){
    if(wrongside) y +=jump;
        else y -=jump; wrongside = true;
    }

  public void crash(){
      Sound("carcrash.wav");
      view.gameOver();
  }


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


public abstract class AmbulanceWest extends Ambulance {

        int AFSTANDMELLEMBILER = 30;
        int BILLÆNGDE = 50;
        int BILBREDDE = 24;

        public AmbulanceWest(){
       
        jump = 25;
        retning = "h";
        billede = "westambulance";
        }

    public void ryk(){
      if(ryk) x += SPEED;
    }

    public void tjekLyskryds(Lyskryds l){ }

    public boolean tjek(Vehicle vehicle){
            return (new Rectangle(x + BILLÆNGDE, y, AFSTANDMELLEMBILER, BILBREDDE).intersects(vehicle));
    }
}

class AmbulanceWest1 extends AmbulanceWest {

    public AmbulanceWest1(){
        x = 0; y = 377;
    }
}

class AmbulanceWest2 extends AmbulanceWest {

    public AmbulanceWest2(){
        x = 0; y = 176;
    }
}

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


public abstract class AmbulanceEast extends Ambulance {

        public AmbulanceEast(){
        this.view = view;
        //initialiseres her fordi(den kan ikke uden for)
        jump = -25;
        retning = "h";
        billede = "eastambulance";

    }

  public void ryk(){
      if(ryk) x -= SPEED;
    }

    public void tjekLyskryds(Lyskryds l){}

    public boolean tjek(Vehicle vehicle){
        return (new Rectangle(x - AFSTANDMELLEMBILER, y, AFSTANDMELLEMBILER,  BILBREDDE).intersects(vehicle));

    }
}

class AmbulanceEast1 extends AmbulanceEast {

    public AmbulanceEast1(){
  x = 755; y = 153;
    }
}

class AmbulanceEast2 extends AmbulanceEast {

    public AmbulanceEast2(){
    x = 755 ; y = 354;
    }
}

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

public abstract class CarNorth extends Car {

    public CarNorth(){

        height = BILLÆNGDE;
        width = BILBREDDE;
        retning = "v";
        billede = getRandom() + "north";
    }

  public void ryk(){
      if(ryk)y += SPEED;
    }

    public void tjekLyskryds(Lyskryds l){

      if(l.tilstand == 2 && l.north.contains(x, y+BILLÆNGDE))ryk = false;
    }

    public boolean tjek(Vehicle vehicle){
        return (new Rectangle(x, y + BILLÆNGDE, BILBREDDE, AFSTANDMELLEMBILER).intersects(vehicle));
    }
}

class CarNorth1 extends CarNorth {
   
    public CarNorth1(){
    x =154;
    y = 0;
    }
}

class CarNorth2 extends CarNorth {

    public CarNorth2(){
    x =354;
    y = 0;
    }
}
class CarNorth3 extends CarNorth {

    public CarNorth3(){
    x =555;
    y = 0;
    }
}

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


public class CarEast extends Car {


    public CarEast(){


        height = BILBREDDE;
        width = BILLÆNGDE;

        retning = "h";
        billede = getRandom() + "east" ;
    }

  public void ryk(){
      if(ryk) x -= SPEED;

    }

    public void tjekLyskryds(Lyskryds l){

      if(l.tilstand ==1 && l.east.contains(x, y))ryk = false;
    }

    public boolean tjek(Vehicle vehicle){

        return (new Rectangle(x - AFSTANDMELLEMBILER, y, AFSTANDMELLEMBILER,  BILBREDDE).intersects(vehicle));
    }
}

class CarEast1 extends CarEast {

    public CarEast1(){
    x = 755; y = 153;
    }
}

class CarEast2 extends CarEast {

    public CarEast2(){
    x = 755 ; y = 354;
    }
}

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


public class CarSouth extends Car {

    public CarSouth(){
        height = BILLÆNGDE;
        width = BILBREDDE;
        retning = "v";
        billede =getRandom() + "south";
    }

public void ryk(){
      if(ryk) y -= SPEED;
    }

    public void tjekLyskryds(Lyskryds l){
      if(l.tilstand ==2 && l.south.contains(x, y))ryk = false;
    }

    public boolean tjek(Vehicle vehicle){
        return (new Rectangle(x, y-AFSTANDMELLEMBILER, BILBREDDE, AFSTANDMELLEMBILER).intersects(vehicle));
    }
}

class CarSouth1 extends CarSouth {

    public CarSouth1(){
    x =582;
    y = 560;
    }
}

class CarSouth2 extends CarSouth {

    public CarSouth2(){
    x =379;
    y = 560;
    }
}
class CarSouth3 extends CarSouth {

    public CarSouth3(){
    x =179;
    y = 560;
    }
}
*************************************************************************************


import java.awt.*;


public class CarWest extends Car {


    public CarWest(){

        height = BILBREDDE;
        width = BILLÆNGDE;

        retning = "h";
        billede = getRandom() + "west";
    }

    public void ryk(){
      if(ryk) x += SPEED;

    }

    public void tjekLyskryds(Lyskryds l){
      if(l.tilstand ==1 && l.west.contains(x + BILLÆNGDE, y))ryk = false;
    }

  public boolean tjek(Vehicle vehicle){
        return (new Rectangle(x + BILLÆNGDE, y, AFSTANDMELLEMBILER,  BILBREDDE).intersects(vehicle));
    }

}

class CarWest1 extends CarWest {

    public CarWest1(){
    x = 0; y = 379;
    }
}

class CarWest2 extends CarWest {

    public CarWest2(){
    x = 0; y = 178;
    }
}
Avatar billede Slettet bruger
13. november 2005 - 06:09 #1
Bare en kommentar omkring nedarvning af Car og mere specifikt CarEase, ..West, ..South og så videre.

Så vidt jeg lige kan se er en eneste forskel på disse typer deres attributter, som i sætter i constructor. En mere hensigtsmæssig måde ville være at have noget factory, som kunne lave biler med de nødvendigt attributter og måske simplere endnu lav en constructor på Car, som har de nødvendigt parametre på den måde kan der vel skabes.

Et lille eksempel, som du kan arbejde videre, men som illustrerer problemet på et afgrænset og let forståeligt plan.  CarWest1 og CarWest2 er alle specialiseringer af CarWest, men i virkeligheden burde det ikke være specieliseringer men blot instanser af CarWesh skabt med forskellige attributter. Hvis CarWest's constructor havde to parametre x og y CarWest(int x, int y) så kunne CarWest1 og CarWest2 skabes som følger:

CarWest carwest1 = new CarWest(0, 379);
CarWest carwest2 = new CarWest(0, 178);

Ovenstående kan givet hæves til et højere niveau i dit program, men det må du selv klare :)
Avatar billede Slettet bruger
13. november 2005 - 10:20 #2
Nu er jeg lidt doven så kan du ikke ligge et link til et par java filer, så vil jeg godt give det et forsøg
Avatar billede jarret Nybegynder
13. november 2005 - 11:54 #3
maximus det ville være cool www.k2b.dk/java
Avatar billede jarret Nybegynder
13. november 2005 - 12:00 #4
kryptos der er egentlig med vilje at jeg har extendet carverdenshjørne klasserne.

men det kan godt være at det er lidt overkill, jeg syntes bare det gør det mere overskueligt + at jeg nemmere kan finde frem til hvilket objekt jeg har med at gøre når jeg gennemløber arraylisten.
Avatar billede Slettet bruger
13. november 2005 - 16:30 #5
Det er, hvis jeg skal være meget direkte, en design fejl og ikke overkill. Det er ikke meningen arv skal anvendes på den måde. Simpelt eksempel hvad hvis programmet skal bruge 800 biler vil du så lave 800 nedarvninger? Nej det vil du selvfølgelig ikke.
Avatar billede jarret Nybegynder
13. november 2005 - 17:41 #6
du skal være direkte (0:

du har nok ret men jeg tror du skal ses spillet for at være helt sikker. Klasser er ikke singelton klasser, jeg opretter mange objekter af feks. CarWest1. og jeg har nogle steder brug for at teste om bilerne er af samme type..det gjorde jeg tidligere med en if(bil.x == bil2.x) så.... det syntes jeg bare var lidt utjekket, da det jeg skulle vide var om de var af samme type..
Avatar billede arne_v Ekspert
14. november 2005 - 15:29 #7
1)

enten skal i konsekvent importere * eller så skal i kun importere bestemte klasser

det anses normalt som pænest kun at importere bestemte klasser

men uanset hvad bør man være konsistent

2)

    public int getRandom(){
        Random rng = new Random();
        return  rng.nextInt(10) + 1;
    }

er gruelig gal

    private Random rng = new Random();
    public int getRandom(){
        return  rng.nextInt(10) + 1;
    }

(læs mine artikler om random generatorer for forklaring)

3)

load jeres billeder så de kan loades både fra disk fil og fra jar fil

4)

brug engelsk eller dansk - ikke begge dele

tjekCar lyder fjollet

5)

i addCar ville jeg nok bruge tallet til at slå op i et array og lave en
instans med Class.forName(car[i]).newInstance()

og getRandom skulle måske have et argument som angav range

6)

jeg kan ikke lide de ens konstanter i 2 klasser på samme niveau, en abstrakt metode
i parent klassen og forskellige implementationer var mere OOP

7)

jeg kan ikke lide at subklasser i deres constructor sætter protected fields
i deres grand grand parent klasse

sende de værdier gennem parent constructorerne

meget pænere OOP
Avatar billede jarret Nybegynder
12. december 2005 - 17:58 #8
tak for kommentarene lægger du et svar arne
Avatar billede arne_v Ekspert
12. december 2005 - 18:08 #9
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester