From cb60e5e8bb3992529a6ed66a451629d4ab0da8d1 Mon Sep 17 00:00:00 2001 From: sfphoton <schulcz.ferenc@gmail.com> Date: Sun, 13 May 2018 16:13:37 +0200 Subject: [PATCH] Fixed game ending detection --- src/killer_sokoban/AbstractField.java | 39 ++++++++++++++++++++++----- src/killer_sokoban/Main.java | 17 +++++++++--- src/killer_sokoban/SimpleField.java | 6 ++--- src/killer_sokoban/Wall.java | 10 +++++++ 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/src/killer_sokoban/AbstractField.java b/src/killer_sokoban/AbstractField.java index 75f9739..4f096aa 100644 --- a/src/killer_sokoban/AbstractField.java +++ b/src/killer_sokoban/AbstractField.java @@ -6,7 +6,18 @@ public abstract class AbstractField { protected HashMap<Direction, AbstractField> neighbours=new HashMap<Direction, AbstractField>(); - protected boolean isCorner; + protected HashMap<Direction, Boolean> gotCornerFrom = new HashMap<Direction, Boolean>(); + + /** + * Konstruktor + */ + public AbstractField() { + gotCornerFrom.put(Direction.UP, false); + gotCornerFrom.put(Direction.RIGHT, false); + gotCornerFrom.put(Direction.DOWN, false); + gotCornerFrom.put(Direction.LEFT, false); + + } /**Ez a függvény azt jelzi a mező számára, hogy szeretnének rálépni. * @param toward melyik irányból szeretnének rálépni @@ -52,21 +63,37 @@ public abstract class AbstractField { view.drawAbstract(); } + /** + * Megadja, hogy a mező saroknak számít-e + */ + protected boolean isCorner() { + return gotCornerFrom.get(Direction.UP) && (gotCornerFrom.get(Direction.RIGHT) || gotCornerFrom.get(Direction.LEFT)) || gotCornerFrom.get(Direction.DOWN) && (gotCornerFrom.get(Direction.RIGHT) || gotCornerFrom.get(Direction.LEFT)); + } + + /** + * Ha szükséges, értesíti a szomszédokat arról, hogy ettől a mezőtől ők lehetnének sarkok + */ + public void initCorner() { + //itt hívna egy fal minden szomszédra setToCorner()-t + } + /** * Ez a függvény sarkot csinál a mezőből. */ - public void setToCorner() { - isCorner = true; + public void setToCorner(Direction from) { + gotCornerFrom.replace(from, true); } /** * A sarokba betoltunk valamit, így a szomszédjaiból sarok lett. */ public void fillCorner() { - if(!isCorner) return; + if(!isCorner()) return; - for(AbstractField neighbor : neighbours.values()) { - if(!neighbor.isCorner) neighbor.setToCorner(); + for(Direction dir : gotCornerFrom.keySet()) { + if (gotCornerFrom.get(dir)) { + neighbours.get(dir.opposite()).setToCorner(dir); + } } } diff --git a/src/killer_sokoban/Main.java b/src/killer_sokoban/Main.java index 9fcac4d..d98aaa8 100644 --- a/src/killer_sokoban/Main.java +++ b/src/killer_sokoban/Main.java @@ -211,6 +211,7 @@ public class Main extends Application { AbstractField af=map.get("f_"+y+"_"+x); af.shouldDraw(view); } + public static void main(String[] args) throws IOException { launch(args); } @@ -307,7 +308,7 @@ public class Main extends Application { stat(cmd[1]); } else if (cmd[0].equals("setcorner")) { - setCorner(cmd[1]); + setCorner(cmd[1], cmd[2]); } else if (cmd[0].equals("script")) { script(cmd[1]); @@ -386,6 +387,9 @@ public class Main extends Application { } } + //Sarkok inicializálása + initCorners(); + //View újrainicializálása view.init(lines, columns); } @@ -479,12 +483,19 @@ public class Main extends Application { } } + /** + * Elindít egy inicializálást arról, hogy mely mezők vannak sarokban + */ + private static void initCorners() { + for(AbstractField f : map.values()) f.initCorner(); + } + /** * Sarkokat beállítja a megadott mezőn * @param field megadott mező */ - private static void setCorner(String field) { - map.get(field).setToCorner(); + private static void setCorner(String field, String from) { + map.get(field).setToCorner(Direction.fromString(from)); } /** diff --git a/src/killer_sokoban/SimpleField.java b/src/killer_sokoban/SimpleField.java index 83a5ffd..df07c42 100644 --- a/src/killer_sokoban/SimpleField.java +++ b/src/killer_sokoban/SimpleField.java @@ -26,7 +26,7 @@ public class SimpleField extends AbstractField { { m.move(this); //Fontos a sorrend, mert ez a függvény eldobatja magát m mezőjével. myMoveable=m; - if (isCorner) m.arriveToCorner(); + if (isCorner()) m.arriveToCorner(); } @@ -197,8 +197,8 @@ public class SimpleField extends AbstractField { * Ez a függvény sarkot csinál a mezőből. */ @Override - public void setToCorner() { - super.setToCorner(); + public void setToCorner(Direction from) { + super.setToCorner(from); if(myMoveable != null) myMoveable.arriveToCorner(); } } diff --git a/src/killer_sokoban/Wall.java b/src/killer_sokoban/Wall.java index 1acb7ab..a77ac01 100644 --- a/src/killer_sokoban/Wall.java +++ b/src/killer_sokoban/Wall.java @@ -22,6 +22,16 @@ public class Wall extends AbstractField { public boolean couldMoveOn(Direction toward) { return false; } + + /** + * Szól a szomszédjainak, hogy lehet, hogy sarokban vannak + */ + @Override + public void initCorner() { + for(Direction dir : neighbours.keySet()) { + neighbours.get(dir).setToCorner(dir.opposite()); + } + } /** * Fal kirajzolásáért felel -- GitLab