Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.nio.file.*;
- import java.util.Scanner;
- /**
- *
- *
- * Das aktuelle Programm Sokoban ist eine Erweiterung der letzten Hausaufgabe. Es wurde um die Funktion des Einlesens einer externen Datei,
- * sowie Kollisionserkennung erweitert.
- * Durch verschiedene Bedingungen wurde die Kollisionserkennung eingefügt, und man kann es sogar spielen und gewinnen.
- * Bewegt man alle Kisten auf ein Zielfeld, hat man das Spiel gewonnen.
- *
- * @author Benedict Laumer 4772903 Gruppe 4a
- * @author Marc Emden 4772109 Gruppe 4a
- */
- public class Sokoban {
- public static void main(String[]args) throws IOException {
- BufferedReader br = Files.newBufferedReader(Paths.get("sokoban.txt"));
- String line = null;
- int spielfeldbreite = 0;
- int spielfeldhoehe = 0;
- while ((line = br.readLine()) != null) { //Misst das Spielfeld aus
- spielfeldbreite = line.length();
- spielfeldhoehe++;
- }
- br.close();
- Scanner scan = new Scanner(System.in);
- String eingabe;
- int playerX = 0;
- int playerY = 0;
- boolean exit = false;
- char[][] room = new char[spielfeldbreite][spielfeldhoehe]; //Spielfeld mit den
- br = Files.newBufferedReader(Paths.get("sokoban.txt"));
- line = null;
- int zeile = 0;
- int zielfeld = 0;
- int kiste = 0;
- int kisteaufziel = 0;
- while ((line = br.readLine()) != null) {
- for (int spalte = 0; spalte < spielfeldbreite; spalte++) {
- room[spalte][zeile] = line.charAt(spalte); //guckt, welches zeichen in line an punkt spalte ist
- switch (room[spalte][zeile]) {
- case '@':
- playerX = spalte; //setzt die X Koordinate des Spielers
- playerY = zeile; //setzt die Y Koordinate des Spielers
- break;
- case '.':
- zielfeld++; //setzt die Startbedingung hoch
- break;
- case '+':
- playerX = spalte; //setzt die X Koordinete des Spielers
- playerY = zeile; //setzt die Y Koordinate des spielers
- zielfeld++; //setzt die Startbedingung "Zielfeld" hoch
- break;
- case '*':
- zielfeld++; //setzt die Startbedingung "Zielfeld" hoch
- kiste++; //setzt die Startbedingung "Kiste" hoch
- kisteaufziel++; //setzt die Siegbedingung hoch
- break;
- case '$':
- kiste++; //Setzt die Startbedingung "Kiste" hoch
- break;
- }
- }
- zeile++; //zeile wird hochgesetzt; while Schleife faengt von vorne an
- }
- br.close();
- if (kiste != zielfeld) { //Startbedingung
- System.out.println("Nicht gleich viele Kisten und Zielfelder!");
- } else {
- System.out.println("You can move with up (u), down (d), left (l) or right (r)! End it with exit (e) and use help (h) for instructions!");
- System.out.print("\n");
- while (exit == false) { //Solange exit = false ist, wird das das Spiel ausgefuehrt
- for (int i = 0; i < spielfeldhoehe; i++) {
- for (int j = 0; j < spielfeldbreite; j++) {
- System.out.print(room[j][i]); //Spielfeld wird dargestellt
- }
- System.out.print("\n");
- }
- System.out.println("\nWhat do you want to do now?:");
- eingabe = scan.next()
- switch (eingabe) {
- case "u":
- case "up":
- if (room[playerX][playerY - 1] == '#') {
- //schaut nach, ob über dem Spieler eine Wand ist
- System.out.println("There is something, you can not move!");
- } else if ((room[playerX][playerY - 1] == '$' && room[playerX][playerY - 2] == '#')
- //Schaut nach, ob eine Wand hinter der Kiste ist
- || (room[playerX][playerY - 1] == '*' && room[playerX][playerY - 2] == '#')) {
- System.out.println("There is something, you can not move!");
- } else if ((room[playerX][playerY - 1] == '$' && room[playerX][playerY - 2] == '$')
- || (room[playerX][playerY - 1] == '$' && room[playerX][playerY - 2] == '*')
- || (room[playerX][playerY - 1] == '*' && room[playerX][playerY - 2] == '*')
- //Schaut nach, ob hinter einer Kiste eine Kiste ist
- || (room[playerX][playerY - 1] == '*' && room[playerX][playerY - 2] == '$')) {
- System.out.println("There is something, you can not move!");
- } else {
- if (room[playerX][playerY - 1] == '$') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerY--;
- room[playerX][playerY] = '@';
- if (room[playerX][playerY - 1] == '.') {
- room[playerX][playerY - 1] = '*';
- kisteaufziel++;
- } else {
- room[playerX][playerY - 1] = '$';
- /*schaut, ob hinter einer Kiste ein Zielfeld ist, falls ja, wird die Kiste zu einem *,
- falls nein, bleibt es bei $*/
- }
- } else if (room[playerX][playerY - 1] == '*') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerY--;
- if (room[playerX][playerY] == '*') {
- room[playerX][playerY] = '+';
- if (room[playerX][playerY - 1] == '.') {
- room[playerX][playerY - 1] = '*';
- } else {
- room[playerX][playerY - 1] = '$';
- kisteaufziel--;
- /*
- schaut, ob hinter einer Kiste auf einem Zielfeld noch ein Zielfeld ist, falls ja bleibt es bei *,
- falls nein, wird es zu einer Kiste
- */
- }
- } else {
- room[playerX][playerY] = '@';
- room[playerX][playerY - 1] = '$';
- }
- } else {
- if (room[playerX][playerY - 1] == '.') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerY--;
- room[playerX][playerY] = '+';
- } else {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- /*schaut, ob der Spieler sich auf einem Zielfeld befindet, falls ja, wird es zu einem +,
- falls nein, bleibt es ein @
- */
- } else {
- room[playerX][playerY] = '.';
- }
- playerY--;
- room[playerX][playerY] = '@';
- }
- }
- }
- break;
- case "d":
- case "down":
- if (room[playerX][playerY + 1] == '#') {
- System.out.println("There is something, you can not move!");
- } else if ((room[playerX][playerY + 1] == '$' && room[playerX][playerY + 2] == '#')
- || (room[playerX][playerY + 1] == '*' && room[playerX][playerY + 2] == '#')) {
- System.out.println("There is something, you can not move!");
- } else if ((room[playerX][playerY + 1] == '$' && room[playerX][playerY + 2] == '$')
- || (room[playerX][playerY + 1] == '$' && room[playerX][playerY + 2] == '*')
- || (room[playerX][playerY + 1] == '*' && room[playerX][playerY + 2] == '*')
- || (room[playerX][playerY + 1] == '*' && room[playerX][playerY + 2] == '$')) {
- System.out.println("There is something, you can not move!");
- } else {
- if (room[playerX][playerY + 1] == '$') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerY++;
- room[playerX][playerY] = '@';
- if (room[playerX][playerY + 1] == '.') {
- room[playerX][playerY + 1] = '*';
- kisteaufziel++;
- } else {
- room[playerX][playerY + 1] = '$';
- }
- } else if (room[playerX][playerY + 1] == '*') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerY++;
- if (room[playerX][playerY] == '*') {
- room[playerX][playerY] = '+';
- if (room[playerX][playerY + 1] == '.') {
- room[playerX][playerY + 1] = '*';
- } else {
- room[playerX][playerY + 1] = '$';
- kisteaufziel--;
- }
- } else {
- room[playerX][playerY] = '@';
- room[playerX][playerY + 1] = '$';
- kisteaufziel--;
- }
- } else {
- if (room[playerX][playerY + 1] == '.') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerY++;
- room[playerX][playerY] = '+';
- } else {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerY++;
- room[playerX][playerY] = '@';
- }
- }
- }
- break;
- case "l":
- case "left":
- if (room[playerX - 1][playerY] == '#') {
- System.out.println("There is something, you can not move!");
- } else if ((room[playerX - 1][playerY] == '$' && room[playerX - 2][playerY] == '#')
- || (room[playerX - 1][playerY] == '*' && room[playerX - 2 ][playerY] == '#')) {
- System.out.println("There is something, you can not move!");
- } else if ((room[playerX - 1][playerY] == '$' && room[playerX - 2][playerY] == '$')
- || (room[playerX - 1][playerY] == '$' && room[playerX - 2][playerY] == '*')
- || (room[playerX - 1][playerY] == '*' && room[playerX - 2][playerY] == '*')
- || (room[playerX - 1][playerY] == '*' && room[playerX - 2][playerY] == '$')) {
- System.out.println("There is something, you can not move!");
- } else {
- if (room[playerX - 1][playerY] == '$') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerX--;
- room[playerX][playerY] = '@';
- if (room[playerX - 1][playerY] == '.') {
- room[playerX - 1][playerY] = '*';
- kisteaufziel++;
- } else {
- room[playerX - 1][playerY] = '$';
- }
- } else if (room[playerX - 1][playerY] == '*') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerX--;
- if (room[playerX][playerY] == '*') {
- room[playerX][playerY] = '+';
- if (room[playerX - 1][playerY] == '.') {
- room[playerX - 1][playerY] = '*';
- } else {
- room[playerX - 1][playerY] = '$';
- kisteaufziel--;
- }
- } else {
- room[playerX][playerY] = '@';
- room[playerX - 1][playerY] = '$';
- kisteaufziel--;
- }
- } else {
- if (room[playerX - 1][playerY] == '.') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerX--;
- room[playerX][playerY] = '+';
- } else {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerX--;
- room[playerX][playerY] = '@';
- }
- }
- }
- break;
- case "r":
- case "right":
- if (room[playerX + 1][playerY] == '#') {
- System.out.println("There is something, you can not move!");
- } else if ((room[playerX + 1][playerY] == '$' && room[playerX + 1][playerY] == '#')
- || (room[playerX + 1][playerY] == '*' && room[playerX + 1][playerY] == '#')) {
- System.out.println("There is something, you can not move!");
- } else if ((room[playerX + 1][playerY] == '$' && room[playerX + 2][playerY] == '$')
- || (room[playerX + 1][playerY] == '$' && room[playerX + 2][playerY] == '*')
- || (room[playerX + 1][playerY] == '*' && room[playerX + 2][playerY] == '*')
- || (room[playerX + 1][playerY] == '*' && room[playerX + 2][playerY] == '$')) {
- System.out.println("There is something, you can not move!");
- } else {
- if (room[playerX + 1][playerY] == '$') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerX++;
- room[playerX][playerY] = '@';
- if (room[playerX + 1][playerY] == '.') {
- room[playerX + 1][playerY] = '*';
- kisteaufziel++;
- } else {
- room[playerX + 1][playerY] = '$';
- }
- } else if (room[playerX + 1][playerY] == '*') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerX++;
- if (room[playerX][playerY] == '*') {
- room[playerX][playerY] = '+';
- if (room[playerX + 1][playerY] == '.') {
- room[playerX + 1][playerY] = '*';
- } else {
- room[playerX + 1][playerY] = '$';
- kisteaufziel--;
- }
- } else {
- room[playerX][playerY] = '@';
- room[playerX + 1][playerY] = '$';
- }
- } else {
- if (room[playerX + 1][playerY] == '.') {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerX++;
- room[playerX][playerY] = '+';
- } else {
- if (room[playerX][playerY] == '@') {
- room[playerX][playerY] = ' ';
- } else {
- room[playerX][playerY] = '.';
- }
- playerX++;
- room[playerX][playerY] = '@';
- }
- }
- }
- break;
- case "h":
- case "help":
- System.out.println("Use up or u to move upwards.");
- System.out.println("Use down or d to move down");
- System.out.println("Use right or r to move to the right");
- System.out.println("Use left or l to move to the left");
- System.out.println("Use exit or e to end the game");
- System.out.print("\n");
- break;
- case "e":
- case "exit":
- exit = true; //Die while Schleif e wird nur im Fall exit = false ausgefuehrt; bei Eingabe von exit trif ft es nicht mehr zu
- break;
- default:
- System.out.println("Unknown command!"); //Falls eine falsche Eingabe getätigt wird, wird das ausgegeben
- }
- if (kisteaufziel == zielfeld) { //siegbedingung
- for (int i = 0; i < spielfeldhoehe; i++) {
- for (int j = 0; j < spielfeldbreite; j++) {
- System.out.print(room[j][i]); //Spielfeld wird dargestellt
- }
- System.out.print("\n");
- }
- System.out.println("You have won!"); //Siegtext
- exit = true;
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement