Archief - Project JAVA Slangen en Ladders enkele vragen hierover

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

BlackDevil-619

Legacy Member
Hey forumleden,

Als periode opdracht moeten we een spel maken, samen met men partner hebben we Slangen & Ladders.
Ik zit momenteel redelijk vast bij volgende punten.
Even een kleine toelichting op voorhand, het gehele project moet gemaakt worden volgens het modelview principe.

- De klasse pion laten erven van de klasse speler, waarbij de spelers variëren van 2 tot 4 dus ook de pion en aan iedere pion op voorhand een bepaalde kleur aan vast hangt.
Daarbij zitten we momenteel ook met het probleem dat er in de run klasse verwacht wordt een cijfer mee te geven van het aantal pionnen.
Code:
public class Spel {

    private LinkedList<Speler> spelers;
    private Speler aanZetSpeler;
    private boolean gedaan = false;
    int huidigPionNummer = 1;

    private Pion[] pionnen;

    public Spel(int aantalPionnen){
        pionnen = new Pion[aantalPionnen];

        for (int i = 0; i < aantalPionnen; i++) {
            pionnen[i] = new Pion();
        }
    }

    public Pion geefHuidigePion ()
    {	return pionnen[huidigPionNummer];
    }
    public void resetSpel(){
        spelers.clear();
        gedaan= false;
    }
    public void maakSpeler(String naam,Pion pion){//speler aanmaken
     Speler speler = new Speler();
      spelers.add(0,speler);
    }

    public int gooien(){//dobbelsteen gooien
        return Dobbelsteen.werpDobbelsteen();
    }

    public int[][] maakBord(){
      SpelBord bord= new SpelBord();
       return bord.getBord();
    }
}
Code:
 public class Speler {
    ArrayList<Speler> spelers = new ArrayList<Speler>();
    private String naam;
    //private Pion pion;

   /* public Speler(String naam,Pion pion){
        this.pion=pion;
        this.naam=naam;
    }*/
   public String toString(){
        return naam;
    }
    public String getNaam(){
        return naam;
    }
    public void SetNaam(){
        this.naam=naam;
    }
}
Code:
public class Pion {
    public int positie = 1;
    private Icon afbeeldingpion;
    private String[] kleuren = {"Rood", "Blauw", "Geel", "Groen"};
//TODO: pion maken + laten werken

    public class maakPion {

        protected int positie;

        public maakPion(int kleur, int positie) {
            this.positie = positie;
        }

        public void verplaatsNaar(int nieuwePositie) {
            positie = +nieuwePositie;
        }
    }

    public String getkleuren(int kleur) {
        return kleuren[kleur];
    }

    public int getPositie() {
        return this.positie;
    }//positie van pion ophalen

    public void setPositie(int nieuwePositie) {
        this.positie = nieuwePositie;
    }
}
Code:
public class Dobbelsteen {
    private static final Random random = new Random();

    public static int werpDobbelsteen() {
        return random.nextInt(6) + 1;
    }
}
Code:
public class RunSpel {
    public static void main(String[] args) {
        Spel spel= new Spel(4);
        new StartScherm(spel);
    }
}
Code:
public class SpelBord {
    private static int bord[][] = {
            {100, 99, 98, 97, 96, 95, 94, 93, 92, 91},
            {81, 82, 83, 84, 85, 86, 87, 88, 89, 90},
            {80, 79, 78, 77, 76, 75, 74, 73, 72, 71},
            {61, 62, 63, 64, 65, 66, 67, 68, 69, 70},
            {60, 59, 58, 57, 56, 55, 54, 53, 52, 51},
            {41, 42, 43, 44, 45, 46, 47, 48, 49, 50},
            {40, 39, 38, 37, 36, 35, 34, 33, 32, 31},
            {21, 22, 23, 24, 25, 26, 27, 28, 29, 30},
            {20, 19, 18, 17, 16, 15, 14, 13, 12, 11},
            {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
    };

    public int[][] getBord() {
        return bord;
    }
}

- Ook moet het hele spel grafisch zijn en eigenlijk ook enkel werken in de view.
Daarbij zitten we met het probleem dat de buttons die we momenteel hebben op ons start scherm.
De knoppen hangen bovenaan en zouden we eigenlijk op maat moeten kunnen plaatsen op het startscherm.
Dit door middel van een afbeelding van hoe de knop er moet uitzien op de knop te plaatsen
Code:
public class StartScherm extends JFrame {

    private JButton tweeSpelers;
    private JButton info;
    private JButton drieSpelers;
    private JButton vierSpelers;
    private JLabel afbeeldingTitel;
    private JPanel knoppen;
    private Spel controller;

    public StartScherm(Spel controller) {
        this.controller = controller;
        initialiseerComponenten();
        layoutComponenten();
        maakeventhandlers();
        toonFrame();
        setSize(800, 800);
    }

    private void initialiseerComponenten() {
        tweeSpelers = new JButton("Twee Spelers");
        drieSpelers = new JButton("Drie Spelers");
        vierSpelers = new JButton("Vier Spelers");
        info = new JButton("Info");
        afbeeldingTitel = new JLabel();
        knoppen = new JPanel(new FlowLayout());
    }

    private void layoutComponenten() {
        add(afbeeldingTitel, BorderLayout.CENTER);
        add(knoppen, BorderLayout.CENTER);
        JPanel pnl = new JPanel();
        pnl.add(knoppen.add(info));
        pnl.add(knoppen.add(tweeSpelers));
        pnl.add(knoppen.add(drieSpelers));
        pnl.add(knoppen.add(vierSpelers));
        add(pnl, BorderLayout.CENTER);
    }

    //TODO: spelers aanmaken bij drukken op de knop + defaultcloseoperation op tweede frame zetten
    private void maakeventhandlers() {
        tweeSpelers.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                SpelScherm scherm = new SpelScherm(controller);//open het spelscherm voor tweespelers
                scherm.setVisible(true);


            }
        });
        drieSpelers.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                SpelScherm scherm = new SpelScherm(controller);//open het spelscherm voor driespelers
                scherm.setVisible(true);

            }
        });
        vierSpelers.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                SpelScherm scherm = new SpelScherm(controller);//open het spelscherm voor vierspelers
                scherm.setVisible(true);

            }
        });
        info.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Info info = new Info();
                info.setVisible(true);
            }
        });
    }

    private void toonFrame() {

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(this); //centreren op scherm
        setVisible(true);
    }
}

- Op het spelscherm zitten we met het probleem dat we geen horizontale lijnen krijgen om een overzicht te houden tussen de vakken.
Ook wilden we de 4 spelers telkens in een hoek zetten, een icoontje van een pion met daarnaast hun opgegeven naam. In het midden wilde we een afbeelding frame plaatsen dat een afbeelding toont van de geworpen zijde van een dobbelsteen.
Het grootste probleem momenteel is eigenlijk hoe we onze slangen en ladders op het spelbord moeten plaatsen. Wij hebben afbeeldingen, maar nu is de vraag hoe we deze op het spelbord moeten plaatsen.
Code:
public class SpelScherm extends JFrame {
    private JPanel knoppen;
    private JButton gooiDobbelsteen;
    private JButton stop;
    private JLabel dobbelsteen;
    private JLabel speler1;
    private JLabel speler2;
    private JLabel speler3;
    private JLabel speler4;
    private Spel controller;
    private static final int AANTAL = 10;
    private JLabel[][] vakjes = new JLabel[AANTAL][AANTAL];

    public SpelScherm(Spel controller) {
        super("Slangen en Ladders");
        this.controller = controller;
        initialiseerComponenten();
        layoutComponenten();
        maakeventhandlers();
        toonFrame();
        setSize(800, 800);
    }
    private void initialiseerComponenten() {

        gooiDobbelsteen = new JButton("Gooi Dobbelsteen");
        stop = new JButton("stop het programma");
        //TODO:ervoor zorgen dat afbeelding van dobbeslteen in de label voorkomst
        speler1 = new JLabel("Speler 1");
        speler2 = new JLabel("Speler 2");
        speler3 = new JLabel("Speler 3");
        speler4 = new JLabel("Speler 4");
        dobbelsteen = new JLabel();
        knoppen = new JPanel(new FlowLayout());
        //bord aanmaken moet er nog voor zorgen dat even en oneven een andere kleur krijgen
        for (int i = 0; i < controller.maakBord().length; i++) {
            for (int j = 0; j < controller.maakBord()[i].length; j++) {
                vakjes[i][j] = new JLabel();
                vakjes[i][j].setText(String.valueOf(controller.maakBord()[i][j]));
                System.out.println(vakjes[i][j].getText());
            }
        }
    }
    private void layoutComponenten() {
        JPanel rechterPanel = new JPanel(new BorderLayout(10, 10));
        JPanel spelers = new JPanel(new GridLayout(7, 2, 10, 10));
        spelers.add(speler1, BorderLayout.EAST);
        spelers.add(speler2, BorderLayout.EAST);
        spelers.add(speler3, BorderLayout.EAST);
        spelers.add(speler4, BorderLayout.EAST);
        spelers.add(dobbelsteen, BorderLayout.EAST);
        JPanel center = new JPanel(new GridLayout(10, 10, 0, 0));//
        //labels in bord zetten plus achtergrond geven
        for (int i = 0; i < controller.maakBord().length; i++) {
            for (int j = 0; j < controller.maakBord()[i].length; j++) {
                if ((j % 2) == 0) {
                    System.out.println(j);
                    vakjes[i][j].setBackground(Color.ORANGE);
                    vakjes[i][j].setOpaque(true);
                    center.add(vakjes[i][j]);
                } else {
                    vakjes[i][j].setBackground(Color.YELLOW);
                    vakjes[i][j].setOpaque(true);
                    center.add(vakjes[i][j]);
                }
            }
        }
        JPanel pnl = new JPanel();
        add(pnl, BorderLayout.CENTER);

        JPanel knoppenPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        knoppenPanel.add(gooiDobbelsteen);
        knoppenPanel.add(stop);

        rechterPanel.add(knoppenPanel, BorderLayout.SOUTH);
        rechterPanel.add(spelers, BorderLayout.NORTH);
        add(rechterPanel, BorderLayout.EAST);
        add(center, BorderLayout.CENTER);
    }

    //TODO:spelers aanmaken(for loop)
    private void maakeventhandlers() {
        gooiDobbelsteen.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controller.gooien();
                dobbelsteen.setText(String.valueOf(controller.gooien()));
            }
        });
        stop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
    }

    private void toonFrame() {
        // pack();
        setLocationRelativeTo(this); //centreren op scherm
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

Bedankt voor mee met ons te denken.

eniac

Legacy Member
Mijn Java is ondertussen wat roestig na een paar jaar niet meer te programmeren, maar uw domeinklassen zien er mij op zich al raar uit. Enkele snelle opmerkingen:
- Waarom heeft uw Speler klasse een arraylist van Spelers?
- Pion: Waarom werk je met een String array voor je kleuren die je in je Pion-klasse definieert? Kleur lijkt me gewoon een property van je pion, ik zou eerder een externe Enum definieren met toegelaten kleuren en ik zou als property een Color gebruiken ipv een String
- Pion: waarom die innerklasse? Ik zie daar geen nut voor. Lijkt me nodeloos moeilijker maken.
- Algemeen: je naamgeving is verwarrend. "speler1" is een logische naam voor een speler, niet voor een label. Als je een label wil maken voor een speler, noem dat dan "speler1Label" of iets dergelijks. Wees consequent in dat soort naamgevingen, dat maakt het je een pak gemakkelijker.
- Algemeen: denk na over je access modifiers. Bvb. "positie" in de Pion-klasse, die hoort private te zijn. Toegang tot properties doe je via getters & setters.

Niets van het bovenste lost natuurlijk je pertinente vragen op. Qua layouting van je buttons kijk je mogelijk best naar een andere layout manager - GridBagLayout bvb is voor zover ik weet een stuk flexibeler dan een BorderLayout.
Andere zaken ga je op specialisten ter zake moeten wachten :)

Emerxill

Legacy Member
Ik ga het mij beklagen dat ik eraan begonnen ben :) Eerst en vooral wil ik effe meegeven dat ik absoluut geen Swing specialist ben.

BlackDevil-619 zei:
De klasse pion laten erven van de klasse speler, waarbij de spelers variëren van 2 tot 4 dus ook de pion en aan iedere pion op voorhand een bepaalde kleur aan vast hangt.
Daarbij zitten we momenteel ook met het probleem dat er in de run klasse verwacht wordt een cijfer mee te geven van het aantal pionnen.
Uw Pion extend ("erft over") toch niet van Speler? En dat mag ook niet. Een Speler moet een Pion hebben staat ook zo in comments in je code. Ik persoonlijk zou dat Speler in Pion in 1 object steken "Speler".
Uw probleem dat je een cijfer moet meegeven aan RunSpel wordt daarmee al voor een deel opgelost. (ik zou RunSpel SpelRunner, SpelStarter,... werkwoorden, -het doet iets- noemen). Het de waarde wat daar moet komen van de "handler/listener" die achter de knoppen "tweeSpelers", "drieSpelers", ... zit. Op het eerste zicht zou ik een aparte listener achter elke knop steken (maar hier ontbreekt mij de ervaring in Swing) die dan Spel oproept met het juiste aantal spelers. Spel zou ik trouwens "SpelController" noemen.
In uw controller hoort ook geen "state" zoals spelers, aanZetSpeler, gedaan, ... . Dat hoort thuis in een model-object (bijv. "SpelStatus" ofzoiets).

BlackDevil-619 zei:
- Op het spelscherm zitten we met het probleem dat we geen horizontale lijnen krijgen om een overzicht te houden tussen de vakken.
Ook wilden we de 4 spelers telkens in een hoek zetten, een icoontje van een pion met daarnaast hun opgegeven naam. In het midden wilde we een afbeelding frame plaatsen dat een afbeelding toont van de geworpen zijde van een dobbelsteen.
Het grootste probleem momenteel is eigenlijk hoe we onze slangen en ladders op het spelbord moeten plaatsen. Wij hebben afbeeldingen, maar nu is de vraag hoe we deze op het spelbord moeten plaatsen.
Uw grootste probleem hier is uw 2 dimensionale array, die maar 1 element heeft voor de 1e dimensie. Ik heb geen idee wat daar het nut van is.
Ook het maken van uw bord wordt 3x opgeroepen in een nested for-loop. Dat zijn héél veel instanties SpelBord. Daar is nog serieus wat werk aan. Daarvoor zul je bij je docent moeten langsgaan. Want dat krijg ik hier niet uitgelegd :)
Ivm uw slangen en ladders: met afbeeldingen alleen ga je er niet geraken. Aangezien je spreekt van afbeeldingen wil dat zeggen dat je ladders en slangen statisch zullen zijn (dus niet voor elk spel ander gegenereerd).
Dat wil zeggen dat je in 2 stappen te werk zal moeten gaan:
1. de afbeeldingen op je spelbord plaatsen
2. een array voor elke slang en ladder waarin bijgehouden wordt welke cellen er gekoppeld zijn per slang/ladder.

Met die array ga je dan kunnen controleren hoe de pionnen naar de het juiste vakje kunnen "glijden". Daar gaat een mooi algoritme achter zitten. Hopelijk kan je docent je hiermee helpen (het zal moeten aangezien hij/zij je die opdracht heeft gegeven).
Ik kan dat alleszins niet langs deze weg uitleggen :)

Succes!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan