Memory-Spiel Aktivierung der Methode mit Timer

Diskutiere Memory-Spiel Aktivierung der Methode mit Timer im Java Basics - Anfänger-Themen Bereich.
J

JustNobody

Der Schritt ist auch in Ordnung. Und ja - ich liebe es, so Dinge in Methoden zu schieben, da der Code dadurch lesbarer wird. Im Clean Code gibt es diesbezüglich einige Aussagen. Wenn dich das Thema interessiert, dann kannst Du später z.B. einmal clean-code-developer.de ansehen.

Der Code mit Methoden könnte dann z.B. so aussehen:
Java:
        public boolean istSpielerDran() {
            return spieler == 0;
        }
        public boolean istComputerDran() {
            return spieler == 1;
        }

        public boolean hatKartenUmgedreht() {
            return umgedrehteKarten != 0;
        }

        private void schummlen() {//Aufgabe 3
            System.out.println("geschummelt");
            
            if (!istSpielerDran()) {
                System.out.println("Du bist derzeit nicht dran, warte bist du dran bist");
                return;
            }
            
            if (hatKartenUmgedreht) {
                System.out.println("Du hast schon eine Karte aufgedeckt und kannst daher nicht mehr schummeln");
                return;
            }
            
            // Jetzt wollen wir alle Karten durchgehen 
            // und jede Karte prüfen, ob die Karte noch im Spiel ist.
        }
Der nächste Schritt ist da schon einmal als Kommentar angegeben. Sogar zwei Schritte.

Wir haben ja alle Karten in der Klasse gespeichert ... jetzt wollen wir alle Karten einmal durchgehen. Dazu brauchen wir einen Code.

Code:
Schleife Über alle Karten {
    // Erst noch nichts machen ...
}
Und wenn Du den Code hast, dann brauchen wir eine Prüfung, ob die Karte noch im Spiel ist.
Code:
Schleife Über alle Karten {
    if (karte.istKarteImSpiel()) {
        // Erst noch nichts machen ...
    }
}
==> Achtung: Hier musst du dann auch die Klasse von der Karte anpassen. Wenn Du ein private Feld mit einer Information hast, dann kannst Du da z.B. ein Getter erstellen oder eine andere Methode, die public ist, damit Du Zugriff hast. Das Feld selbst bleibt private.

Und wenn Du das auch noch hast: die nächsten Schritte, die Du Dir überlegen kannst:

3. Schritt: Jede Karte, die noch im Spiel ist, wird aufgedeckt.

4. Schritt: Wenn Du mit der Schleife fertig bist, brauchen wir einen Timer, damit nach einer gewissen Zeit die Karten wieder umgedreht werden. Also brauchen wir so einen Timer, wie Du zuerst bei der Karte mit eingebaut hattest.

5. Schritt: In der Methode, die dann durchläuft, gehst Du wieder alle Karten durch (Siehe erster Schritt in diesem Post! Kannst Du also 1:1 übernehmen)

6. Schritt: Du prüft die Karte, ob sie noch im Spiel ist (Siehe Schritt 2!)

7. Schritt: Wenn die Karte noch im Spiel ist, drehst Du sie zurück.

Jetzt ganz wichtig: Mach wirklich jeden Schritt einen nach dem anderen. Wenn Du auf ein Problem stößt: Direkt melden. Ich selbst bin leider nebenher auch etwas beschäftigt, so dass ich das doch deutlich zeitversetzter sehe, so dass ich Dir die Chance geben will, da nicht ständig auf mich warten zu müssen....
 
J

Java11.03.2019

Leider bin ich mir hiermit nicht sicher...
Java:
for (int aussen = 0; aussen < 2; aussen++)
            for (int innen = 0; innen < 21; innen++)
                gemerkteKarten[aussen][innen] = -1;
 
J

JustNobody

Leider bin ich mir hiermit nicht sicher...
Java:
for (int aussen = 0; aussen < 2; aussen++)
            for (int innen = 0; innen < 21; innen++)
                gemerkteKarten[aussen][innen] = -1;
Da fehlt mir jetzt gerade der genaue Kontext.

Nach meinem Verständnis ist gemerkteKarten doch nur ein "Gedächtnis" für den Computer. Das musst Du beim Mogeln nicht mit anpacken.

Oder um was geht es Dir dabei? Welchen Teil der Aufgabe willst Du so anpassen?
 
J

Java11.03.2019

Der Schritt ist auch in Ordnung. Und ja - ich liebe es, so Dinge in Methoden zu schieben, da der Code dadurch lesbarer wird. Im Clean Code gibt es diesbezüglich einige Aussagen. Wenn dich das Thema interessiert, dann kannst Du später z.B. einmal clean-code-developer.de ansehen.

Der Code mit Methoden könnte dann z.B. so aussehen:
Java:
        public boolean istSpielerDran() {
            return spieler == 0;
        }
        public boolean istComputerDran() {
            return spieler == 1;
        }

        public boolean hatKartenUmgedreht() {
            return umgedrehteKarten != 0;
        }

        private void schummlen() {//Aufgabe 3
            System.out.println("geschummelt");
           
            if (!istSpielerDran()) {
                System.out.println("Du bist derzeit nicht dran, warte bist du dran bist");
                return;
            }
           
            if (hatKartenUmgedreht) {
                System.out.println("Du hast schon eine Karte aufgedeckt und kannst daher nicht mehr schummeln");
                return;
            }
           
            // Jetzt wollen wir alle Karten durchgehen
            // und jede Karte prüfen, ob die Karte noch im Spiel ist.
        }
Der nächste Schritt ist da schon einmal als Kommentar angegeben. Sogar zwei Schritte.

Wir haben ja alle Karten in der Klasse gespeichert ... jetzt wollen wir alle Karten einmal durchgehen. Dazu brauchen wir einen Code.

Code:
Schleife Über alle Karten {
    // Erst noch nichts machen ...
}
Und wenn Du den Code hast, dann brauchen wir eine Prüfung, ob die Karte noch im Spiel ist.
Code:
Schleife Über alle Karten {
    if (karte.istKarteImSpiel()) {
        // Erst noch nichts machen ...
    }
}
==> Achtung: Hier musst du dann auch die Klasse von der Karte anpassen. Wenn Du ein private Feld mit einer Information hast, dann kannst Du da z.B. ein Getter erstellen oder eine andere Methode, die public ist, damit Du Zugriff hast. Das Feld selbst bleibt private.

Und wenn Du das auch noch hast: die nächsten Schritte, die Du Dir überlegen kannst:

3. Schritt: Jede Karte, die noch im Spiel ist, wird aufgedeckt.

4. Schritt: Wenn Du mit der Schleife fertig bist, brauchen wir einen Timer, damit nach einer gewissen Zeit die Karten wieder umgedreht werden. Also brauchen wir so einen Timer, wie Du zuerst bei der Karte mit eingebaut hattest.

5. Schritt: In der Methode, die dann durchläuft, gehst Du wieder alle Karten durch (Siehe erster Schritt in diesem Post! Kannst Du also 1:1 übernehmen)

6. Schritt: Du prüft die Karte, ob sie noch im Spiel ist (Siehe Schritt 2!)

7. Schritt: Wenn die Karte noch im Spiel ist, drehst Du sie zurück.

Jetzt ganz wichtig: Mach wirklich jeden Schritt einen nach dem anderen. Wenn Du auf ein Problem stößt: Direkt melden. Ich selbst bin leider nebenher auch etwas beschäftigt, so dass ich das doch deutlich zeitversetzter sehe, so dass ich Dir die Chance geben will, da nicht ständig auf mich warten zu müssen....

Ich wollte mit deinen Schritten weitermachen, die Schleife erstellen und prüfen welche Karten noch im Spiel sind.
Ja du hast mit dem Gedächtnis recht, nur weiß ich nicht wie ich prüfen soll ob die Karten noch im Spiel sind.

Ich weiß ich stelle mich an wie der letzte Mensch, ich bin wohl in einem Lerntief.

Java:
/**
 * Aufgabe 3
 */
    public boolean istSpielerDran() {
        return spieler == 0;
    }
    
    public boolean istComupterDran() {
        return spieler == 1;
    }
    
    public boolean hatKartenUmgedreht() {
        return umgedrehteKarten != 0;
    }

    private void schummlen() {//Aufgabe 3
        System.out.println("geschummelt");
            
        if (!istSpielerDran()) {//wenn der Computer dran ist
            System.out.println("Du bist derzeit nicht dran, warte bist du dran bist");
            return;
        }
        
        if (hatKartenUmgedreht()) {//wenn der Mensch dran ist
            System.out.println("Du hast schon eine Karte aufgedeckt und kannst daher nicht mehr schummeln");
            return;
        }

//in Bearbeitung    
        
        for (int aussen = 0; aussen < 2; aussen++)
            for (int innen = 0; innen < 21; innen++);
                if (karte.istKarteImSpiel()) {//ich habe leider keine Idee wie die Prüfung aussehen könnte
                    return;
                }
        
    }
 
J

JustNobody

Also Du hast (stark gekürzt):
Java:
public class MemoryKarte extends Button {
    private boolean nochImSpiel;//ist die Karte noch im Spiel?
}
==> Da kann man einen Getter zu schreiben.

Und Du hast (ebenfalls stark gekürzt):
Java:
public class MemoryFeld extends JFrame {
    private MemoryKarte[] karten;//das Array für die Karten
}
Damit sollte sich doch etwas anfangen lassen, oder?
 
J

Java11.03.2019

Wie entfernst Du denn eine Karte aus dem Spiel?
Mit der Methode karteSchliessen() in der Klasse "MemoryFeld"
Java:
    private void karteSchliessen() {
        boolean raus = false;       
        if (paar[0].getBildID() == paar[1].getBildID()) //ist es ein Paar?
            raus = true;       
        paar[0].rueckseiteZeigen(raus);//wenn es ein Paar war, nehmen wir die Karten aus dem Spiel, sonst drehen wir sie nur wieder um
        paar[1].rueckseiteZeigen(raus);       
        umgedrehteKarten = 0;//es ist keine Karte mehr geöffnet       
        if (raus == false) { //hat der Spieler kein Paar gefunden?           
            spielerWechseln();//dann wird der Spieler gewechselt
        }
        else                       
            if (spieler == 1)//hat der Computer ein Paar gefunden?, dann ist er noch einmal an der Reihe
                computerZug();
    }
und der Methode rueckseiteZeigen() in der Klasse "MemoryKarte
Java:
    public void rueckseiteZeigen(boolean rausnehmen) {//Methode zeigt die Rückseite der Karte an
        if (rausnehmen == true) {//soll die Karten komplett aus dem Spiel genommen werden?           
            setGraphic(new ImageView("grafiken/aufgedeckt.jpg"));//das Bild aufgedeckt zeigen und die Karte aus dem Spiel nehmen
            nochImSpiel = false;
        }
 
mihe7

mihe7

Karte hat also eine Instanzvariable, die nochImSpiel heißt. Dann sollte die Methode istKarteImSpiel() doch trivial sein, oder?
 
J

Java11.03.2019

kann mir einer zeigen wie das umzusetzen ist, am besten lerne ich wohl beim zuschauen, ich bin aktuell ahnungslos und sehr verzweifelt
 
mrBrown

mrBrown

BTW: du vermischt da JavaFX und Swing, das wird dir irgendwann auf die Füße fallen...
Statt dem JOptionPane kannst du einfach einen Dialog nehmen, und extends JFrame kann ersatzlos weg.
 
J

Java11.03.2019

danke für den Hinweis, aber das ist gerade meine geringste Herausforderung :)
 
mihe7

mihe7

Java:
       for (int aussen = 0; aussen < 2; aussen++)
            for (int innen = 0; innen < 21; innen++);
                if (karte.istKarteImSpiel()) {//ich habe leider keine Idee wie die Prüfung aussehen könnte
                    return;
                }
Die Methode "istKarteImSpiel()" hast Du jetzt und es geht einfach mit 3. aus Kommentar #21 weiter:

3. Schritt: Jede Karte, die noch im Spiel ist, wird aufgedeckt.
Statt dem return musst Du also die Karte aufdecken.
 
J

JustNobody

Öhm, was ist denn da dieses "karte" für eine Variable? Und warum wird die so oft geprüft? (2*21 = 42 Mal wird diese Variable geprüft ... ohne dass die Karte einen neuen Inhalt bekommt!)

Die zwei Schleifen stammen noch vom Versuch, über das zweidimensionale Array gemerkteKarten zu gehen und das hatten wir doch bereits durch #23 und #26 als nicht korrekt erkannt .... das war zumindest meine Hoffnung. In #26 habe ich aufgezeigt, dass es ein eindimensionales Array karten gibt - evtl. böte sich dieses ja hier an so euch nichts besseres einfallen sollte...
 
J

Java11.03.2019

@JustNobody ,
danke für den Hinweis, mein Kopf war voll und ich konnte wohl nichts mehr aufnehmen.

Der folgende Code sollte jetzt passen, jetzt versuche ich alle Karten die noch im Spiel sind aufzudecken.
Java:
        for (int i = 0; i <= 41; i++) {
            System.out.print(i);
            if (karten[i].isNochImSpiel())//den Wert der Variablen isnochImSpiel (true)
                    System.out.print(karten[i].isNochImSpiel());          
            }
 
J

Java11.03.2019

@JustNobody & @mihe7 ,
es war eine sehr schwierige Geburt, nun habe ich es endlich.
Am meisten hakte es an if (karten[i].isNochImSpiel()), die Logik dahinter verstehe ich noch nicht ganz, aber so ist halt die Syntax.
Euch vielen Lieben Dank, insbesondere für eure Geduld, ohne euch hätte ich das nie geschafft.
Vllt. schreibt man sich nochmal, würde mich freuen.

Wenn ihr Unterstützung bei den Finanzen oder ähnliches braucht, wendet euch gerne an mich.
Die Kernkompetenz meiner Seits liegt in der Finanzbuchhaltung und Investitionen von P2P Kredite sowie ETFs.

Jetzt kümmere ich mich ums Fine Tuning :)

Klasse "MemoryFeld"
Java:
/**
* Aufgabe 3
*/
    public boolean istSpielerDran() {
        return spieler == 0;
    }
   
    public boolean istComupterDran() {
        return spieler == 1;
    }
   
    public boolean hatKartenUmgedreht() {
        return umgedrehteKarten != 0;
    }

    private void schummlen() {//Aufgabe 3
        System.out.println("geschummelt");
           
        if (!istSpielerDran()) {//wenn der Computer dran ist
            System.out.println("Du bist derzeit nicht dran, warte bist du dran bist");
            return;
        }
       
        if (hatKartenUmgedreht()) {//wenn der Mensch dran ist
            System.out.println("Du hast schon eine Karte aufgedeckt und kannst daher nicht mehr schummeln");
            return;
        }
       
        for (int i = 0; i <= 41; i++) {
            if (karten[i].isNochImSpiel())//den Wert der Variablen isnochImSpiel (true)
                karten[i].kartenAufdecken();
            }      
       
        timer = new Timeline(new KeyFrame(Duration.millis(2000), new TimerHandler1()));//den Timer erzeugen          
        timer.play();//und starten  
    }
   
    private void alleKartenZudecken() {     
        for (int i = 0; i <= 41; i++) {
            if (karten[i].isNochImSpiel())//den Wert der Variablen isnochImSpiel (true)
                karten[i].kartenZudecken();
            }
    }
Klasse "MemoryFeld"
Java:
    class TimerHandler1 implements EventHandler<ActionEvent> {
        @Override
        /**
         * Methode ruft die Methode alleKartenZudecken() auf
         */
        public void handle(ActionEvent arg0) {
            alleKartenZudecken();
        }
    }
Klasse "MemoryKarte"
Java:
    public void kartenAufdecken() {//Aufgrabe 3 die Methode deckt alle Karten auf
        setGraphic(bildVorne);  
    }

    public void kartenZudecken() {
        setGraphic(bildHinten);
       
    }
 
Thema: 

Memory-Spiel Aktivierung der Methode mit Timer

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben