Memory Spiel

Diskutiere Memory Spiel im Java Basics - Anfänger-Themen Bereich.
B

bene98

Hi, Ich würde gerne ein Memory-Spiel machen. Allerdings nicht für mich, sondern für die Kinder meines Bruders.
Ich hab mal die Anlage grob überlegt. Bitte macht Vorschläge zur Verbesserung und Vereinfachung.

Public class Memory extends JFrame implemets ActionListener

Felder:

Image Icons (back und front(ArrayList))

Image Icon erste Karte
Image Icon zweite Karte
Button (ArrayList)
JPanels
JLabel Versuche
JLabel richtige Paare, Anzahl Versuche



Konstruktor public Memory()

JButtons als ArrayList über for -Schleife

ImageIcon auf die Button legen und dem Panel hinzufügen.



Main-Methode { neue Instanz von Memory, Methode imSpiel() aufrufen}



public void imSpiel ()

shuffle (ArrayList)



actionPerformed (ActionEvent e)

über e.getSource wird der gedrückte Button festgestellt.

Bei diesem Button wechselt das ImageIcon von back auf front.

Über getImage() wird die erste Karte zwischengespeichert

Aufruf Methode zweite Karte()



public void zweite Karte( Image Icon erste Karte)

erste Karte sollte umgedreht bleiben.

über e.getSource wird der zweite gedrückte Button festgestellt.

Bei diesem Button wechselt das Image Icon von back auf front.

Bei dem gedrückten Button wird festgestellt, ob das angezeigt Image Icon mit der ersten Karte übereinstimmt.

Über remove() werden die Buttons aus der Button-Array-List entfernt.
 
T

thecain

Was ist nun die Frage? Den Kindern wird ja egal sein wie der Code aussieht, wenn sie damit spielen sollen.
 
B

bene98

Java:
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.swing.AbstractButton;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.io.*;
import java.util.ArrayList;
import java.util.Random;

public class memoryspiel {
    JFrame mframe;
    JPanel mpanel;
    ArrayList<ImageIcon> vorderseite;
    Spieler spieler1= new Spieler("Bene", 0);
    ImageIcon rückseiteIcon;
    ImageIcon vorderseiteIcon2 = new ImageIcon();
    ImageIcon zahlicon;
    ImageIcon vorderseiteIcon;
    JButton mbutton;
    ArrayList<JButton> buttons;
    int counter;
    int zahl;
    int temp2;
    int z;
    int y;
    JButton temp;
    JButton temp3;

    public memoryspiel() throws IOException {
        mframe = new JFrame();
        mframe.setSize(800, 800);
        mpanel = new JPanel();
    

    }

    public void erzeugeBildArray() throws IOException {

        vorderseite = new ArrayList<>();

        BufferedImage vespa = ImageIO.read(new File("C:\\Users\\Benedikt\\eclipse-workspace\\Memory\\vespa.jpg"));
        ImageIcon vespaIcon = new ImageIcon(vespa);
        BufferedImage ape = ImageIO.read(new File("C:\\\\Users\\\\Benedikt\\\\eclipse-workspace\\\\Memory\\ape.jpg"));
        ImageIcon apeIcon = new ImageIcon(ape);
        BufferedImage mini = ImageIO.read(new File("C:\\Users\\Benedikt\\eclipse-workspace\\Memory\\mini.jpg"));
        ImageIcon miniIcon = new ImageIcon(mini);
        BufferedImage porsche911 = ImageIO.read(new File("C:\\Users\\Benedikt\\eclipse-workspace\\Memory\\911.jpg"));
        vorderseiteIcon = new ImageIcon(porsche911);
        BufferedImage typH = ImageIO.read(new File("C:\\Users\\Benedikt\\eclipse-workspace\\Memory\\typH.jpg"));
        ImageIcon typHIcon = new ImageIcon(typH);
        vorderseite.add(vespaIcon);
        vorderseite.add(apeIcon);
        vorderseite.add(miniIcon);

        vorderseite.add(typHIcon);
        vorderseite.add(vespaIcon);
        vorderseite.add(apeIcon);
        vorderseite.add(miniIcon);
    
        vorderseite.add(typHIcon);
        
        
        
        erzeugeButtons();
    }

    public void  Bildlöschen (int z, int y) {
        int q=z;
        int k=y;
    ImageIcon temp= (ImageIcon) ((AbstractButton) buttons.get(q)).getIcon();
    ImageIcon temp2= (ImageIcon) ((AbstractButton) buttons.get(k)).getIcon();
    if (temp==temp2) {((AbstractButton) buttons.get(q)).setIcon(vorderseiteIcon); ((AbstractButton) buttons.get(k)).setIcon(vorderseiteIcon);
    counter=0;
    }
    }
    
    
    
    
    
    
    public void erzeugeButtons() throws IOException {
        buttons = new ArrayList<>();

        BufferedImage rückseite = ImageIO.read(new File("C:\\Users\\Benedikt\\eclipse-workspace\\Memory\\bean.jpg"));
         rückseiteIcon = new ImageIcon(rückseite);

        for (int i = 0; i < vorderseite.size(); i++) {
            mbutton = new JButton();
            mbutton.setIcon(rückseiteIcon);
            mbutton.setActionCommand("1");

            mbutton.addActionListener(new AcListener());
            buttons.add(mbutton);
            mpanel.add(mbutton);
            mframe.add(mpanel);
        }
    
        
        

        mframe.setVisible(true);

    }

    
    
    
    class AcListener implements ActionListener {
    
        
    

        public void actionPerformed(ActionEvent e) {
            temp = (JButton) e.getSource();
            counter ++;
            if (counter <2) {
            
            z = buttons.indexOf(temp);
            System.out.println(z);
            ImageIcon temp2 = vorderseite.get(z);
            temp.setIcon(temp2);}
        if (counter==
                2) {temp3=(JButton) e.getSource();
        y=buttons.indexOf(temp3); ImageIcon temp4=vorderseite.get(y); temp3.setIcon(temp4); Bildlöschen(z,y);}
        
        if (counter>2 && buttons.get(z).getIcon() != buttons.get(y).getIcon()) {
         buttons.get(z).setIcon(rückseiteIcon); buttons.get(y).setIcon(rückseiteIcon); counter=0;  }  }
        
        
        }   
    
        

    

    public static void main(String[] args) throws IOException {
        memoryspiel memoryspiel2 = new memoryspiel();
        memoryspiel2.erzeugeBildArray();
        

    }

}
 
B

bene98

Ich habs jetzt angefangen. Meine Frage: Wie kann ich die sache für mehrere Spieler machen?
Eine Klasse "public" Spieler in der ich mehrere Spieler anlege (int punkte, String name) und dann eine Methode "prüfeVersuch" und dann eben ein Verweis aus der action performed Methode spieler1.prüfeVersuch? Wie kann ich dann automatisch wechseln zwischen den spielern? Auch über ne counter variable oder besser über einen Button?
Danke
 
krgewb

krgewb

@bene98 Angenommen, ein Spieler dreht zwei Karten um und sie zeigen nicht dasselbe Motiv, dann soll ja nicht sofort der andere Spieler dran sein. Man wüsste ja nicht, welches Motiv die zweite Karte hat. Deshalb habe ich einen Button "wieder verdecken" gemacht. Erst wenn dieser Button angeklickt worden ist, ist der nächste Spieler an der Reihe.

Da ich nur zwei Spieler zulasse, habe ich es ohne ArrayList gemacht.
 
B

bene98

Ok das scheint mir sinnvoll. Bis jetzt muss man bei mir ein drittes mal klicken, dann decken sich die Karten wieder zu.

Grundsätzlich wäre das Spiel ohne GUI noch sinnvoller gewesen. Aber jetzt bin ich ja schon weiter und wollte es reinbauen. In alter Handwerkermanier und nach dem Motto "Was nicht passt, wird passend gemacht." Aber ich denk nächstes mal besser dürber nach.
 
mihe7

mihe7

Ohne GUI? Das stelle ich mir schwerer vor.
Das ist relativ einfach, weil Du Dich auf den Kern des Spiels konzentrieren kannst, ohne Dich um den ganzen UI-Käse kümmern zu müssen :)

Wie läuft so ein Spiel ab bzw. könnte so ein Spiel ablaufen?

1. Start: alle Karten werden auf dem Tisch verdeckt zufällig verteilt
2. Zug: der Spieler, der an der Reihe ist, deckt nacheinander zwei Karten auf. Bilden diese ein Paar, darf er sie an sich (vom Tisch) nehmen, ansonsten muss er sie wieder umdrehen.
3. Ablauf: die Spieler führen nacheinander einen Zug durch. Die Reihenfolge ist vorab bestimmt. Nach dem letzten Spieler wird wieder beim ersten Spieler begonnen.
4. Ende: das Spiel endet, wenn keine Karten mehr auf dem Tisch liegen
5. Punkte: jeder Spieler erhält für jedes Paar, das er vom Tisch genommen hat, einen Punkt.

So eine Beschreibung mag detailliert erscheinen, tatsächlich taugt das aber nur als Ausgangspunkt für die weitere Analyse. Dabei werden noch einige Detailfragen auftauchen, da vieles als bekannt vorausgesetzt wird oder nur implizit gegeben ist. Zum Beispiel fehlt die Info, dass die Karten auf dem Tisch in Spalten und Zeilen geordnet abgelegt werden, oder dass die Karten nur paarweise verteilt werden können usw.

Wie auch immer: das alles hat nichts mit dem GUI zu tun und wie man sieht, gibt es genug Probleme, die gelöst werden müssen, ohne sich auch noch parallel dazu das UI aufhalsen zu müssen.
 
B

bene98

Guten Tag,
1. )Ich brauch also eine run()_methode , die ich mit einer while-Schlife und einem boolean anfangs laufend setze und nicht-laufend, wenn alle Karten weg sind.
2.) Diese Mehtode müsste dann auch das Spielfeld verwalten und graphisch aufbauen, weil das Spielfeld so aktuell gehalten wird.
3.) Ich brauch eine Bildlöschen-Methode, die Elemente aus der Button-Liste entfernen kann.
4.) Ich brauche eine prüfeRateversuch-Methode, die feststellt, ob der Rateversuch erfolgreich war. Dieser Methode müsste der aktuelle Spieler übergeben werden. Sie prüft die Übereinstimmung der Bilder (oder kann man das auch über den getActionComman-Befehl der Buttons machen?)
und gibt die Punkte der Spieler zurück.
5.) Über einen Button kann der Spieler gewechselt werden, wobei ich das bisher nicht kann. Ich dachte man könnte das über eine Setter-Methode machen, aber hierfür bräuchte ich einen Tipp.

Danke für die Hilfe!
 
krgewb

krgewb

Wenn ein Spieler einen Punkt hat, werden bei mir die beiden Kärtchen nicht entfernt. Gefundene Pärchen bleiben für immer aufgedeckt liegen.
 
krgewb

krgewb

Wenn ein Spieler einen Punkt macht, werden bei mir die beiden Kärtchen nicht entfernt. Gefundene Pärchen bleiben für immer aufgedeckt liegen.
 
T

temi

ja, war meine idee wie man die Anregungen umsetzen könnte.
Da hast du aber @mihe7 s Anregung
ohne Dich um den ganzen UI-Käse kümmern zu müssen
irgendwie falsch verstanden.

Überlege dir doch erst mal, welche Klassen für das Spiel in welcher Weise miteinander agieren müssen.

Solche Sachen wie diese:
graphisch aufbauen
Bildlöschen-Methode
getActionComman-Befehl
kommen da noch gar nicht vor.


Konzentriere dich zunächst nur auf die Spiellogik. Die UI verwendet dann später diese Spiellogik und sollte separat von dieser implementiert werden.
 
B

bene98

ok, das hab ich dann wohl noch nicht so gut trennen können. Ist aus meiner Sicht bei dem Spiel mit Bildern aber auch etwas schwieriger als ohne Bilder.
 
B

bene98

Hallo, Ich habe versucht, mich auf die Spiellogik zu konzentrieren. wenige Elemente der GUI sind zwar enthalten, aber fast nur dann, wenn sie für die Spiellogik wichtig sind.

Klasse Memoryspiel:

Felder:

int richtigeAntwort;

ArrayList <ImageIcons> bilderliste

ArrayList <JButton> buttons;

Image Icon grünerHaken;

Image Icon Rückseite;



Konstruktor Memoryspiel:

Teile der Gui werden erzeugt(JFrame).

Methoden:

erzeugeBilderliste () – Image Icons werden der bilderliste hinzugefügt.

erzeugeButtons () – Buttons werden erzeugt in die Liste buttons eingefügt und auf JFrame gesetzt.

spieleSpiel () – while (bilderliste.size !=0) { aktuellerSpieler.gibAntwort}

public void prüfeAntwort (antwort1+antwort)

Wenn antwort 1 =Antwort a wird der Index des Bildes als int richtige Antwort festgehalten.

aktuellerSpieler.punktePaare wird erhöht. Methode Bildlöschen wird aufgerufen mit dem int richtige Antwort als Parameter.

Wenn antwort1 != antwort2 wird die Rückseite erneut gesetzt.

bildLöschen (int richtigeAntwort)

Das Bild mit dem Index wird aus der Bilderliste gelöscht. Der Button erhält ein Bild mit einem grünen Haken.



Main-Methode / Erzeugen einer neuen Instanz des Spiels -





Klasse Spieler:

String name;

int antwort1, antwort2

int counter;

spieler1=new Spieler (“ “; 0)

spieler2=new Spieler (““,0)

Spieler aktuellerSpieler= new Spieler();

JButton spielerwechseln;

Konstruktor Spieler (String name, int punktePaare)


Methoden

gibAntwort () – dies könnte auch die action performed _Methoder der Buttons sein.

wenn der Button Spieler wechseln gedrückt wird, wird jeweils der Index der beiden umgedrehten Karten festgehalten. Die Methode prüfeAntwort aus der Klasse memorySpiel wird aufgerufen mit den Parametern antwort 1+antwort2.

wechseleSpieler(aktueller Spieler)

wenn der aktuelle Spieler spieler1 ist, soll Spieler 2 gesetzt werden und andersherum.
 
Zuletzt bearbeitet:
Thema: 

Memory Spiel

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben