Java memory spiel

ka

Grünschnabel
huhu dud!
Also ich hab da mal n problem.... wir sollen uns in der schule ein Projekt überlegen was wir dann mit Java realisieren....
So dann kam mir die Idee ein memory Spiel zu proggen...
nun ist meine Frage ob jemand Anregung oder ähnliches für mich hat, da ich noch nich so fitt in java bin... und nich weiß woh ich anfangen soll.

Wäre n1ce! 'ka :p
 
Fang mit der Oberflache an.
Zuerst wie ereuge ich eine Fenster ?
Dann wie kann ich eine Grafik im Fenster anzeigen um eine Karte anzuzeigen? Wie kann ich eine Listner/Beobachter zur Grafik hinzufugen?
Dann kommt das umdrehnen der Karte also das erstetzten der einen Grafik durch die andere Grafik.
Fuer all das hat Java diverse Moglichkeiten, probier sie aus um festzustellen welche dir am besten liegt.

Dann solltest du fest stellen wie aufwendig das Spiel werden soll und einen Anforderungskatalog erstellen.
 
Hi,

also ich würd mir erstmal überlegen wie ich das Spiel in verschiedene Komponenten zerlegen kann und die sauber auf ein Entwicklungskonzept projezieren.

z.B.: Könntest Du hier ein MVC-Konzept aufziehen:

Du betrachtest das Spiel:
Das Modell:

Die Abbildungen der Regeln, Verwalten des Zustandsmodelles, Datensätze verwalten, etc.

Der View:

Der Graphische Teil. Dieser wird von dem Modell über eine art Update Mechanismus aufgerufen. Jedesmal wenn sich etwas am Modell ändert, muss die Graphische Ansicht geändert werden (oder auch nicht, kommt auf die Änderung an).

Controller:

Er gibt Aktionen von aussen an das Modell weiter, welches daraufhin seinen Zustand ändert, etc.

Dies ist allerdings eine sehr kurze beschreibung.
Es sollte auch nur verdeutlichen, das man von anfang an ein Konzept erstellen sollte, anstatt blind drauf loszuschreiben. Erleichtert die Wartung für später und man hat jederzeit einen sauberen Überblick ;)

Ich persönlich würde erstmal das regelwerk umsetzen in einem Modell, vorkommende Datentypen erarbeiten und die jeweilige Verwaltungslogik implementieren.

Danach würde ich die Graphische Oberfläche erzeugen, welche auch den Controller beinhalten würde (über ActionListener das Modell anstossen um einen neuen Zustand zu erreichen, etc.).

Dann tada, ist das Game fertig (naja, so einfach dann auch wieder nicht, aber wenigstens in der Theorie). Wenn du allerdings wenig bis gar nix mit Java, Swing, AWT, etc. gemacht hast, schau Dir erstmal die Tutorials auf der Java-Seite an, um einen Einstieg zu bekommen.


Grüsse

Torsten
 
Hallo!

Hier mal ein kleines Beispiel:
Java:
package de.tutorials.memory2;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main extends JFrame {

	private ImageIcon backIcon;

	private CardGame game;

	public Main() {
		super("Main");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c = getContentPane();
		game = new CardGame();
		backIcon = new ImageIcon(game.loadImage("e:/imgs/back.jpg"));
		game.init();

		CardPanel cp = new CardPanel();
		cp.populate(game.getCards());

		c.add(cp);

		pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new Main();
	}

	class Card extends JLabel {

		private ImageIcon icon;

		protected int id;

		protected boolean stillInGame = true;

		public Card(ImageIcon icon, int id) {
			this.icon = icon;
			this.id = id;
			setIcon(backIcon);
			setBorder(BorderFactory.createEtchedBorder());

			addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent evt) {
					game.selectCard(Card.this);
					game.checkCards();
				}
			});

		}

		public void showFront() {
			setIcon(this.icon);
		}

		public void showBack() {
			setIcon(backIcon);
		}
	}

	class CardPanel extends JPanel {

		final int MAX_ROWS = 4;

		final int MAX_COLUMNS = 4;

		public CardPanel() {
			setLayout(new GridLayout(MAX_ROWS, MAX_COLUMNS));
		}

		public void populate(List list) {
			for (Iterator iter = list.iterator(); iter.hasNext();) {
				add((Card) iter.next());
			}
		}
	}

	class CardGame {
		private List cards;

		private int selectionCount = 0;

		private Card current;

		private Card previous;

		public CardGame() {
			cards = new ArrayList();
		}

		public void init() {
			cards.clear();
			loadCards();
			Collections.shuffle(cards);
		}

		public Image loadImage(String imgPath) {

			final int MAX_WIDTH = 60;
			final int MAX_HEIGHT = 120;
			try {
				Image img = ImageIO.read(new File(imgPath)).getScaledInstance(
						MAX_WIDTH, MAX_HEIGHT, BufferedImage.SCALE_SMOOTH);
				return img;
			} catch (IOException e) {
				e.printStackTrace();
			}
			return null;
		}

		private void loadCards() {

			for (int i = 0; i < 8; i++) {
				ImageIcon icon = new ImageIcon(loadImage("e:/imgs/" + i
						+ ".jpg"));

				Card c = new Card(icon, i);
				cards.add(c);
				c = new Card(icon, i);
				cards.add(c);
			}
		}

		public void selectCard(Card c) {

			if (current == c)
				return;
			if (!c.stillInGame)
				return;
			c.showFront();
			if (selectionCount++ % 2 == 0) {
				if (current != null && previous != null) {
					current.showBack();
					previous.showBack();
				}
				current = null;
				previous = null;
			}

			previous = current;
			current = c;
		}

		public void checkCards() {
			if (current != null && previous != null)
				if (current.id == previous.id) {
					current.stillInGame = false;
					previous.stillInGame = false;
					current = null;
					previous = null;
					System.out.println("match");
				}
		}

		public List getCards() {
			return cards;
		}
	}
}

Gruß Tom
 

Anhänge

Zurück