BlueJ/ Java/ GLOOP Hilfe?
Hallo,
ich muss für die Schule ein Würfelspiel programmieren dazu habe ich mit BlueJ und GLOOP 2 Würfel die mit jeweils 6 Quadern zusammengebaut sind modelliert.
Meine Frage ist jetzt: Wie kann ich wenn eine bestimmte Taste gedrückt wird, die Objekte auf eine zufällige Seite drehen (wie beim würfeln) sodass die 6 Quader immer noch ein Würfel ergeben?
Den Code den ich bisher habe:
import GLOOP.*;
class Würfelspiel{
GLTastatur tastatur;
GLSchwenkkamera cam;
GLLicht spot , spotoben;
GLQuader links, rechts, vorne, hinten, oben, unten;
GLQuader left, right, front, back, up, down;
GLQuader tisch;
GLQuader eins, zwei, drei, vier;
Würfelspiel(){
cam = new GLSchwenkkamera(500, 500);
spot = new GLLicht();
spotoben = new GLLicht(0,0,-500);
tastatur = new GLTastatur();
tisch = new GLQuader(0,0,0,900,10,900);
eins = new GLQuader(430,-250,430,40,500,40);
zwei = new GLQuader(-430,-250,430,40,500,40);
drei = new GLQuader(-430,-250,-430,40,500,40);
vier = new GLQuader(430,-250,-430,40,500,40);
links = new GLQuader(-50, 50, 0, 10, 100, 100);
vorne = new GLQuader(0, 50, 50, 100, 100, 10);
rechts = new GLQuader(50, 50, 0, 10, 100, 100);
hinten = new GLQuader(0, 50, -50, 100, 100, 10);
oben = new GLQuader(0, 100, 0, 100, 10, 100);
unten = new GLQuader(0, 0, 0, 100, 10, 100);
left = new GLQuader(150, 50, 150, 10, 100, 100);
front = new GLQuader(200, 50, 200, 100, 100, 10);
right = new GLQuader(250, 50, 150, 10, 100, 100);
back = new GLQuader(200, 50, 100, 100, 100, 10);
up = new GLQuader(200, 100, 150, 100, 10, 100);
down = new GLQuader(200, 0, 150, 100, 10, 100);
links.setzeTextur("drei.jpg");
vorne.setzeTextur("fünf.jpg");
rechts.setzeTextur("vier.png");
hinten.setzeTextur("zwei.jpg");
oben.setzeTextur("sechs.jpg");
unten.setzeTextur("eins.png");
left.setzeTextur("drei.jpg");
front.setzeTextur("fünf.jpg");
right.setzeTextur("vier.png");
back.setzeTextur("zwei.jpg");
up.setzeTextur("sechs.jpg");
down.setzeTextur("eins.png");
if(tastatur.istGedrueckt('f')){
}
}
}
1 Antwort
1) Zufallszahl erzeugen, nach der Formel:
random(0, 1) * (max - min + 1) + min
Die Variablen max und min repräsentieren die Grenzen.
2) Richtigen Quader ermitteln
Am einfachsten wäre es, wenn du dir alle Seiten in einem Array speichern würdest.
GLQuader[] dice = new GLQuader[6];
dice[0] = new GLQuader(/* ... */
In Kombination mit Schleifen könntest du dir sicherlich auch einiges an Schreibarbeit sparen.
Die Zufallszahl - 1 würde den Index ergeben, den du für das Array nutzen kannst, um einen gespeicherten Zufallsquader herauszuholen.
3) Hier findet sich die Dokumentation zu GLOOP. Du solltest einmal schauen, ob du Objekte drehen bzw. nur ein bestimmtes Rechteck anzeigen lassen kannst.
Ich sehe schon: Ich habe übersehen, dass du dir erst einen Würfel aus verschiedenen Quadern zusammenbaust. Das liegt sicherlich daran, dass du Texturen nicht für jede Seite richtig mappen kannst.
Anderer Vorschlag: Erstelle dir eine Klasse für den Würfel. Die einzelnen Seiten stellen Attribute dar. Dann schreibst du dir zwei Methoden: Drehe seitlich und drehe vertikal (nur für einen Schritt). Lege dir für die Implementation einen Würfel auf den Tisch, um es einfacher zu machen.
Folgend werden Texturen und Objekte getauscht. Ein seitliches Drehen bedeutet bspw. nur, dass links, rechts und Front- sowie Rückseite ihre Quader-Instanzen miteinander tauschen. Zusätzlich solltest du dir merken, wo gerade welche Zahl liegt. Eine neue Klasse kann dafür angelegt werden.
class DicePage {
GLQuader cuboid;
int value;
}
Die Seitenattribute zeigen auf Objekte diesen Typs.
Wenn die Zufallszahl ausgelotet wurde, drehst du den Würfel mit deinen Hilfsmethoden so lange, bis die gewünschte Zahl gefunden wurde.
Noch ein anderer Lösungsweg wäre die Trennung von Logik/Daten und Repräsentation. Die Datenstruktur (einzelne Würfelseiten) werden z.B. mit einem Graph dargestellt. Wenn die Zufallszahl gefunden wurde, lässt du den Würfel erst zeichnen. Über den Graph kannst du problemlos auf die jeweiligen Nachbarseiten zugreifen.
Ich denke, der letzte Lösungsweg wäre am einfachsten und besten.
Mir ist jetzt leider immer noch nicht klar geworden wie ich dieses Problem lösen kann