|
You last visited: Today at 02:02
Advertisement
ZZZnake - Dynamisch geht nix
Discussion on ZZZnake - Dynamisch geht nix within the General Coding forum part of the Coders Den category.
01/22/2013, 14:56
|
#1
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
ZZZnake - Dynamisch geht nix
Moin. Bin seit etwa einer Woche am Lernen von Java und bin es bisher relativ langsam und entspannt angegangen. Heute wollte ich mal nach den ersten 2 Kapiteln des "Java ist auch eine Insel" Buches mal das kleine "ZZZnake" Programm umschreiben - es "dynamisch" machen.
Das heißt das ich die Positionen der Figuren durch eine Zufallszahl festsetzen möchte, die nach jedem generieren anders ist. Die Positionen werden durch die 2 Random Methoden "randomX" und "randomY" generiert. Mein bisheriger Code prüft, ob es bei den Positionen irgendwo eine Kollision gibt und soll die Positionen dann mal testweise ausgeben damit ich sehe ob da alles passt.
Das tut er aber leider nicht, das Programm bricht irgendwo ab.
Hier mal der Ansatz:
Code:
/*
* Spiel: Ein Spieler (S) muss 3 Geldstuecke ($) einsammeln ohne von der Schlange (!) gebissen zu werden
*/
public class ZZZZnake {
public static void main(String[] args) {
GregorianCalendar gc = new GregorianCalendar();
int h = gc.get(Calendar.HOUR) + 12;
int m = gc.get(Calendar.MINUTE);
int s = gc.get(Calendar.SECOND);
JOptionPane.showMessageDialog(null, "ZZZZZZnake!");
int confirm = JOptionPane.showConfirmDialog(null,
"Spiel starten? | Systemzeit: " + h + ":" + m + ":" + s);
; // Confirmrequest
if (confirm == 0) // Ja = Spielablauf
{
positions();
} else // 1 oder 2 = Nein = Abbruch
{
System.exit(0);
}
}
public static void positions() {
Point playerpos = new Point();
Point schlangenpos = new Point();
Point geldpos1 = new Point();
Point geldpos2 = new Point();
Point geldpos3 = new Point();
playerpos.setLocation(randomX(), randomY());
schlangenpos.setLocation(randomX(), randomY());
geldpos1.setLocation(randomX(), randomY());
geldpos2.setLocation(randomX(), randomY());
geldpos3.setLocation(randomX(), randomY());
while (geldpos1.equals(playerpos) || geldpos2.equals(playerpos)
|| geldpos3.equals(playerpos) || playerpos.equals(schlangenpos)) {
geldpos1.setLocation(randomX(), randomY());
geldpos2.setLocation(randomX(), randomY());
geldpos3.setLocation(randomX(), randomY());
playerpos.setLocation(randomX(), randomY());
System.out.println(playerpos);
System.out.println(schlangenpos);
System.out.println(geldpos1);
System.out.println(geldpos2);
System.out.println(geldpos3);
}
}
public static int randomX() {
return (int) (Math.random() * 40);
}
public static int randomY() {
return (int) (Math.random() * 10);
}
}
mfg
|
|
|
01/22/2013, 15:03
|
#2
|
elite*gold: 50
Join Date: Sep 2010
Posts: 846
Received Thanks: 223
|
Gibt es beim Kompilieren keine Fehlermeldung?
|
|
|
01/22/2013, 15:05
|
#3
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
Quote:
Originally Posted by Der Anbieter
Gibt es beim Kompilieren keine Fehlermeldung?
|
Nein, wüsste auch nicht wo es da eine geben sollte.
Er bricht halt bei der Positionsgenerierung irgendwo ab und das Programm schließt sich.
|
|
|
01/22/2013, 15:33
|
#4
|
elite*gold: 18
Join Date: Sep 2009
Posts: 20,174
Received Thanks: 14,475
|
Ich hab das ganze mal etwas umgeschrieben. Getestet habe ich es nicht, da ich keinen Java Compiler zurzeit habe.
Code:
import java.text.SimpleDateFormat;
import java.util.Date;
/*
* Spiel: Ein Spieler (S) muss 3 Geldstuecke ($) einsammeln ohne von der Schlange (!) gebissen zu werden
*/
public class ZZZZnake {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
var nDate = sdf.format(new Date());
JOptionPane.showMessageDialog(null, "ZZZZZZnake!");
int confirm = JOptionPane.showConfirmDialog(null, "Spiel starten? | Systemzeit: " + nDate);
// Confirmrequest
if (confirm == 0) // Ja = Spielablauf
{
positions();
}
else // 1 oder 2 = Nein = Abbruch
{
System.exit( 0 );
}
}
public static void positions() {
Point playerpos = new Point();
Point schlangenpos = new Point();
Point geldpos1 = new Point();
Point geldpos2 = new Point();
Point geldpos3 = new Point();
int minXY = 0;
int maxX = 40;
int maxY = 10;
playerpos.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
schlangenpos.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
geldpos1.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
geldpos2.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
geldpos3.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
while( geldpos1.getLocation() == playerpos.getLocation() ||
geldpos2.getLocation() == playerpos.getLocation() ||
geldpos3.getLocation() == playerpos.getLocation() ||
playerpos.getLocation() == schlangenpos.getLocation() )
{
geldpos1.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
geldpos2.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
geldpos3.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
playerpos.setLocation(GetRandomPos( minXY, maxX ), GetRandomPos( minXY, maxY ));
System.out.println( "X: " + playerpos.getX() + " Y:" + palyerpos.getY() );
System.out.println( "X: " + schlangenpos.getX() + " Y:" + schlangenpos.getY() );
System.out.println( "X: " + geldpos1.getX() + " Y:" + geldpos1.getY() );
System.out.println( "X: " + geldpos2.getX() + " Y:" + geldpos2.getY() );
System.out.println( "X: " + geldpos3.getX() + " Y:" + geldpos3.getY() );
}
}
public static int GetRandomPos(int low, int high) {
return (int) (Math.random() * (high - low) + low);
}
}
|
|
|
01/22/2013, 15:40
|
#5
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
Selbes Ergebnis, die Dialoge funktionieren, alles danach allerdings nicht mehr. Finde aber auch dass das genau das selbe ist was ich ja schon geschrieben hatte, halt nur mit anderen Lösungsansätzen.
|
|
|
01/22/2013, 15:44
|
#6
|
elite*gold: 18
Join Date: Sep 2009
Posts: 20,174
Received Thanks: 14,475
|
Ich sehe gerade das hier xD
Code:
if (confirm == 0) // Ja = Spielablauf
änder es mal in
Code:
if (confirm) // Ja = Spielablauf
0 steht für false.
Abbruch ist immer 0.
|
|
|
01/22/2013, 15:54
|
#7
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
Wir verwenden hier keinen Boolean, daher geht das ohne den Wert in der if Abfrage sowieso nicht. 0 ist in Java nicht immer false. Zumindest nicht bei der Funktion "JOptionPane".
Stimmt schon, habs eben auch nochmal getestet. Der zählt von rechts nach links: Abbruch - Nein - Ja
€: Manchmal könnt ich mir so dermaßen eine reinhauen... echt ey.
Code:
while (geldpos1.equals(playerpos) || geldpos2.equals(playerpos)
|| geldpos3.equals(playerpos) || playerpos.equals(schlangenpos)) {
geldpos1.setLocation(randomX(), randomY());
geldpos2.setLocation(randomX(), randomY());
geldpos3.setLocation(randomX(), randomY());
playerpos.setLocation(randomX(), randomY());
System.out.println(playerpos);
System.out.println(schlangenpos);
System.out.println(geldpos1);
System.out.println(geldpos2);
System.out.println(geldpos3);
}
Ich hab ne while Schleife die überprüft ob die Koordinaten alle verschieden sind und nicht aufliegen. Die Ausgabe kommt ja nur wenn sie mindestens einmal irgendwo aufeinander gelegen haben.
Sorry.
|
|
|
01/22/2013, 16:00
|
#8
|
elite*gold: 18
Join Date: Sep 2009
Posts: 20,174
Received Thanks: 14,475
|
Dann nimm doch mal die Abfrage raus und teste mal so, um zu sehen, ob es an der Abfrage liegt.
Ich verstehe auch nicht, wieso du nicht so abfragst:
Code:
int confirm = JOptionPane.showConfirmDialog(null, "Spiel starten? | Systemzeit: " + nDate, "TITEL", JOptionPane.YES_NO_CANCEL_OPTION);
und dann mit
Code:
if (confirm == JOptionPane.YES_OPTION)
{
positions();
}
else // if (result == JOptionPane.NO_OPTION)
{
System.exit(0);
}
den Rückgabewert ermittelst.
|
|
|
01/23/2013, 14:40
|
#9
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
So, nach diesem dummen Fehler meinerseits hab ich mich nochmal an das Minigame gemacht und nun Spielfeld, Figuren und Steuerung hinzugefügt.
Allerdings hab ich so das Gefühl dass das sehr unübersichtlich für andere wird, daher poste ich mal den Source von der Klasse mit den ganzen Methoden und ihr könnt ja mal drüberschauen. Übrigens hab ich sehr viele Probleme mit dem Rückgabewert. Ich würde gern für jede Aufgabe eine seperate Methode machen und das alles in der Main Methode zusammenfassen, allerdings geht das oftmals nicht, da ich bei einigen Funktionen eine Eingabe benötige um die Methode auszuführen, da ich das selbst so festgelegt habe. Naja, seht ihr ja dann schon selbst.
Zur Verständlichkeit ist einiges kommentiert.
Code:
/*
* Spiel: Ein Spieler (S) muss 3 Geldstuecke ($) einsammeln ohne von der Schlange (!) gebissen zu werden
*/
public class ZZZZnake {
public static void main(String[] args) {
GregorianCalendar gc = new GregorianCalendar();
int h = gc.get(Calendar.HOUR) + 12;
int m = gc.get(Calendar.MINUTE);
int s = gc.get(Calendar.SECOND);
JOptionPane.showMessageDialog(null, "ZZZZZZnake!");
int confirm = JOptionPane.showConfirmDialog(null,
"Spiel starten? | Systemzeit: " + h + ":" + m + ":" + s);
; // Confirmrequest
if (confirm == 0) // Ja = Spielablauf
{
spielfeld(positions());
} else // 1 oder 2 = Nein = Abbruch
{
System.exit(0);
}
}
public static Point[] positions() {
Point playerpos = new Point();
Point schlangenpos = new Point();
Point geldpos1 = new Point();
Point geldpos2 = new Point();
Point geldpos3 = new Point();
Point[] positionen = new Point[5];
playerpos.setLocation(randomX(), randomY());
schlangenpos.setLocation(randomX(), randomY());
geldpos1.setLocation(randomX(), randomY());
geldpos2.setLocation(randomX(), randomY());
geldpos3.setLocation(randomX(), randomY());
while (geldpos1.equals(playerpos) || geldpos2.equals(playerpos) // Dynamisch
// und
// optional,
// falls
// Koordinatenkonflikte
// auftauchen.
|| geldpos3.equals(playerpos) || playerpos.equals(schlangenpos)) {
geldpos1.setLocation(randomX(), randomY());
geldpos2.setLocation(randomX(), randomY());
geldpos3.setLocation(randomX(), randomY());
playerpos.setLocation(randomX(), randomY());
}
// Alle Koordinaten in einem Array untergebracht damit man diese in
// anderen Methoden verwenden kann
positionen[0] = playerpos;
positionen[1] = schlangenpos;
positionen[2] = geldpos1;
positionen[3] = geldpos2;
positionen[4] = geldpos3;
return positionen;
}
public static int randomX() {
return (int) (Math.random() * 10); // Zufallszahl bis 10
}
public static int randomY() {
return (int) (Math.random() * 40); // Zufallszahl bis 40
}
public static void spielfeld(Point[] positionen) {
// Spielfeld: size = 40 * 10 ;
boolean beendet = false; // Noch ohne Funktion, keine Ahnung wie ich von
// einer anderen Methode den Rückgabewert in
// diese Methode noch zusaetzlich neben der
// Point Variable uebergeben soll damit das
// Spiel beim Einsammeln der 3 Goldstuecke
// stoppt.
while (beendet == false) {
for (int a = 0; a < 10; a++) {
for (int b = 0; b < 40; b++) {
Point xy = new Point(a, b);
if (positionen[0].equals(xy)) // pos0 = playerpos
{
System.out.print("S");
} else if (positionen[1].equals(xy)) { // pos1 = schlange
System.out.print("!");
} else if (positionen[2].equals(xy) // geld1, 2, 3
|| positionen[3].equals(xy)
|| positionen[4].equals(xy)) {
System.out.print("$");
} else {
System.out.print("*");
}
}
System.out.println();
}
steuerung(positionen);
}
}
public static Point[] steuerung(Point[] positionen) {
// Keys: Hoch - w / Runter - s / Rechts - d / Links - a
// Pausetaste: P
boolean pausiert = false;
switch (new Scanner(System.in).next().charAt(0)) {
case 'w':
positionen[0].x = Math.max(0, positionen[0].x - 1); // Spielerschritt
break;
case 's':
positionen[0].x = Math.min(9, positionen[0].x + 1);
break;
case 'a':
positionen[0].y = Math.max(0, positionen[0].y - 1);
break;
case 'd':
positionen[0].y = Math.min(39, positionen[0].y + 1);
break;
case 'p': // Hier komm ich überhaupt nicht weiter, der Dialog
// funktioniert aber der Scanner ist weiterhin aktiviert,
// wie soll ich den auch noch deaktivieren? (Er ist in einer
// anderen Methode)
pausiert = true;
if (pausiert == true) {
int pause = JOptionPane.showConfirmDialog(null,
"Spiel pausiert, fortfahren?", "ZZZnake!",
JOptionPane.YES_NO_OPTION);
if (pause == 1) {
int sicher = JOptionPane.showConfirmDialog(null,
"Moechtest du das Spiel wirklich beenden?",
"ZZZnake!", JOptionPane.YES_NO_OPTION);
if (sicher == 0) {
System.exit(0);
} else {
pausiert = false;
}
} else {
pausiert = false;
}
}
break;
}
if (positionen[0].x < positionen[1].x) { // Automatisierte
// Schlangenbewegung
positionen[1].x--;
} else if (positionen[0].x > positionen[1].x) {
positionen[1].x++;
} else if (positionen[0].y < positionen[1].y) {
positionen[1].y--;
} else if (positionen[0].y > positionen[1].y) {
positionen[1].y++;
}
if (positionen[0].equals(positionen[1])) {
System.out.print(positionen[0] + "" + positionen[1]); // Wenn
// Schlange
// = Player
JOptionPane.showMessageDialog(null,
"Die Schlange hat dich gefressen und du hast verloren!",
"ZZZnake", JOptionPane.CLOSED_OPTION);
System.exit(0);
}
return positionen; // weitergabe von den aktualisierten positionen für
// Generierung vom Spielfeld
}
}
|
|
|
 |
Similar Threads
|
OriginReallife.De NEU! DYNAMISCH!
09/08/2012 - Grand Theft Auto - 1 Replies
Kommt einfach anschauen unbeschreiblich geil!
IP:176.9.46.83:5252
|
[H] Seite dynamisch gestalten
08/22/2012 - Web Development - 15 Replies
Hallo,
ich habe ein Problem.
Undzwar will ich eine Seite dynamisch gestalten, sprich alles soll sich an die Auflösung des Monitors/der Fenstergröße stellen.
Momentan habe ich den top bereich mit dem header und den main bereich mit der navi und dem content.
Bis jetzt ist es ja so wie ich will auf meiner Auflösung (1680x1050) habe ja auch alles auf die Auflösung eingestellt, aber verkleinere ich das Fenster jetzt geht der breite header oben natürlich kleiner so das man am Ende nur die...
|
[JAVASCRIPT]Mehrere Select Formularfelder dynamisch..????
08/18/2011 - Web Development - 3 Replies
Hi Leutz,
hab ne Problem. Habe ca 8 Select Felder mit ungefähr 40 optionen.
Jetzt soll es so ablaufen das wenn man z.B. bei select feld eins eine Option gewählt hat, diese nichtmehr bei den anderen 7 zugänglich ist. Also deaktiviert oder unsichtbar gemacht wird. Habe schon einiges mit Vergleichsoperatoren probiert aber ist einfach zuviel code und klappt am Ende nicht.
Die selects hole ich mir mit dieser function:
JAVA
|
Gui grösse verändern (dynamisch)
09/21/2009 - AutoIt - 2 Replies
hey ho
ich such das jetzt schon ne weile.. ich weis garned ob das überhaupt geht.. (vtl. geht das auch nur bei mir nicht und für alle andern isses so normal dass es nirgend steht xD)
ich möchte das fenster von meinem gui nach dem ich das programm ausgeführt habe verändern können (so wie halt bei den windowsfenstern dass dann das pfeilchen kommt welches auf bede seiten zeigt ..)
wie genau mand em sagt ... KA
vtl. dynamisch oder so xD
ich hoffe mal ihr versteht was ich meine und dass...
|
All times are GMT +1. The time now is 02:03.
|
|