2048

member42

Aktives Mitglied
Hallo,
ich wollte das Spiel "2048" programmieren, momentan bin ich gerade beim Verschieben der Felder. Hier meine Methode um die Felder nach rechts zu verschieben. Als Ergebnis bekomme ich in der obersten Reihe 00088. Müssten die beiden 8 dann nicht noch zur 16 werden?

Java:
    private int feld[][]= 
      {{4, 4, 0, 4, 4 },  // als Ergebnis 00088
      { 0,0, 0, 0, 0 },
      { 0,0, 0, 0, 0},
      { 0,0, 0, 0, 0 },
      { 0,0, 0, 0, 0 }
    };
   
    private int feldGroeße=5; 
   
    private boolean rechtsVerschieben() {

        int index = 0;

        for (int k = 0; k < feldGroeße; k++) {

            for (int i = 0; i < feldGroeße; i++) { //spalte

                for (int j = feldGroeße - 1; j > 0; j--) { /zeile

                    if (index == k) {
                        break;
                    }

                    if (feld[i][j] == feld[i][j - 1] && feld[i][j] != 0) {
                        feld[i][j] = feld[i][j] * 2; // 2 benachbarte Felder mit gleichem Inhalt addieren
                        feld[i][j - 1] = 0;
                        index++;
                    }

                    if (feld[i][j] == 0) {
                        feld[i][j] = feld[i][j - 1];
                        feld[i][j - 1] = 0;
                    }

                }
            }
        }

        if (index == 0) { // es wurde nichts verschoben
            return false;
        }

        return true; // Feld hat sich verändert ein leeres Feld kann mit 2 oder 4 gefüllt werden
    }
 

mihe7

Top Contributor
Wenn ich die Beschreibung des Spiels richtig verstanden habe, dann sollte bei einer Rechtsverschiebung doch eigentlich 0,0,4,8,4 rauskommen.
 

Robat

Top Contributor
Ich würde zb behaupten, dass da 0088 am Ende raus kommen muss.
Sollte doch aber am Ende auch egal sein, oder? Du kannst es ja interpretieren wie du möchtest und was du für sinnig hälst - ist ja schließlich deine Interpretation von dem Spiel 2048 ;)
 

mihe7

Top Contributor
Natürlich kann man es machen, wie man will - aber interessieren würde es mich jetzt schon, wie das Spiel eigentlich angedacht ist :)
 

MoxxiManagarm

Top Contributor
Ich habe das Spiel mal gespielt und ich bin mir ziemlich sicher, dass man 2 mal rechts verschieben musste um für diesen Fall 16 zu erreichen. Also aus meiner Sicht ist 00088 schon richtig. Stell dir vor du hast:

0 0 4 4 8
0 0 0 8 32
...

Es sollte dem Nutzer überlassen bleiben, ob er die resultierende 8 aus den 2x 4 mit der rechten oder der unteren 8 zusammenfügen will.
 

member42

Aktives Mitglied
OK,danke dann lasse ich es so. Ich war mir nur unsicher mit den Regeln, ich habe auch nirgendwo was gefunden, wo sie genau beschrieben sind.
 

member42

Aktives Mitglied
Moin,

Also ist es so, wenn ein Feld die Summe aus zwei anderen Feldern ist, dass sich dieses Feld dann nicht mehr mit einem anderen verbinden kann?

Mit dem Code von oben wird z.B 2204 zu 0088, was ich ja jetzt eigentlich nicht wollte. Ich habe jetzt folgendes abgeändert:
Java:
private boolean[][] feldSchonVerbunden = new boolean[feldGroeße][feldGroeße];
private void rechts_Verschieben(int i) {

        for (int k = 0; k < feldGroeße; k++) {

            for (int j = feldGroeße - 1; j > 0; j--) {
          
                if (feld[i][j] == feld[i][j - 1] && feld[i][j] != 0 && feldSchonVerbunden[i][j]==false && feldSchonVerbunden[i][j-1] ==false) {
                    feld[i][j] = feld[i][j] * 2;
                    feldSchonVerbunden[i][j] = true;
                    punkte = punkte + feld[i][j] * 2;
                    feld[i][j - 1] = 0;            
                }

                if (feld[i][j] == 0) {
                    feld[i][j] = feld[i][j - 1];
                    feld[i][j - 1] = 0;
                }

            }
        }
    feldSchonVerbunden = new boolean[feldGroeße][feldGroeße]; // nach jedem Zug reseten
}
So wird kann dann ein Feld was schonmal mit einem anderen Feld verbunden wurde, sich nicht nochmal mit einem anderen Feld verbunden. So wird dann aus 2204 -> 0044
 
Zuletzt bearbeitet:

Neue Themen


Oben