# Spiel mit 2d Array per Zufall



## qweqwe21 (21. Juli 2013)

Hi ich möchte ein Spiel entwickeln bei dem man wie bei Minen Spielen tiefer graben muss aber wie kann man so etwas programmieren damit man überhaupt runter kommt und nicht bei der ersten Ebene stecken bleibt und nur nach Links und Rechts kann.
also in diesem Forum wurde es einigermaßen erklärt aber ich weiß nur nicht wie man das einstellt damit das level zufällig gemacht wird, vielleicht könnt ihr mir dadurch helfen.
Und  man kann ja mit Text dateien das Level gestalten also z.B wo TileTop, TileDirt und so ist wie bei dem Tutorial von Basteldroid (siehe Anhang map2).

Meine Frage nun kann man es so einstellen das die Welt zufällig gemacht wird z.B. (siehe Anhang map3)

Das sozusagen das mein Spielraum ist und in Zeile 1 gibt es Leere Felder und A Felder per zufall und ab Zeile 5 gibt es Leere Felder und B Felder und in den Letzten zwei Zeilen kann der Schatz S sein und Leere Felder und B Felder aber alles mehrmals in allen Zeilen außer den Schatz S gibt es nur einmal.


Das stand im Thread: (gekürzt)

Frage: 
Ich möchte ein kleines Spiel mit GUI mit Java Eclipse programmieren.
Ich habe bereits ein Schere, Stein, Papier gegen den Computer gemacht und bin aktuell an einem "JavaPhone" dran.
Ich möchte ein Spiel machen, bei dem ich eine Figur mit den Pfeiltasten auf einem Feld bis zu einem Ziel bewegen kann (ähnlich wie das GUI von JavaKara).
Hindernissen muss man ausweichen können. 

Meine Frage ist nun, wie mache ich das?
Kann das Spielfeld zufällig generiert werden oder muss man jedes Level selber erstellen?


Antwort:Also du meinst einfach ein Spiel das in Vierecke unterteilt ist und man einstellen kann ob diese Vierecke passierbar sind usw.?
Wenn ja ist dein Stichwort Tile-based Game.

Das kannst du einfach Lösen indem du ein 2-Dimensionales Array als Spielfeld nimmst (vom Typ boolean, geht auch byte wenn du mehr Einstellungsmöglichkeiten willst oder du erstellt gleich eine Tile-Klasse). 

Beispiel:
http://www.swisseduc.ch/informatik/karatojava/javakara/

Das Spielfeld ist so ein Array:
Code:
  int[][] spielfeld = new int[9][9];
Die beiden 9nen weil es ja 9x9-Grop ist.
Jetzt kannst du ja sagen, dass 
0=Leeres Feld;
1=Baumstamm;
2=Kleeblatt;
usw.


Das Spielfeld vom Bild wäre also so dein Array aufgebaut:


Code:
000000000
  000011110
  000100012
  001100012
  010000012
  001011120
  010010020
  011100000
  000000000
Dein Marienkäfer (der jetzt einfach der Spieler ist, kannst du ja einfach durch 2 int Werte (mx, my) darstellen. (Wobei natürlich 0x0 das Feld ganz oben links ist, Indizen zählen ja von 0 an).

Um deinen Marienkäfer zu bewegen kannst du einfach mx und my verändern, dann überpruefst du ob spielfeld[mx][my] passierbar ist. Wenn es passierbar ist, hat sich der Marienkäfer dorthinbewegt, wenn nicht kannst du es einfach rückgängig machen oder so.

Alles in dem Code drinnen:


Code:
import java.util.LinkedList;

  public class Game
  {

        private final int[][] spielfeld;

        //Marienkaefer-Koordinaten
        private int mx = 0;
        private int my = 0;

        /**
         * Liste die alle Typen die passierbar sind gespeichert hat.
         * Aber nur Zahlen wie 0,1,2... die fuer die Typen stehen.
         * Ist Anfang noch leer.
         */
        private LinkedList<Integer> passables = new LinkedList<Integer>();

        /**
         * Ueberprueft ob das aktuelle Feld des Marienkäfers passierbar ist.
         * @return true wenn passierbar, false wenn nicht.
         */
        public boolean canPass()
        {
              return (passables.contains(spielfeld[mx][my]));
        }

        public Game(int sx, int sy)
        {
              spielfeld = new int[sx][sy]; //Spielfeld wird in der richtigen Größe angelegt
              passables.add(0); //0=Leeres Feld wird passierbar gemacht
        }

      public static void main(String... args)
      {
        new Game(9,9); //9x9 Spielfeld erstellen.
      }

      /**
       * Marienkaefer nach oben bewegen ein Feld
       */
      public void moveUp()
      {
        if(my>0) //An der oberen Grenze soll ern icht mehr nach oben koennen.
        {
              my--;
              if(canPass()) //Schaut ob der Marienkaefer jetzt auf einem gueltigen Feld steht.
              {
                    //Wenn ja
                    System.out.println("Bewegt!");
              }
              else
              {
                    //Wenn ja
                    System.out.println("Leider ein Hindernis im Weg.");
                    my++;//Marienkaezurueckbewegen
              }
        }
      }
  }
EDIT: Und ja, du kannst das natürlich alles zufallig generieren lassen! Dafür gibt es dann natürlich noch mehr Ansätze.

Anderes forum hier fertig.

MFG
Nicolas


----------



## Anojo (27. Juli 2013)

ich denke mit ein paar schleifen und dem Befehl randome() bekommt man das schnell hin.

random ist ne Zufallzahl und kann auf die Größe gesperrt werden das er nur noch zwischen 0 und 1 zufällig entscheidet.

hier die Doku: http://docs.oracle.com/javase/6/docs/api/java/util/Random.html

In deinem fall wäre es nextInt(2) glaube ich...


----------

