Mehrere Ebenen

  • 13 Antworten
  • Letztes Antwortdatum
Q

qweqwe21

Erfahrenes Mitglied
8
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.

MFG
Nicolas
 
Hi,

deine Frage ist viel zu allgemein gestellt. Welche Technologie setzt du denn ein? Custom View, OpenGL, anderes Framework?

Am Ende wird es darauf hinauslaufen, dass du dein eigenes Model hast (das musst du dir ausdenken, designen und programmieren) und deine View zeichnet sich entsprechend.
 
Hi 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.

Mit Java Eclipse ein kleines Spiel programmieren

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 zufällig generieren lassen! Dafür gibt es dann natürlich noch mehr Ansätze.
 
Zuletzt bearbeitet:
Danke an alle ich habe es so gelöst:

Code:
import java.security.SecureRandom;
import java.util.Arrays;


public class ForLoop {
        public static void main( String ... args ) { 
            
            SecureRandom random = new SecureRandom();

            double[][] array = new double[5][10];

            for( int i = 0 ; i < array.length ; i++ ) { 
               for ( int j = 0 ; j < array[i].length ; j++ ) { 
                  array[i][j] = random.nextInt(11);
               }
            }

            for( double[] a : array ) { 
                System.out.println( Arrays.toString( a ));
            }
        }
    }
Davor wurde das Spielfeld so gebaut:

SampleGame Klasse
Code:
public class SampleGame extends AndroidGame {

    public static String map;
    boolean firstTimeCreate = true;

    @Override
    public Screen getInitScreen() {

        if (firstTimeCreate) {
            Assets.load(this);
            firstTimeCreate = false;
        }

        InputStream is = getResources().openRawResource(R.raw.map1);
        map = convertStreamToString(is);

        return new SplashLoadingScreen(this);

    }

    private static String convertStreamToString(InputStream is) {

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append((line + "\n"));
            }
        } catch (IOException e) {
            Log.w("LOG", e.getMessage());
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                Log.w("LOG", e.getMessage());
            }
        }
        return sb.toString();
    }

Tile Klasse:
Code:
public class Tile {

    private int tileX, tileY, speedX;
    public int type;
    public Image tileImage;

    private Robot robot = GameScreen.getRobot();
    private Background bg = GameScreen.getBg1();

    private Rect r;

    public Tile(int x, int y, int typeInt) {
        tileX = x * 40;
        tileY = y * 40;

        type = typeInt;

        r = new Rect();

        if (type == 5) {
            tileImage = Assets.tiledirt;
        } else if (type == 8) {
            tileImage = Assets.tilegrassTop;
        } else if (type == 4) {
            tileImage = Assets.tilegrassLeft;

        } else if (type == 6) {
            tileImage = Assets.tilegrassRight;

        } else if (type == 2) {
            tileImage = Assets.tilegrassBot;
        } else {
            type = 0;
        }

    }

und mit der GameScreen Klasse
Code:
    private void loadMap() {
        ArrayList lines = new ArrayList();
        int width = 0;
        int height = 0;

        Scanner scanner = new Scanner(SampleGame.map);
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();

            // Keine weiteren Zeilen
            if (line == null) {
                break;
            }

            if (!line.startsWith("!")) {
                lines.add(line);
                width = Math.max(width, line.length());

            }
        }
        height = lines.size();

        for (int j = 0; j < 12; j++) {
            String line = (String) lines.get(j);
            for (int i = 0; i < width; i++) {

                if (i < line.length()) {
                    char ch = line.charAt(i);
                    Tile t = new Tile(i, j, Character.getNumericValue(ch));
                    tilearray.add(t);
                }

            }
        }

    }

Wie kann ich jetzt einstellen das er mein zufälliges Array verwendet?
 
Zuletzt bearbeitet:
Weis keiner wie man ein 2d Array verwendet?
 
Kann mir keiner sagen wie man aus einem 2d Array liest?

Bitte helft mir ich komme so nicht weiter.
 
Ein 2 dimensionales Array ist auch nur ein Array, das Array Objekte als Elemente hat. Das gehört aber zum Java Grundwissen und findet man auf jeder Tutorialseite gut erklärt.

Java ist auch eine Insel – 3.8 Arrays
 
  • Danke
Reaktionen: qweqwe21
Danke das weiß ich aber wie kann man das verwenden?
 
Ich versteh das Problem nicht. Das wird doch bei Galileo erklärt?!
 
Ich verstehe das aber nicht kannst du mir bitte einen Tipp geben?
 
String irgendwas = array[xAchseWert][yAchseWert];

genau so liest du es aus.
 
  • Danke
Reaktionen: qweqwe21
Also angenommen mein array heißt tilemap dann so z.B
String tilemap = array[5][10]

Danke ich versuche es mal

Ich bekomme diese Fehlermeldung:

Type mismatch: cannot convert from int to String
 
Zuletzt bearbeitet:
Wenn dein array in int[][] Array ist, kannst du den Inhalt natürlich nicht an einen String zuweisen.
 
  • Danke
Reaktionen: qweqwe21
Okay aber ich schaffe es trotzdem nicht

Könnt ihr mir sagen wie man ein 2d array als txt speichert dann kann ich es einfach wie vorher uber inputstream verwenden ich muss nur wissen wie man es speichert.

Bitte
 
Zuletzt bearbeitet:
Zurück
Oben Unten