diff --git a/src/killer_sokoban/Main.java b/src/killer_sokoban/Main.java index 08bd34ea3b9210fe0cafba673699b0277d3a716d..e48d9cb4e3516bfd7fdc1ced0094e79dbc7528d8 100644 --- a/src/killer_sokoban/Main.java +++ b/src/killer_sokoban/Main.java @@ -1,620 +1,185 @@ package killer_sokoban; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; import java.util.Scanner; + public class Main { private static HashMap<String, AbstractField> map = new HashMap<>(); //itt tároljuk a pályán lévő mezőket név (pl. "f_2_4") és referencia szerint private static HashMap<String, Worker> workers = new HashMap<>(); //a munkások private static HashMap<String, Crate> crates = new HashMap<>(); //a ládák - azért szedtem így külön mindent, hogy a játék vége detektálásánál végig lehessen kérdezgetni csak a ládákat - comment by SF - - public static void main(String[] args) { - - Scanner sc = new Scanner(System.in); - int esetszam; + private static boolean gameRunning; + + public static void main(String[] args) throws IOException { + System.out.println("Üdv a protóban! Kilépés EOF-fal\n\n"); - System.out.println("Üdv a tesztprogramunkban! Kilépés '0'-val\n\n"); + InputStreamReader isr = new InputStreamReader(System.in); + BufferedReader br = new BufferedReader(isr); - do { - System.out.println("Melyik tesztesetet szeretnéd futtatni?\n\n" - + "1. Worker pushes Worker into Wall\n" - + "2. Worker steps on Wall\n" - + "3. Worker steps on SimpleField\n" - + "4. Worker steps on TargetField\n" - + "5. Worker steps on SwitchField\n" - + "6. Worker steps on Hole\n" - + "7. Worker steps on SwitchableHole\n" - + "8. Worker tries to push crate on Wall\n" - + "9. Worker tries to push crate on SimpleField\n" - + "10. Worker tries to push crate on TargetField\n" - + "11. Worker tries to push crate on SwitchField\n" - + "12. Worker tries to push crate on Hole\n" - + "13. Worker tries to push crate on SwitchableHole\n" - + "14. Worker pushes worker\n" - + "15. Worker pushes crate which pushes worker\n" - + "16. Worker pushes crate which pushes crate\n" - + "17. Worker pushes crate off TargetField\n" - + "18. Worker pushes crate off SwitchField\n" - + "19. Worker tries to push worker which pushes worker on Wall\n" - + "---\n" - + "0. Kilépés"); //A kirajzolt menü - esetszam=sc.nextInt()%20; //Választás beolvasása - - Logger.disable(); //A logolás letiltása a pálya felépítésének idejére + while (true) { + String line; + line = br.readLine(); + + if (line == null) break; - switch(esetszam) { //A válasznak megfelelő eset indítása - case 0: continue; - case 1: workerPushesWorkerIntoWall(); - break; - case 2: workerStepsOnWall(); - break; - case 3: workerStepsOnSimpleField(); - break; - case 4: workerStepsOnTargetField(); - break; - case 5: workerStepsOnSwitchField(); - break; - case 6: workerStepsOnHole(); - break; - case 7: workerStepsOnSwitchableHole(); - break; - case 8: workerTriesToPushCrateOnWall(); - break; - case 9: workerTriesToPushCrateOnSimpleField(); - break; - case 10: workerTriesToPushCrateOnTargetField(); - break; - case 11: workerTriesToPushCrateOnSwitchField(); - break; - case 12: workerTriesToPushCrateOnHole(); - break; - case 13: workerTriesToPushCrateOnSwitchableHole(); - break; - case 14: workerPushesWorker(); - break; - case 15: workerPushesCrateWhichPushesWorker(); - break; - case 16: workerPushesCrateWhichPushesCrate(); - break; - case 17: workerPushesCrateOffTargetField(); - break; - case 18: workerPushesCrateOffSwitchField(); - break; - case 19: workerTriesToPushWorkerWhichPushesWorkerOnWall(); - break; - } - System.out.println("Teszteset vége. A folytatáshoz írj be valamit!"); - if(sc.next().equals("0")) esetszam=0; - }while(esetszam!=0); - sc.close(); + runCommand(line); + } System.out.println("Viszlát!"); - //workerTriesToPushWorkerWhichPushesWorkerOnWall(); } - //Kész - //1. - public static void workerPushesWorkerIntoWall() { - //MiniMap - AbstractField f1, f2, f3; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new Wall(); - - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - - //Create'n'Place - Worker w=new Worker(); - Moveable w2=new Worker(); - f1.accept(null, null, w); - f2.accept(null, null, w2); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(w2, "w2"); - - - //Stepping - w.step(Direction.RIGHT); - } - - //2. - public static void workerStepsOnWall(){ - //MiniMap - AbstractField f1, f2; - f1=new SimpleField(); - f2=new Wall(); - f1.setNeighbour(Direction.RIGHT, f2); - - //Create'n'Place - Worker w=new Worker(); - f1.accept(null, null, w); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(w, "w"); - - - //Stepping - w.step(Direction.RIGHT); - } - //3. - public static void workerStepsOnSimpleField(){ - //MiniMap - AbstractField f1, f2; - f1=new SimpleField(); - f2=new SimpleField(); - f1.setNeighbour(Direction.RIGHT, f2); - - //Create'n'Place - Worker w=new Worker(); - f1.accept(null, null, w); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(w, "w"); - - - //Stepping - w.step(Direction.RIGHT); + public static String getFieldName(AbstractField field) + { + return getKeyByValue(map, field); } - //4. - public static void workerStepsOnTargetField(){ - //MiniMap - AbstractField f1, f2; - f1=new SimpleField(); - f2=new TargetField(); - f1.setNeighbour(Direction.RIGHT, f2); - - //Create'n'Place - Worker w=new Worker(); - f1.accept(null, null, w); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(w, "w"); - - - //Stepping - w.step(Direction.RIGHT); + public static String getMoveableName(Moveable m) + { + if (m instanceof Crate) //Jobb ötlete valakinek? + { + return getKeyByValue(crates, (Crate) m); + } + else + { + return getKeyByValue(workers, (Worker) m); + } } - //5. - public static void workerStepsOnSwitchField(){ - //MiniMap - AbstractField f1, f2; - f1=new SimpleField(); - f2=new SwitchField(); - f1.setNeighbour(Direction.RIGHT, f2); - - //Create'n'Place - Worker w=new Worker(); - f1.accept(null, null, w); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(w, "w"); - - - //Stepping - w.step(Direction.RIGHT); + public static void deleteWorker(Worker w) + { + workers.remove(getKeyByValue(workers, w)); } - //6. - public static void workerStepsOnHole(){ - //MiniMap - AbstractField f1, f2; - f1=new SimpleField(); - f2=new Hole(); - f1.setNeighbour(Direction.RIGHT, f2); - - //Create'n'Place - Worker w=new Worker(); - f1.accept(null, null, w); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(w, "w"); - - - //Stepping - w.step(Direction.RIGHT); + public static void deleteCrate(Crate c) + { + crates.remove(getKeyByValue(crates, c)); } - //7. - public static void workerStepsOnSwitchableHole(){ - //MiniMap - AbstractField f1, f2; - f1=new SimpleField(); - f2=new SwitchableHole(); - f1.setNeighbour(Direction.RIGHT, f2); - - //Create'n'Place - Worker w=new Worker(); - f1.accept(null, null, w); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(w, "w"); - - - //Stepping - w.step(Direction.RIGHT); - } - //8. - public static void workerTriesToPushCrateOnWall(){ - //MiniMap - AbstractField f1, f2, f3; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new Wall(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - - //Create'n'Place - Worker w=new Worker(); - Moveable m=new Crate(); - f1.accept(null, null, w); - f2.accept(null, null, m); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(m, "m"); - - //Stepping - w.step(Direction.RIGHT); + private static void endGame() + { + for (Entry<String, Worker> e : workers.entrySet()) + { + System.out.println(e.getKey() + ": " + e.getValue()); } - //9. - public static void workerTriesToPushCrateOnSimpleField(){ - //MiniMap - AbstractField f1, f2, f3; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new SimpleField(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - - //Create'n'Place - Worker w=new Worker(); - Moveable m=new Crate(); - f1.accept(null, null, w); - f2.accept(null, null, m); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(m, "m"); - - //Stepping - w.step(Direction.RIGHT); - } - - //10. - public static void workerTriesToPushCrateOnTargetField(){ - //MiniMap - AbstractField f1, f2, f3; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new TargetField(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - - //Create'n'Place - Worker w=new Worker(); - Moveable m=new Crate(); - f1.accept(null, null, w); - f2.accept(null, null, m); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(m, "m"); - - //Stepping - w.step(Direction.RIGHT); + gameRunning=false; } - - //11. - public static void workerTriesToPushCrateOnSwitchField() + private static void runCommand(String cmdline) { + //Parancs részekgre tördelése + String cmd[]; + cmd = cmdline.split(" "); - //MiniMap - AbstractField f1, f2, f3; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new SwitchField(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - - //Create'n'Place - Worker w=new Worker(); - Moveable c=new Crate(); - f1.accept(null, null, w); - f2.accept(null, null, c); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(c, "c"); + //Parancs értelmezés, és a szükséges függvény meghívása + if (cmd[0].equals("parseMap")) { + parseMap(Integer.parseInt(cmd[1]), Integer.parseInt(cmd[2])); + } + else if (cmd[0].equals("worker")) { + spawnWorker(cmd[1],Double.parseDouble(cmd[2]),cmd[3]); + } + else if (cmd[0].equals("crate")) { + spawnCrate(cmd[1],cmd[2]); + } + else if (cmd[0].equals("setswitch")) { + setSwitch(cmd[1], cmd[2]); + } + else if (cmd[0].equals("putfluid")) { + putFluid(cmd[1], cmd[2].charAt(0)); + } + else if (cmd[0].equals("step")) { + step(cmd[1],cmd[2]); + } + else if (cmd[0].equals("stat")) { + stat(cmd[1]); + } + else if (cmd[0].equals("script")) { + stat(cmd[1]); + } + else + { + System.out.println("érvénytelen parancs"); + } - //Stepping - w.step(Direction.RIGHT); } - //12. - public static void workerTriesToPushCrateOnHole(){ - //MiniMap - AbstractField f1, f2, f3; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new Hole(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - - //Create'n'Place - Worker w=new Worker(); - Moveable m=new Crate(); - f1.accept(null, null, w); - f2.accept(null, null, m); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(m, "m"); - - //Stepping - w.step(Direction.RIGHT); + private static void parseMap(int parseInt, int parseInt2) { + // TODO implement + throw new UnsupportedOperationException("Not implemented yet"); } - - //13. - public static void workerTriesToPushCrateOnSwitchableHole() + + private static void spawnWorker(String name, double force, String field) { - - //MiniMap - AbstractField f1, f2, f3; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new SwitchableHole(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - - //Create'n'Place - Worker w=new Worker(); - Moveable c=new Crate(); - f1.accept(null, null, w); - f2.accept(null, null, c); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(c, "c"); - - - //Stepping - w.step(Direction.RIGHT); - } - - //14. - public static void workerPushesWorker(){ - //MiniMap - AbstractField f1, f2, f3; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new SimpleField(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - - //Create'n'Place - Worker w=new Worker(); - Moveable m=new Worker(); - f1.accept(null, null, w); - f2.accept(null, null, m); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(m, "m"); - - //Stepping - w.step(Direction.RIGHT); + Worker w=new Worker(force); + workers.put(name, w); + AbstractField f=map.get(field); + f.accept(Direction.RIGHT, w, w); } - //15. - public static void workerPushesCrateWhichPushesWorker(){ - //MiniMap - AbstractField f1, f2, f3, f4; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new SimpleField(); - f4=new SimpleField(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - f3.setNeighbour(Direction.RIGHT, f4); - - //Create'n'Place - Worker w=new Worker(); - Moveable c= new Crate(); - Moveable w3=new Worker(); - f1.accept(null, null, w); - f2.accept(null, null, c); - f3.accept(null, null, w3); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(f4, "f4"); - Logger.register(w, "w"); - Logger.register(c, "c"); - Logger.register(w3, "w3"); - - //Stepping - w.step(Direction.RIGHT); + + private static void spawnCrate(String name, String field) + { + Crate c=new Crate(); + crates.put(name, c); + AbstractField f=map.get(field); + f.accept(Direction.RIGHT, new Worker(0), c); } - //16. - public static void workerPushesCrateWhichPushesCrate() { - //MiniMap - AbstractField f1, f2, f3, f4; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new SimpleField(); - f4=new SimpleField(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - f3.setNeighbour(Direction.RIGHT, f4); - - //Create'n'Place - Worker w=new Worker(); - Moveable c2= new Crate(); - Moveable c3=new Crate(); - f1.accept(null, null, w); - f2.accept(null, null, c2); - f3.accept(null, null, c3); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(f4, "f4"); - Logger.register(w, "w"); - Logger.register(c2, "c2"); - Logger.register(c3, "c3"); - - //Stepping - w.step(Direction.RIGHT); + private static void setSwitch(String shole, String mySwitch) + { + ((SwitchField) map.get(mySwitch)).setSHole((SwitchableHole) map.get(shole)); } - //17. - public static void workerPushesCrateOffTargetField(){ - //MiniMap - AbstractField f1, f2, f3; - f1=new SimpleField(); - f2=new TargetField(); - f3=new SimpleField(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - - //Create'n'Place - Worker w=new Worker(); - Moveable m=new Crate(); - f1.accept(null, null, w); - f2.accept(null, w, m); //meg kell adni a workert, mert különben NullPointerException lép fel, amikor a Crate::stepOnTarget meghívja a w.incrementPoint()-ot; ez végül is bug, de nem javítandó, mert a végleges programban úgysem célmezőre kerülnek inicializáláskor a ládák - comment by SF - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(m, "m"); - - //Stepping - w.step(Direction.RIGHT); + + private static void putFluid(String field, char fluid) + { + SimpleField sf=((SimpleField) map.get(field)); + if (fluid=='h') + sf.putHoney(); + else if (fluid=='o') + sf.putHoney(); + else + System.out.println("you can only choose either 'h' or 'o'"); } - //18. - public static void workerPushesCrateOffSwitchField(){ - //MiniMap - AbstractField f1, f2, f3; - f1=new SimpleField(); - f2=new SwitchField(); - f3=new SimpleField(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - - //Create'n'Place - Worker w=new Worker(); - Moveable m=new Crate(); - f1.accept(null, null, w); - f2.accept(null, null, m); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(m, "m"); - - //Stepping - w.step(Direction.RIGHT); + + private static void step(String worker, String toward) + { + Worker w= (Worker) workers.get(worker); + w.step(Direction.fromString(toward)); } - //19. - public static void workerTriesToPushWorkerWhichPushesWorkerOnWall() + private static void stat(String object) { - //MiniMap - AbstractField f1, f2, f3, f4; - f1=new SimpleField(); - f2=new SimpleField(); - f3=new SimpleField(); - f4=new Wall(); - f1.setNeighbour(Direction.RIGHT, f2); - f2.setNeighbour(Direction.RIGHT, f3); - f3.setNeighbour(Direction.RIGHT, f4); - - //Create'n'Place - Worker w=new Worker(); - Moveable w2=new Worker(); - Moveable w3=new Worker(); - f1.accept(null, null, w); - f2.accept(null, null, w2); - f3.accept(null, null, w3); - - //Register4Logger - Logger.enable(); - Logger.register(f1, "f1"); - Logger.register(f2, "f2"); - Logger.register(f4, "f4"); - Logger.register(f3, "f3"); - Logger.register(w, "w"); - Logger.register(w2, "w2"); - Logger.register(w3, "w3"); - - //Stepping - w.step(Direction.RIGHT); + if (map.containsKey(object)) + { +// map.get(object).printStat(); + } + else if (workers.containsKey(object)) + { +// workers.get(object).printStat(); + } + else if (crates.containsKey(object)) + { +// crates.get(object).printStat(); + } } + private static void script(String file) + { + // TODO implement + throw new UnsupportedOperationException("Not implemented yet"); + } + //code copied from StackOverFlow + private static <T, E> T getKeyByValue(Map<T, E> map, E value) { + for (Entry<T, E> entry : map.entrySet()) { + if (Objects.equals(value, entry.getValue())) { + return entry.getKey(); + } + } + return null; + } }