Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Im Kreis coden ...

Empfohlene Antworten

Veröffentlicht

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 !

Ä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

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 ?

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...

48e482d2191922ce99bdd8b8dfdfc69c0.png

Beste Grüße & viel Erfolg beim Umwürfeln deines Memory-Spiels!

Arvid.

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

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)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.