Adrian_S Geschrieben 6. Dezember 2005 Teilen Geschrieben 6. Dezember 2005 Hi ! Ich hab mal wieder ein komisches Problem Bin grad dabei ein Spiel zu programmieren , nix besonderes (Memory). Praktisch funktiert das Spiel ohne Probleme. Nur bin ich grad an einen Punkt gestoßen wo ich einfach nicht weiter komme. Ich hab folgenden Klassenaufbau: MemoryMain (Erzeugt ein neus Objekt von MemoryFrame) MemoryFrame (Erzeugt ein neues Objekt von MemoryTimeAttack) MemoryTimeAttack (Erzeugt ein neues Objekt von MemoryField MemoryField (Erzeugt mehrere neue Objekte von MemoryCard) MemoryCard Ich werde nur ausschlaggebende Teile des Codes hier Posten weil sonst wird das bißchen zuviel MemoryMain: package Memory; ... public class MemoryMain { public static void main(String[] args) { MemoryFrame memory = [B]new MemoryFrame();[/B] memory.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); memory.setVisible(true); } } MemoryFrame: package Memory; ... public class [B]MemoryFrame[/B] extends [B]JFrame[/B] { .... public class MenuListener implements ActionListener { .... if (event.getActionCommand().equalsIgnoreCase("time attack")) { setEnabled(false); MemoryTimeAttack memory_timeattack = [B]new MemoryTimeAttack();[/B] memory_timeattack.addWindowListener(new MemoryWindowListener()); memory_timeattack.setVisible(true); } } } ... MemoryTimeAttack: package Memory; public class [B]MemoryTimeAttack[/B] extends [B]JFrame[/B] { ... private MemoryField field = new MemoryField(title); ... [B]public void isGameEnd() [/B]{ if(field.getRightFlippedCards() == ((field.getFieldSize() * field.getFieldSize())/2)){ System.out.println("DAS SPIEL IST VORBEI !!"); field.isGameEnd = true; [B][U]showDone();[/U][/B] }else field.isGameEnd = false; } [B][U]public void showDone()[/U][/B] { setEnabled(false); MemoryTimeAttackDone done = new MemoryTimeAttackDone(); done.addWindowListener(new MemoryDoneWindowListener()); done.setVisible(true); } public class MemoryDoneWindowListener implements WindowListener { public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { setEnabled(true); e.getWindow().dispose(); } public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} } ... MemoryField: package Memory; public class MemoryField extends [B]JPanel[/B]{ ... [B]static int rightFlippedCards;[/B] [B]static boolean isGameEnd;[/B] ... [B]static void setEndGameVariables() {[/B] rightFlippedCards = MemoryCard.rightFlippedCards; isGameEnd = MemoryCard.isGameEnd; if(gameType.equals("Time Attack")) [B][U]MemoryTimeAttack.isGameEnd();[/U][/B] } public int getFieldSize() { return fieldSize; } public int getRightFlippedCards() { return rightFlippedCards; } public boolean isGameEnd() { return isGameEnd; } ... MemoryCard: package Memory; public class MemoryCard extends [B]JPanel[/B]{ ... [B]static boolean isGameEnd = false;[/B] [B]static int rightFlippedCards = 0;[/B] ... public class MemoryCardListener implements ActionListener { public void actionPerformed(ActionEvent e) { ... [B]MemoryField.setEndGameVariables();[/B] ... } ... Ich rufe in MemoryCard die static methode setEndGameVariables von MemoryField auf. Diese setzt dann die static Instanzvariablen von MemoryField und ... führt die static methode isGameEnd von MemoryTimeAttack aus. Das ist mein Problem: Wenn ich die Methode isGameEnd static mache kann ich dann die Methode showDone() nicht aufrufen weil diese public ist. Ich kann die showDone() methode aber auch nicht static machen sonst kann ich setEnabled(false) nicht ausführen ... und ich muß in der Klasse MemoryTimeAttack das fenster done vom typ MemoryTimeAttackDone erstellen sonst kann ich kein Windowlistener damit verknüpfen. Ich hoffe ihr versteht meine Problematik ... ich vermute dass ich das ohne Großes umstrukturieren nicht lösen kann. Ich bin für jeden der sich da reingelesen hat und antwortet sehr Dankbar ! Gruß Adrian ! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ksg9-sebastian Geschrieben 8. Dezember 2005 Teilen Geschrieben 8. Dezember 2005 Ähm... das ist kein programmiertechnisches Problem sondern ein Fehler in der Architektur. 1. Was macht eine isGameEnd-Methode in der Klasse MemoryTimeAttack? 2. Was macht isGameEnd in einer Memory-Karte? 3. Was macht ein rightFlippedCards in der Klase Memory-Karte ? Du solltest das ganze nochmal überdenken...denn so ist es nicht korrekt. - gameEnd gehört in den GameController - rightedFlippedCards in die Model-Klasse Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Adrian_S Geschrieben 8. Dezember 2005 Autor Teilen Geschrieben 8. Dezember 2005 Hi danke für die Antwort ! Ich hab mir das schon so gedacht, das ganze um zustrukturieren. Aber bevor ich anfange alles umzuschreiben wollte ich nochmal 100% sicher gehen, ob es nicht doch eine lösung gibt das so zu realisieren. ich prüf doch jedesmal die memorykarte ob das spiel vorbei ist ... wo soll ich das denn sonst prüfen ? da jede karte ein JButton ist, versehen mit einem actionlistener. Theoretisch müßte ich das ja im JFrame prüfen (weil in diesem das Spielfeld existiert), aber auf welches ereignis soll ich denn dann warten und reagieren ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Arvid_ Geschrieben 8. Dezember 2005 Teilen Geschrieben 8. Dezember 2005 Ohne jetzt besserwisserisch klingen zu wollen (aber vermeiden lässt sich das leider nicht)... Software-Entwicklung beginnt mit Konzeptarbeit. Und wenn die gewissenhaft durchgeführt wurde, können einem kaum noch Fehler beim Programmieren passieren. Tut mir Leid, dass das jetzt nicht sehr konstruktiv war. Aber du weißt ja sicherlich... Beste Grüße & viel Erfolg beim Umwürfeln deines Memory-Spiels! Arvid. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Adrian_S Geschrieben 8. Dezember 2005 Autor Teilen Geschrieben 8. Dezember 2005 alles klar... danke für die antworten ... werde das ganze Ding umkrempeln ... wenn ich das soweit geschafft hab werd ich dann hier mal den link zum spiel posten ! p.s.: das ist eine studienaufgabe in dem fach Softwareengineering peinlich was werd mich in der Vorlesungsfreien zeit drum kümmern und was dazu lernen Gruß Adrian Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ksg9-sebastian Geschrieben 9. Dezember 2005 Teilen Geschrieben 9. Dezember 2005 du könntest das ganze so umpfuschen, dass du die Listener in die Controller-Klasse einbaust, ist nicht schön aber es würde funktionieren. Aber implementier besser gleich mit dem MVC-Pattern (Model-View-Control) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.