Abfrage-Fehler? - Hilfe bei Tetris

LP_SE

Aktives Mitglied
Ich habe hier ein Spiele-Programmierungs-Tutorial, um zu lernen, wie man Java-Spiele schreibt.
Habe noch keine Erfahrung mit paint() und Graphics gemacht und habe dies als Einstieg benutzt. Habe jetzt eine Tetris-Version programmiert (im Tutorial war was anderes, habe dann aber gedacht: Tetris passt besser und habe das Tut als Hilfe genommen).
Nun habe ich die Anzeige halbwegs hinbekommen, habe aber irgendwo einen Denkfehler, weiß nicht, warum es nicht geht. Es kommt immer nur einer von vier Teilen des Steins runtergefallen, ein weiteres bleibt in der linken oberen Ecke. Beim Bewegen treten manchmal völlig abwegige Exceptions auf, wie ArrayIndexOutOfBounds (-1), obwohl alle Zahlen positiv sind.

Habe hier mal grob zusammengestell, wie ich das Tetris angegangen bin:

-Stein-Objekte mit 4-Koordinaten, davon einer als Referenz, anhand welcher die anderen berechnet werden.
-Color[][] zum speichern der Steine die schon unten sind (schwarz = unbesetzt)
-Feld zeichnen nach den Koordinaten (ein Element 40x40p, ein Pixel schwarzer Rand also 38x38)
-javax.swing.Timer zum Fallenlassen der Steine

Hab den src-Ordner gezippt und angehangen, wer Lust hat kann sich den Lösungsweg anschauen und mir dann vllt meine Fehler mitteilen, das wäre klasse:toll:
 

Anhänge

  • src.zip
    4,8 KB · Aufrufe: 7
G

Gast2

Gast
Ich denke du wirst mehr Unterstützung bekommen wenn du sagst in welcher Zeile die Exception auftritt, den entsprechenden Code postest und noch zeigst wo du das array initialisierst.
 

LP_SE

Aktives Mitglied
Das ist ja das Problem, das ist unterschiedlich.
Code posten geht schlecht, da der Fehler irgenwo in den Verbindungen oder Abfragen steckt, deßhalb kann ich auch kein kskb machen, da das problem in der Komplexen Logik liegt.

Hier die Exception: (hab das mit der OutOf Bounds(-1) schon hingekriegt, da war eine Klammer falsch.)
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 9
	at virtuelgamepanel.CVirtuelPanel.checkMovement(CVirtuelPanel.java:124)
	at virtuelgamepanel.CVirtuelPanel.stepRight(CVirtuelPanel.java:59)
	at ui.CGamePanel$2.keyPressed(CGamePanel.java:104)
	at java.awt.Component.processKeyEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Window.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Das gleiche noch an der Stelle:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 16
	at virtuelgamepanel.CVirtuelPanel.checkMovement(CVirtuelPanel.java:105)
	at virtuelgamepanel.CVirtuelPanel.stepDown(CVirtuelPanel.java:67)
	at ui.CGamePanel$2.keyPressed(CGamePanel.java:105)


Hier diese Stellen (ja, schlecht formatiert, aber cih blick kaum noch durch, die formatierung ist für mich so am besten, um noch halbwegs was zu wissen):

[JAVA=102]
switch(pos) {
case 0: {
if((akt.getKoo1().getY() & akt.getKoo2().getY() & akt.getKoo3().getY() & akt.getKooM().getY()) < 15) {
if(ground[akt.getKoo1().getX()][akt.getKoo1().getY()+1] == Color.black && ground[akt.getKoo2().getX()][akt.getKoo2().getY()+1] == Color.black && ground[akt.getKoo3().getX()][akt.getKoo3().getY()+1] == Color.black && ground[akt.getKooM().getX()][akt.getKooM().getY()+1]== Color.black) {
return true;
}
else return false;
}
else return false;

}
case 1: {
if((akt.getKoo1().getX() & akt.getKoo2().getX() & akt.getKoo3().getX() & akt.getKooM().getX()) > 0) {
if(ground[akt.getKoo1().getX()-1][akt.getKoo1().getY()] == Color.black && ground[akt.getKoo2().getX()-1][akt.getKoo2().getY()] == Color.black && ground[akt.getKoo3().getX()-1][akt.getKoo3().getY()] == Color.black && ground[akt.getKooM().getX()-1][akt.getKooM().getY()]== Color.black) {
return true;
}
else return false;
}
else return false;
}
case 2: {
if((akt.getKoo1().getX() & akt.getKoo2().getX() & akt.getKoo3().getX() & akt.getKooM().getX()) < 8) {
if(ground[akt.getKoo1().getX()+1][akt.getKoo1().getY()] == Color.black && ground[akt.getKoo2().getX()+1][akt.getKoo2().getY()] == Color.black && ground[akt.getKoo3().getX()+1][akt.getKoo3().getY()] == Color.black && ground[akt.getKooM().getX()+1][akt.getKooM().getY()]== Color.black) {
return true;
}
else return false;
}
else return false;
}
}
return false;
[/code]
 
S

SlaterB

Gast
auf solchem Code wird wohl niemand genauer drauf schauen,
wozu machst du alles doppelt und dreifach?

es reicht doch vor dem switch EINMAL
int x = akt.getKoo1().getX() & akt.getKoo2().getX() & akt.getKoo3().getX() & akt.getKooM().getX();
auszurechnen,
dann musst du akt.getKoo1().getX() & akt.getKoo2().getX() & akt.getKoo3().getX() & akt.getKooM().getX()
nicht wer weiß wie oft schreiben,
dir fällt doch sicher auch auf, wie unleserlich etwas ist, wenn akt.getKoo1().getX() & akt.getKoo2().getX() & akt.getKoo3().getX() & akt.getKooM().getX() zwischen akt.getKoo1().getX() & akt.getKoo2().getX() & akt.getKoo3().getX() & akt.getKooM().getX() jeden akt.getKoo1().getX() & akt.getKoo2().getX() & akt.getKoo3().getX() & akt.getKooM().getX() Wort akt.getKoo1().getX() & akt.getKoo2().getX() & akt.getKoo3().getX() & akt.getKooM().getX() steht

-----

als nächstest hast du
ground[akt.getKoo1().getX()][akt.getKoo1().getY()+1]
ground[akt.getKoo1().getX()-1][akt.getKoo1().getY()]
ground[akt.getKoo1().getX()+1][akt.getKoo1().getY()]
usw.,
wie wäre es dort mit Hilfs-Methoden a la

getColor(ground, akt.getKoo1(), 1, 0)
wobei die letzten Parameter +- auf x und y zu rechnen sind, nicht ganz einfach aber wenn man das 10x braucht,
dann wirds doch leserlicher als diese dicken Arrays,
und vermeidet Tippfehler, etwa Array-Zugriff Koo1.x, Koo2.y,

noch wirksamer wird dies bei größeren Zeilen, du hast da etwa

if(ground[akt.getKoo1().getX()+1][akt.getKoo1().getY()] == [..] && ground[akt.getKoo2().getX()+1][akt.getKoo2().getY()] == [..]
if(ground[akt.getKoo1().getX()-1][akt.getKoo1().getY()] == [..] && ground[akt.getKoo2().getX()-1][akt.getKoo2().getY()] == [..]

da sind also an drei Codestellen in einer Zeile gleich mehrere Array-Zugriffe mit diesen -1 oder +1 konsistent,
diese Zeilen könnten so leicht in einer Hilfsmethode verschieden:
if(isKoo123MBlack(ground, akt, 1, 0))
sehr kurzer Aufruf und in der Methode werden von akt die Koo1 bis Koo3 abgefragt,
einheitlich die x/y Parameter drauf addiert, bei ground auf Color.Black verglichen usw.,
quasi so wie bisher, nur nur noch 1x statt 3x und weniger fehleranfällig dass irgendwo +2 statt +1 steht


-------

zu Fehler:
letztlich musst du die exakte Zeile des Arrayzugriffs anschauen und prüfen, warum dort gerade dieser falsche Array-Zugriff verwendet wird,
wer ist dafür verantwortlich, wer stellt die Anfrage und warum,
wenn z.B. rechts von einem belegten Spielfeld nachgeschaut wird, fehlt dann ein Check ob Spielfeld zu Ende?
usw.
 
Zuletzt bearbeitet von einem Moderator:

LP_SE

Aktives Mitglied
In dem Switch die ersten Abfragen schauen, ob das Verschieben noch im Spielfeld stattfindet, hab dort einen Fehler gefunden: es muss dort auch
Java:
akt.getKoo1().getX() < 8 && ...
bzw. Y<15 und X>0 (je nach richtung) heißen.
Werde mich gleich mal um die Hilfsmethoden kümmern.
Ich kann jetzt schon die einzelnen Referenzkordinaten verschieben, komischerweise werden die anderen aber nicht berechnet bzw. angezeigt :bahnhof:
außerdem kann ich nur nach rechts verschieben sowie nach unten beschleunigen.
Hat jemand ne ahnung woran dies liegen könnte, hab keine Exception und keine ahnung woran es liegen könnte, der code ist equivalent zum verschiebn nach rechts und wird einfach nicht ausgeführt. Da ich nicht weiß, wo der Fehler leigt, kann ich auch keinen Code posten (sind ca. 300 Zeilen in der Stone-Klasse, 50 Zeilen in der VirtuelPanel-Klasse und ein Aufruf in der GamePanel-Klasse).
 
Zuletzt bearbeitet:

LP_SE

Aktives Mitglied
habe jetzt ein neues Konzept gemacht, eine abstrakte Superklasse für die Steine und dann einzelne Subklassen gebildet, die Verwaltungsklasse in die Spielklasse mitaufgenommen und die Abfragen korrigiert.
Ich arbeite nun mit Offset-Koordinaten für die drei Neben-Steine und nun funktioniert alles wunderbar.

Wer will kann sich den Quellcode gerne anschauen. Habe auch eine Spielfertige Version angefügt.
 

Anhänge

  • src.zip
    5,4 KB · Aufrufe: 4
  • Tetris.jar
    12 KB · Aufrufe: 21
Q

Quurks

Gast
Ganz nett geworden, noch 2 Sachen:
1) Irgendein Effekt wäre schön wenn du eine Reihe zuerstörst
2) Drück mal nach GameOver auf die Pfeiltaste nach unten :)
 

Ruzmanz

Top Contributor
Funktioniert ganz gut :) Ich weis nicht, ob das früher auch so war, aber wenn die Steine ganz am Rand sind, kann man dich nicht drehen, das vermisse ich ein wenig. Zudem stimmt etwas bei deiner Abfrage nicht, da man die Steine in andere hineindrehen kann :eek: Am simpelsten geht das wohl, wenn man eine zusätzliche Abfrage macht nachdem man den Stein gedreht hat und wenn der etwas schneidet, dann wird die Bewegung rückgängig gemacht.
 
Zuletzt bearbeitet:

LP_SE

Aktives Mitglied
Ja, diese Bugs sind mir bekannt, habe aber jetzt nicht vor diese zu beheben, da dies nur ein Übungsprojekt war.
Wer will, darf meinen Source-Code verwenden und diese Bugs beheben bzw. mein Programm weiterentwickeln.
P.S.: die Überschneidungsabfrage bei Rotation ist entweder noch drin oder war drin, funktioniert aber nicht richtig.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
FireHorses Discord JDA Nickname Abfrage Spiele- und Multimedia-Programmierung 0
A Spiel nach Abfrage beenden oder neustarten Spiele- und Multimedia-Programmierung 1
David Schwarzbeck Java 3 dimensionale Kollisions Abfrage Spiele- und Multimedia-Programmierung 2
M Kollisions abfrage bei 3D spiel? Spiele- und Multimedia-Programmierung 12
D HitTest , Kollesions abfrage Spiele- und Multimedia-Programmierung 8
C Mastermind Treffer abfrage Spiele- und Multimedia-Programmierung 2
T Kollisions Abfrage und Klassen design Spiele- und Multimedia-Programmierung 15
Z Zeiterfassungsprogramm Fehler Spiele- und Multimedia-Programmierung 7
L Fehler bei "Nochmal Spielen" (Java) Spiele- und Multimedia-Programmierung 1
M Fehler bei MinecraftPlugin Spiele- und Multimedia-Programmierung 3
D Minecraft [Minecraft] Java Start Fehler (Core-Dump) Spiele- und Multimedia-Programmierung 1
coolian glsl shader syntax fehler bei if? Spiele- und Multimedia-Programmierung 8
KeexZDeveoper Fehler von OpenGL Spiele- und Multimedia-Programmierung 1
Kim_Dotcom libGDX - opengl Fehler Spiele- und Multimedia-Programmierung 5
D Fehler bei GUI-Aktualisierung Spiele- und Multimedia-Programmierung 9
R Fehler beim Laden eines 2D-Bildes Spiele- und Multimedia-Programmierung 3
2 jMonkey fehler Spiele- und Multimedia-Programmierung 0
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
A Minecraft Plugin Teleport Fehler Spiele- und Multimedia-Programmierung 1
O Fehler bei Programmierung lässt Figur nicht bewegen Spiele- und Multimedia-Programmierung 5
R LWJGL: OpenGL Fehler - weitere Informationen auslesen möglich? Spiele- und Multimedia-Programmierung 2
G Sound-Sampling: Sinuston; kein Fehler, aber auch kein Ton :-( Spiele- und Multimedia-Programmierung 3
I Minecraft Java programmierungs fehler "MineCraft" Spiele- und Multimedia-Programmierung 6
V Komischer Fehler in LWJGL Spiele- und Multimedia-Programmierung 18
CookieSoft LWJGL Ubuntu 12.04 Fehler Spiele- und Multimedia-Programmierung 7
CookieSoft Slick Texture laden Fehler Spiele- und Multimedia-Programmierung 6
A Netbeans / Gamegrid Fehler/Maze Spiele- und Multimedia-Programmierung 2
1 Fehler bei Krümel&Monster Spiele- und Multimedia-Programmierung 16
0 Finde den Fehler nicht Spiele- und Multimedia-Programmierung 2
C Java Fehler (If?) Spiele- und Multimedia-Programmierung 14
F fehler Spiele- und Multimedia-Programmierung 2
N bei abspielen der wav datei fehler Spiele- und Multimedia-Programmierung 6
D Java 2d translation() fehler Spiele- und Multimedia-Programmierung 4
D Fehler beim Stein Scher papier Spiel Spiele- und Multimedia-Programmierung 3
G Schüsse zeichnen, Fehler? Spiele- und Multimedia-Programmierung 3
R BufferStragety Fehler: Component must have a valid peer Spiele- und Multimedia-Programmierung 5
S drawImage Fehler ! Spiele- und Multimedia-Programmierung 3
V Minesweeperprogrammierung Fehler J0098 Spiele- und Multimedia-Programmierung 8
I Fehler bei Änderung der Bildschirmauflösung Spiele- und Multimedia-Programmierung 3
Atten007 Minecraft Hilfe bei benutzerdefinierten Bannervorlagen in MCreator benötigt Spiele- und Multimedia-Programmierung 0
R Flappy Bird Hilfe Spiele- und Multimedia-Programmierung 1
Atten007 Minecraft Hilfe bei der Fehlerbehebung in MCreator benötigt Spiele- und Multimedia-Programmierung 1
Atten007 Minecraft Hilfe beim MCreator Plugin benötigt Spiele- und Multimedia-Programmierung 0
Atten007 Minecraft Hilfe beim MCreator Plugin benötigt Spiele- und Multimedia-Programmierung 5
A [HILFE] - Minecraft-Problem! Spiele- und Multimedia-Programmierung 1
JEP1 Hilfe bei Spiel Spiele- und Multimedia-Programmierung 1
J TreeNode erstellen [Hilfe beim Konstruktor, Zeile 16] Spiele- und Multimedia-Programmierung 2
Z Minecraft Hilfe bei Minecraft PvP Client Spiele- und Multimedia-Programmierung 21
T Hilfe beim Platzieren der Schiffe Spiele- und Multimedia-Programmierung 14
M Brauche Hilfe was zu Programmieren Spiele- und Multimedia-Programmierung 4
P Snake Java Hilfe Spiele- und Multimedia-Programmierung 4
RalleYTN Brauche Hilfe beim Einlesen von PNGs Spiele- und Multimedia-Programmierung 14
P Hilfe für Seminar Arbeit Spiele- und Multimedia-Programmierung 9
T Pong Hilfe bei einer Website Spiele- und Multimedia-Programmierung 4
T Hilfe bei decompilen von Plugin Spiele- und Multimedia-Programmierung 6
E Brauche Hilfe was soll ich tun Spiele- und Multimedia-Programmierung 7
B HILFE bei Spieleprogrammierung mit Slick2D Spiele- und Multimedia-Programmierung 9
S Würfelspiel; Hilfe Spiele- und Multimedia-Programmierung 3
M Hilfe bei vier gewinnt Spiele- und Multimedia-Programmierung 4
S Hilfe bei Java Gui Spiele- und Multimedia-Programmierung 2
C Visual Story programieren/hilfe Spiele- und Multimedia-Programmierung 5
L Hilfe: Moog VCF Diskretisierungs Algorithmen (Smith/Stilson u.A.) Spiele- und Multimedia-Programmierung 0
J Spielfiguren laufen lassen auf einer html Tabelle mit Hilfe von Servlets Spiele- und Multimedia-Programmierung 2
M Hilfe bei Snake Spiele- und Multimedia-Programmierung 4
T Hintergrundmusik eines Spiels mit Hilfe von JLayer Spiele- und Multimedia-Programmierung 12
S 2D mit Slick - Anfänger sucht Hilfe Spiele- und Multimedia-Programmierung 4
C Generelle Hilfe zur lwjgl Spiele- und Multimedia-Programmierung 0
J Hilfe bei Fußballmanager Spiele- und Multimedia-Programmierung 0
C Hilfe bei einem Mosaikspiel Spiele- und Multimedia-Programmierung 16
J Java Steuerberechnung hilfe Spiele- und Multimedia-Programmierung 17
U Hilfe bei Implementierung eines PointSounds in Java3D Spiele- und Multimedia-Programmierung 1
E Hilfe bei Labyrinth Programmierung. Spiele- und Multimedia-Programmierung 9
S Hilfe bei Spiel Spiele- und Multimedia-Programmierung 6
T Aim-Hilfe Spiele- und Multimedia-Programmierung 4
S Shiritori / word chain / Wörterkette Hilfe Spiele- und Multimedia-Programmierung 1
J Hilfe bei mastermind dringend !!!!! Spiele- und Multimedia-Programmierung 3
S Hilfe bei Spielumsetzung Spiele- und Multimedia-Programmierung 6
M Kleines Spongebobspiel / Hilfe gesucht Spiele- und Multimedia-Programmierung 2
L Hilfe bei Entities benötigt Spiele- und Multimedia-Programmierung 6
L Hilfe bei Klassendesign für Spiel Spiele- und Multimedia-Programmierung 2
A Minecraft Hilfe bei Minecraft Mod Spiele- und Multimedia-Programmierung 1
F Einen Sound mit veränderter Tonhöhe und Geschwindigkeit abspielen - Hilfe erbeten Spiele- und Multimedia-Programmierung 29
V Keine Ahnung von OpenGL! Hilfe wäre lieb! Spiele- und Multimedia-Programmierung 8
L Minecraft Minecraft Bukkit Plugin hilfe Spiele- und Multimedia-Programmierung 9
E Hilfe bei Highscore programmierung Spiele- und Multimedia-Programmierung 3
G Acht-Damen-Problem HILFE! Spiele- und Multimedia-Programmierung 11
R Hilfe bei Snake-Programmierung Spiele- und Multimedia-Programmierung 6
B Hilfe bei Minecraft Plugin Spiele- und Multimedia-Programmierung 3
C Java Brauche Hilfe Spiele- und Multimedia-Programmierung 5
M Hilfe bei Spiel Programmierung Spiele- und Multimedia-Programmierung 4
B Hilfe bei GameGrid Spiele- und Multimedia-Programmierung 11
J Spiel mit Java SWING, LWJGL und JMonkey [Anfänger braucht Hilfe] Spiele- und Multimedia-Programmierung 10
N Hilfe bei Tower Defense Spiele- und Multimedia-Programmierung 22
R hilfe bei 2DSpiel. Spiele- und Multimedia-Programmierung 3
S AirHockey Kollisionsprobleme, bitte um Hilfe Spiele- und Multimedia-Programmierung 2
R Hilfe bei Reversi/Othello Spiele- und Multimedia-Programmierung 6
J Hilfe: Rotation X und Y Achse (Java3d) Spiele- und Multimedia-Programmierung 12
B Hilfe bekomme den IF befehl nicht hin Spiele- und Multimedia-Programmierung 10
C RFID Überwachung - Hilfe Spiele- und Multimedia-Programmierung 3
javajavajava Java Lotto Zahl 6 aus 49 - Brauche Hilfe Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben