Java Dobbelsteen Gooien HELP

Status
Niet open voor verdere reacties.

Timmy Ownage

Gebruiker
Lid geworden
11 jan 2008
Berichten
60
Ik heb de volgende code:
Code:
package java1;

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

public class Applet17 extends Applet
  implements ActionListener {
    Button rol;
    TextField uitkomst;

  public void init() {
    setBackground(Color.yellow);
    rol = new Button("Rol...");
    rol.addActionListener(this);
    uitkomst = new TextField(10);
    add(rol);
    add(uitkomst);
  }

  public void paint(Graphics g) {
    tekenogen(g);
    g.drawRect(150,50,50,50);
  }

  int gooien() {
    double g;
    int ogen;
    g = Math.random();
    g *= 6;
    g += 1;
    ogen = (int) g;
    return ogen;
  }

  public void actionPerformed(ActionEvent e) {
    if(e.getSource() == rol) {
      int ogen;
      ogen = gooien();
      uitkomst.setText("Ogen = " + ogen);
    }
  }

  void tekenogen(Graphics g) {
    if(gooien() == 1) {
      g.fillOval(140,50,12,12);
      repaint();
    }
    if(gooien() == 2) {
      g.fillOval(140,60,12,12);
      repaint();
    }
    if(gooien() == 3) {
      g.fillOval(140,50,12,12);
      repaint();
    }
    if(gooien() == 4) {
      g.fillOval(140,50,12,12);
      repaint();
    }
    if(gooien() == 5) {
      g.fillOval(140,50,12,12);
      repaint();
    }
    if(gooien() == 6) {
      g.fillOval(140,50,12,12);
      repaint();
    }
  }
}

Het doel van het script is dat je op een knop drukt en dan komt er in een tekstvak de gegooide waarde (1-6) te staan. Verder moet het ook afgebeeld worden. In paint() heb ik de omtrek van de dobbelsteen getekend. Nu moet hij verder ALS het aantal ogen bijvoorbeeld 1 is, ook 1 oog in de dobbelsteen tekenen. Ik heb momenteel overal 1 oog, maar dit breid ik uit zodra ik weet hoe het moet ... Ik zit echt helemaal vast! Ik kom maar niet uit hoe ik het aantal ogen kan laten tekenen dat gegooid is.
Hopelijk kan iemand me hierbij helpen!
 
Kan je niet beter 6 plaatjes maken en dus aan de hand van wat er gegooid is een plaatje van de steen in je panel zetten?
 
Kan je, maar dat is niet helemaal de vraag natuurlijk :).

'k Heb me er even mee geamuseerd:
Code:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet17 extends Applet
implements ActionListener {
	private Button rol;
	private TextField uitkomst;
	private int ogen;
	private final static int DIE_X = 150;
	private final static int DIE_Y = 50;
	private final static int DIE_SIZE = 60;

	public void init() {
		setSize(320, 240);
		setBackground(Color.yellow);
		rol = new Button("Rol...");
		rol.addActionListener(this);
		uitkomst = new TextField(10);
		add(rol);
		add(uitkomst);
	}

	public void paint(Graphics g) {
		g.drawRect(DIE_X, DIE_Y, DIE_SIZE, DIE_SIZE);
		tekenogen(g);
		
		// testje - zet uit commentaar om grid te zien
		/*for(int i = 0; i < 3; i++) {
			for(int j = 0; j < 3; j++)
				g.drawRect(DIE_X + 20 * i, DIE_Y + 20 * j, 20, 20);
		}*/
	}

	private int gooien() {
		double g = Math.random() * 6 + 1;
		return (int)g;
	}

	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == rol) {
			ogen = gooien();
			uitkomst.setText("Ogen = " + ogen);
			repaint();
		}
	}
	
	private void tekenOog(Graphics g, int x, int y) {
		int vakGrootte = (int)(DIE_SIZE / 3.0); // dobbelsteen kan je in 9 verdelen, vb 60x60 / 3 => 9 keer 20x20
		int oogGrootte = (int)(vakGrootte / 2.0);
		int oogOffset = (int)((vakGrootte - oogGrootte) / 2.0); // offset voor positionering in het midden van een vak
		int posX = DIE_X + x * vakGrootte + oogOffset;
		int posY = DIE_Y + y * vakGrootte + oogOffset;
		g.fillOval(posX, posY, oogGrootte, oogGrootte);
	}

	private void tekenogen(Graphics g) {
		if(ogen > 1) {
			tekenOog(g, 0, 0);
			tekenOog(g, 2, 2);
		}
		if(ogen % 2 == 1)
			tekenOog(g, 1, 1);
		if(ogen > 3) {
			tekenOog(g, 2, 0);
			tekenOog(g, 0, 2);
		}
		if(ogen == 6) {
			tekenOog(g, 1, 0);
			tekenOog(g, 1, 2);
		}
	}
}

Opmerkingen:
- je bepaalt een random getal voor het gooien met de methode gooien(), maar bij het tekenen (tekenogen) roep je dan nog eens gooien() aan, waardoor je een ander getal kan krijgen! Niet alleen dat, je roept het *6* keer aan ;). Je kan het oplossen door een klassevariabele 'ogen' toe te voegen, die in te stellen in je actionPerformed() en te lezen in tekenogen().
- je roept vanuit paint tekenogen op, wat repaint aanroept, wat tekenogen oproept, wat... je begrijpt het probleem wel. De aanroep naar repaint() moet inderdaad gebeuren na het instellen van ogen, maar het moet bijvoorbeeld in de actionPerformed() methode, niet in paint() of een methode die aangeroepen wordt door paint(), dat veroorzaakt een oneindige lus.
- het tekenen zelf: je kan het jezelf makkelijk maken. Uiteindelijk zijn er maar 9 mogelijke posities voor een bolletje op een dobbelsteen, teken eens uit welk aantal ogen er bij elk bolletje kan voorkomen en je bekomt een viertal regeltjes: linksboven en rechtsonder voor > 1, midden voor 1-3-5, rechtsboven en linksonder voor > 3 en midden boven en midden onder voor 6. Gewoon uittekenen, je ziet het wel.
- je kan het dan nog eens gemakkelijker maken voor jezelf door een aparte methode te maken die een bolletje tekent in één van die 9 vakjes. Je hebt een x en y-positie voor je dobbelsteen en je weet hoe groot die is, dus je kan de grootte van één vakje en een bolletje berekenen en die mooi in het midden plaatsen. Je hoeft dan alleen nog maar een cijfer van 0 tem 2 mee te geven voor x en y om in een bepaald vak een bolletje te zetten.
- er zijn bepaalde zaken die ik toegevoegd heb maar die je mag 'vereenvoudigen' met zaken die je zelf gezien hebt, als het een opdracht is voor een cursus of voor school (Applet17?) kan ik me voorstellen dat je die wil vermijden. Constanten (private final static int) mag je vervangen door overal de waarde zelf, de ogen % 2 == 1 (= modulo 2) mag je vervangen door ogen == 1 || ogen == 3 || ogen == 5. Je ziet maar ;).

Hope this helps.
 
Laatst bewerkt:
Kan je, maar dat is niet helemaal de vraag natuurlijk :).

'k Heb me er even mee geamuseerd:
Code:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet17 extends Applet
implements ActionListener {
	private Button rol;
	private TextField uitkomst;
	private int ogen;
	private final static int DIE_X = 150;
	private final static int DIE_Y = 50;
	private final static int DIE_SIZE = 60;

	public void init() {
		setSize(320, 240);
		setBackground(Color.yellow);
		rol = new Button("Rol...");
		rol.addActionListener(this);
		uitkomst = new TextField(10);
		add(rol);
		add(uitkomst);
	}

	public void paint(Graphics g) {
		g.drawRect(DIE_X, DIE_Y, DIE_SIZE, DIE_SIZE);
		tekenogen(g);
		
		// testje - zet uit commentaar om grid te zien
		/*for(int i = 0; i < 3; i++) {
			for(int j = 0; j < 3; j++)
				g.drawRect(DIE_X + 20 * i, DIE_Y + 20 * j, 20, 20);
		}*/
	}

	private int gooien() {
		double g = Math.random() * 6 + 1;
		return (int)g;
	}

	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == rol) {
			ogen = gooien();
			uitkomst.setText("Ogen = " + ogen);
			repaint();
		}
	}
	
	private void tekenOog(Graphics g, int x, int y) {
		int vakGrootte = (int)(DIE_SIZE / 3.0); // dobbelsteen kan je in 9 verdelen, vb 60x60 / 3 => 9 keer 20x20
		int oogGrootte = (int)(vakGrootte / 2.0);
		int oogOffset = (int)((vakGrootte - oogGrootte) / 2.0); // offset voor positionering in het midden van een vak
		int posX = DIE_X + x * vakGrootte + oogOffset;
		int posY = DIE_Y + y * vakGrootte + oogOffset;
		g.fillOval(posX, posY, oogGrootte, oogGrootte);
	}

	private void tekenogen(Graphics g) {
		if(ogen > 1) {
			tekenOog(g, 0, 0);
			tekenOog(g, 2, 2);
		}
		if(ogen % 2 == 1)
			tekenOog(g, 1, 1);
		if(ogen > 3) {
			tekenOog(g, 2, 0);
			tekenOog(g, 0, 2);
		}
		if(ogen == 6) {
			tekenOog(g, 1, 0);
			tekenOog(g, 1, 2);
		}
	}
}

Opmerkingen:
- je bepaalt een random getal voor het gooien met de methode gooien(), maar bij het tekenen (tekenogen) roep je dan nog eens gooien() aan, waardoor je een ander getal kan krijgen! Niet alleen dat, je roept het *6* keer aan ;). Je kan het oplossen door een klassevariabele 'ogen' toe te voegen, die in te stellen in je actionPerformed() en te lezen in tekenogen().
- je roept vanuit paint tekenogen op, wat repaint aanroept, wat tekenogen oproept, wat... je begrijpt het probleem wel. De aanroep naar repaint() moet inderdaad gebeuren na het instellen van ogen, maar het moet bijvoorbeeld in de actionPerformed() methode, niet in paint() of een methode die aangeroepen wordt door paint(), dat veroorzaakt een oneindige lus.
- het tekenen zelf: je kan het jezelf makkelijk maken. Uiteindelijk zijn er maar 9 mogelijke posities voor een bolletje op een dobbelsteen, teken eens uit welk aantal ogen er bij elk bolletje kan voorkomen en je bekomt een viertal regeltjes: linksboven en rechtsonder voor > 1, midden voor 1-3-5, rechtsboven en linksonder voor > 3 en midden boven en midden onder voor 6. Gewoon uittekenen, je ziet het wel.
- je kan het dan nog eens gemakkelijker maken voor jezelf door een aparte methode te maken die een bolletje tekent in één van die 9 vakjes. Je hebt een x en y-positie voor je dobbelsteen en je weet hoe groot die is, dus je kan de grootte van één vakje en een bolletje berekenen en die mooi in het midden plaatsen. Je hoeft dan alleen nog maar een cijfer van 0 tem 2 mee te geven voor x en y om in een bepaald vak een bolletje te zetten.
- er zijn bepaalde zaken die ik toegevoegd heb maar die je mag 'vereenvoudigen' met zaken die je zelf gezien hebt, als het een opdracht is voor een cursus of voor school (Applet17?) kan ik me voorstellen dat je die wil vermijden. Constanten (private final static int) mag je vervangen door overal de waarde zelf, de ogen % 2 == 1 (= modulo 2) mag je vervangen door ogen == 1 || ogen == 3 || ogen == 5. Je ziet maar ;).

Hope this helps.

Dat helpt heel erg! En het is inderdaad een opdracht voor school. We werken met een boekje genaamd "Java" (had je nooit verwacht eh?) en nu heeft de leraar deze opdracht gegeven. Ik moet zeggen dat er een aantal methoden of andere dingen in voorkomen die ik niet helemaal volledig begrijp, maar ik kan me er natuurlijk in verdieping en er nog meer van leren. Heel erg bedankt! :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan