diff --git a/src/killer_sokoban/AbstractField.java b/src/killer_sokoban/AbstractField.java index e090fd856d9bf3cb7ea648efa101f928ad56244d..02b8ede71f538d1476c680c645f6cc704bbad26f 100644 --- a/src/killer_sokoban/AbstractField.java +++ b/src/killer_sokoban/AbstractField.java @@ -6,6 +6,7 @@ public abstract class AbstractField { protected HashMap<Direction, AbstractField> neighbours=new HashMap<Direction, AbstractField>(); + protected boolean isCorner; /**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 @@ -43,5 +44,21 @@ public abstract class AbstractField { { view.drawAbstract(); } + + /** + * Ez a függvény sarkot csinál a mzőből. + */ + public void setToCorner() {isCorner = true;} + + /** + * A sarokba betoltunk valamit, így a szomszédjaiból sarok lett. + */ + public void fillCorner() { + if(!isCorner) return; + + for(AbstractField neighbor : neighbours.values()) { + neighbor.setToCorner(); + } + } } diff --git a/src/killer_sokoban/Crate.java b/src/killer_sokoban/Crate.java index 2ae558ae9709bc300a5f0242f21b3b1bc1e8e201..9e97abbc056493b6f49d5a673565f54e355097f6 100644 --- a/src/killer_sokoban/Crate.java +++ b/src/killer_sokoban/Crate.java @@ -2,8 +2,7 @@ package killer_sokoban; public class Crate extends Moveable { - - private boolean couldMove=true; + private boolean isOnTarget; @@ -38,17 +37,9 @@ public class Crate extends Moveable { s.turnOn(); } - /** - * Beállítja, hogy a láda eltolható-e. - */ - public void setCouldMove(boolean b) { - couldMove=b; - } - public void printStat() { super.printStat(); - System.out.println("couldMove: " + couldMove); System.out.println("isOnTarget: " + isOnTarget); } @@ -58,4 +49,15 @@ public class Crate extends Moveable { super.shouldDraw(view); view.drawCrate(); } + + /** + * Jelzi a láda számára, hogy sarokba ragadt. + */ + @Override + public void arriveToCorner() { + myField.fillCorner(); + Main.deleteCrate(this); + } + + public boolean couldGameFinish() {return isOnTarget;} } diff --git a/src/killer_sokoban/Main.java b/src/killer_sokoban/Main.java index 7999199ffbe31528ec8175bf7bb4cff0495900bf..7a3c7a0b4192c2e1a65c607849d8b7df2f33a365 100644 --- a/src/killer_sokoban/Main.java +++ b/src/killer_sokoban/Main.java @@ -7,7 +7,6 @@ import java.util.Map.Entry; import javafx.application.Application; import javafx.event.EventHandler; -import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; @@ -15,7 +14,6 @@ import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.*; import javafx.scene.paint.Color; -import javafx.scene.paint.Paint; import javafx.scene.text.Font; import javafx.scene.text.Text; import javafx.stage.Stage; @@ -58,6 +56,9 @@ public class Main extends Application { if(i==workers.size()) activeWorker = (Worker)workers.values().toArray()[0]; else activeWorker = (Worker)workers.values().toArray()[i]; + //checking if game should end + checkGameEnded(); + view.update(); } @@ -196,6 +197,17 @@ public class Main extends Application { crates.remove(getKeyByValue(crates, c)); } + private static void checkGameEnded() { + boolean ended = true; + for(Crate c : crates.values()) { + if(!c.couldGameFinish()) ended = false; + } + + if (ended) { + endGame(); + } + } + private static void endGame() { for (Entry<String, Worker> e : workers.entrySet()) @@ -241,6 +253,9 @@ public class Main extends Application { else if (cmd[0].equals("stat")) { stat(cmd[1]); } + else if (cmd[0].equals("setcorner")) { + setCorner(cmd[1]); + } else if (cmd[0].equals("script")) { script(cmd[1]); } @@ -374,6 +389,10 @@ public class Main extends Application { } } + private static void setCorner(String field) { + map.get(field).setToCorner(); + } + private static void script(String file) throws IOException { BufferedReader backup = br; diff --git a/src/killer_sokoban/Moveable.java b/src/killer_sokoban/Moveable.java index be7c9ecc3b4c0b9aa5833e24662041d086b4b3ad..80accfee62cf9c0594d99c2d23adc3d3b7c5ced7 100644 --- a/src/killer_sokoban/Moveable.java +++ b/src/killer_sokoban/Moveable.java @@ -85,4 +85,9 @@ public abstract class Moveable { { } + /** + * Azt jelzi a Moveable számára, hogy sarokba érkezett. Szándékosan üres, a láda felüüldefiniálja. + */ + public void arriveToCorner() {} + } diff --git a/src/killer_sokoban/SimpleField.java b/src/killer_sokoban/SimpleField.java index 045b7de1fda9407bfd7c4d2d2c48d10073216bd5..d07d332be2754cc07707d041aa777af543f28098 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; - //determineBlocked(toward); //A szkeletonban maradjon kikommentelve... sok szomszédot létre kellene hozni a helyes működéshez + if (isCorner) m.arriveToCorner(); } diff --git a/testmap1.in b/testmap1.in index 0dbe9661d181228d714ee338a841dfe61bcadd7b..dde580e175897b28dcfb6636abfbbb915f807b68 100644 --- a/testmap1.in +++ b/testmap1.in @@ -9,6 +9,10 @@ wmmmwmmtmw wmmmwmmtmw wmmmmmmmmw wwwwwwwwww +setcorner f_1_1 +setcorner f_1_8 +setcorner f_8_1 +setcorner f_8_8 setswitch f_3_4 f_1_4 worker w1 3 f_1_1 crate c1 f_1_3