diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index ac7e53ceed444386d155ce344e0ebfb5f951df9a..25eeaaf70751f919944b904ea7dd19bc165020c4 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -11,25 +11,28 @@ import java.io.IOException; import java.net.URL; public class SimulatorApplication extends javafx.application.Application { - private static final String VIEW_RESOURCE_PATH = "/view/view.fxml"; - private static final String APP_NAME = "Firefighter simulator"; + private static final String FIREFIGHTER_VIEW_RESOURCE_PATH = "/view/Firefighterview.fxml"; + private static final String STONEPAPERSCISSORS_VIEW_RESOURCE_PATH = "/view/StonePaperScissorsview.fxml"; private static final int ROW_COUNT = 20; private static final int COLUMN_COUNT = 20; private static final int SQUARE_WIDTH = 50; private static final int SQUARE_HEIGHT = 50; public static final int INITIAL_FIRE_COUNT = 2; - public static final int INITIAL_FIREFIGHTER_COUNT = 3; - public static final int INITIAL_MOTORFIREFIGHTER_COUNT = 1; - public static final int INITIAL_CLOUD_COUNT = 2; + public static final int INITIAL_FIREFIGHTER_COUNT = 5; + public static final int INITIAL_MOTORFIREFIGHTER_COUNT = 2; + public static final int INITIAL_CLOUD_COUNT = 3; public static final int INITIAL_MOUNTAIN_COUNT = 10; public static final int INITIAL_ROAD_COUNT = 10; public static final int INITIAL_ROCKERIES_COUNT = 10; + public static final int INITIAL_STONE_COUNT = 5; + public static final int INITIAL_PAPER_COUNT = 5; + public static final int INITIAL_SCISSORS_COUNT = 5; private Stage primaryStage; private Parent view; - private void initializePrimaryStage(Stage primaryStage) { + private void initializePrimaryStage(Stage primaryStage, String appName) { this.primaryStage = primaryStage; - this.primaryStage.setTitle(APP_NAME); + this.primaryStage.setTitle(appName); this.primaryStage.setOnCloseRequest(event -> Platform.exit()); this.primaryStage.setResizable(false); this.primaryStage.sizeToScene(); @@ -37,14 +40,15 @@ public class SimulatorApplication extends javafx.application.Application { @Override public void start(Stage primaryStage) throws IOException { - initializePrimaryStage(primaryStage); - initializeView(); + initializeFirefighterView(primaryStage); + //initializeStonePaperScissorsView(primaryStage); showScene(); } - private void initializeView() throws IOException { + private void initializeFirefighterView(Stage primaryStage) throws IOException { + initializePrimaryStage(primaryStage, "Firefighter simulator"); FXMLLoader loader = new FXMLLoader(); - URL location = SimulatorApplication.class.getResource(VIEW_RESOURCE_PATH); + URL location = SimulatorApplication.class.getResource(FIREFIGHTER_VIEW_RESOURCE_PATH); loader.setLocation(location); view = loader.load(); Controller controller = loader.getController(); @@ -53,6 +57,17 @@ public class SimulatorApplication extends javafx.application.Application { INITIAL_MOUNTAIN_COUNT, INITIAL_ROAD_COUNT, INITIAL_ROCKERIES_COUNT); } + private void initializeStonePaperScissorsView(Stage primaryStage) throws IOException { + initializePrimaryStage(primaryStage, "Stone,Paper,Scissors simulator"); + FXMLLoader loader = new FXMLLoader(); + URL location = SimulatorApplication.class.getResource(STONEPAPERSCISSORS_VIEW_RESOURCE_PATH); + loader.setLocation(location); + view = loader.load(); + Controller controller = loader.getController(); + controller.initialize(SQUARE_WIDTH, SQUARE_HEIGHT, COLUMN_COUNT, ROW_COUNT, + INITIAL_STONE_COUNT, INITIAL_PAPER_COUNT, INITIAL_SCISSORS_COUNT); + } + private void showScene() { Scene scene = new Scene(view); primaryStage.setScene(scene); diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 57c09656d3cb18f596c8033f2a3ec14e313c493b..9712cf15176cde812626455e599ba802776bf1cf 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -14,6 +14,7 @@ import javafx.util.Duration; import model.Board; import model.Item; import model.FirefighterBoard; +import model.StonePaperScissorsBoard; import util.Position; import view.Grid; @@ -52,8 +53,8 @@ public class Controller { pauseToggleButton.setSelected(true); } - private void setBoard(FirefighterBoard firefighterBoard) { - this.board = requireNonNull(firefighterBoard, "firefighter.model is null"); + private void setBoard(Board board) { + this.board = requireNonNull(board, "board is null"); } private void updateBoard(){ @@ -119,6 +120,14 @@ public class Controller { repaintGrid(); } + public void initialize(int squareWidth, int squareHeight, int columnCount, + int rowCount, int initialStoneCount, int initialPaperCount, int initialScissorsCount) { + + this.setBoard(new StonePaperScissorsBoard(columnCount, rowCount, initialStoneCount, initialPaperCount, initialScissorsCount)); + grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); + repaintGrid(); + } + public void oneStepButtonAction() { this.pause(); updateBoard(); diff --git a/src/main/java/model/Board.java b/src/main/java/model/Board.java index 4edcc1608722953091c701f78aa6f834b8a8863c..3603dcd3b813335329367d708478b6027936d1c5 100644 --- a/src/main/java/model/Board.java +++ b/src/main/java/model/Board.java @@ -7,7 +7,7 @@ import java.util.List; /** * This interface represents a generic board for modeling various state-based systems. * - * @param <S> The type of state represented on the board. + * */ public interface Board { @@ -59,5 +59,11 @@ public interface Board { Item getItemByPosition(Position position); Box getBoxByPosition(Position position); void testScreen(); + + List<Position> neighbors(Position position); + + List<Position> emptyNeighbors(Position position); + + Position opposite(Position opposite, Position center); } diff --git a/src/main/java/model/Box.java b/src/main/java/model/Box.java index bbd1a237c84d5f47bb6709dc32661bd21b7f6a9d..ea40ae1e2b5f89a7b6289eb1bb59b8cbef07a3c2 100644 --- a/src/main/java/model/Box.java +++ b/src/main/java/model/Box.java @@ -2,10 +2,11 @@ package model; import util.Position; import view.FirefighterGrid; +import view.Grid; public interface Box { Position position(); - void paint(FirefighterGrid grid); + void paint(Grid grid); } diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java index 40adb4a068cc70708f4cbeaba95681fd1337e108..60f6e2257b311ef271b7d8f4d4c30f1739981894 100644 --- a/src/main/java/model/Cloud.java +++ b/src/main/java/model/Cloud.java @@ -14,7 +14,7 @@ public class Cloud extends Extinguisher implements Item { } - List<Position> move(FirefighterBoard board) { + List<Position> move(Board board) { List<Position> result = new ArrayList<>(); List<Position> finalNeighborsList = new ArrayList<>(); List<Position> neighborsList = board.neighbors(position); diff --git a/src/main/java/model/Extinguisher.java b/src/main/java/model/Extinguisher.java index af8c779ce504fac84653ac85a24d8f31ac8797dd..d748e40a5fa96b97eb3d1c017b7b9bd007af4084 100644 --- a/src/main/java/model/Extinguisher.java +++ b/src/main/java/model/Extinguisher.java @@ -3,6 +3,7 @@ package model; import javafx.scene.paint.Color; import util.Position; import view.FirefighterGrid; +import view.Grid; import java.util.ArrayList; import java.util.List; @@ -21,14 +22,14 @@ public abstract class Extinguisher { } - public List<Position> update(FirefighterBoard board){ + public List<Position> update(Board board){ ArrayList<Position> result = new ArrayList<Position>(); result.addAll(move(board)); result.addAll(extinguish(board)); return result; } - private List<Position> extinguish(FirefighterBoard board) { + private List<Position> extinguish(Board board) { List<Position> result = new ArrayList<>(); List<Item> itemList = board.itemList(); List<Position> neighborsList = board.neighbors(position); @@ -44,9 +45,9 @@ public abstract class Extinguisher { return result; } - abstract List<Position> move(FirefighterBoard board); + abstract List<Position> move(Board board); - public void paint(FirefighterGrid grid){ + public void paint(Grid grid){ grid.paintCircle(position.row(), position.column(), color); } diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java index 2a63ed1555b0e91f2c8b0d8289c4e41c82bf11fc..be758d2e81f805a87827c2ed33986ee528289d8f 100644 --- a/src/main/java/model/Fire.java +++ b/src/main/java/model/Fire.java @@ -1,10 +1,8 @@ package model; -import javafx.scene.layout.HBox; import javafx.scene.paint.Color; import util.Position; -import view.FirefighterGrid; - +import view.Grid; import java.util.ArrayList; import java.util.List; @@ -18,7 +16,7 @@ public class Fire implements Item{ this.position = position; } - public List<Position> update(FirefighterBoard board) { + public List<Position> update(Board board) { ArrayList<Position> result = new ArrayList<Position>(); List<Position> neighborslist = board.neighbors(position); Box box = board.getBoxByPosition(position);; @@ -51,7 +49,7 @@ public class Fire implements Item{ return position; } - public void paint(FirefighterGrid grid){ + public void paint(Grid grid){ grid.paintTriangle(position.row(), position.column(), color); } diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java index 5659d208213c4667c4bd0808d4868c3ac14a976d..96dc7db27200b3fd5ec330c8bb002bf26096c913 100644 --- a/src/main/java/model/Firefighter.java +++ b/src/main/java/model/Firefighter.java @@ -12,7 +12,7 @@ public class Firefighter extends Extinguisher implements Item{ this.color = Color.BLUE; } - public List<Position> move(FirefighterBoard board) { + public List<Position> move(Board board) { List<Position> result = new ArrayList<>(); Set<Position> seen = new HashSet<>(); HashMap<Position, Position> firstMove = new HashMap<>(); diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index bc5745bfcc0ed5ebabe40dd20a2efdc4d9d79ff9..ab836ad7ea832525a6cd006453a4cf00e23585ee 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -144,6 +144,26 @@ public class FirefighterBoard implements Board { return list; } + @Override + public List<Position> emptyNeighbors(Position position) { + return null; + } + + public Position opposite(Position opposite, Position center) { + if (opposite.column() == center.column() || opposite.row() == center.row()){ + if (opposite.column() == (center.column()+1)) { + return new Position(center.row(), center.column()-1); + } else if (opposite.column() == (center.column()-1)) { + return new Position(center.row(), center.column()-1); + } else if (opposite.row() == (center.row()+1)) { + return new Position(center.row()-1, center.column()); + } else if (opposite.row() == (center.row()-1)) { + return new Position(center.row()+1, center.column()); + } + } + return null; + } + public void testScreen(){ Position position; diff --git a/src/main/java/model/Item.java b/src/main/java/model/Item.java index f4c82a3e1e67d8eb51144bcc4074e3106a8909d0..e79b7b35bcdd099eb3112ac188b0bef22bff7213 100644 --- a/src/main/java/model/Item.java +++ b/src/main/java/model/Item.java @@ -2,17 +2,18 @@ package model; import util.Position; import view.FirefighterGrid; +import view.Grid; import java.util.ArrayList; import java.util.List; public interface Item { - List<Position> update(FirefighterBoard board); + List<Position> update(Board board); Position position(); - void paint(FirefighterGrid grid); + void paint(Grid grid); String toString(); } diff --git a/src/main/java/model/MotorFirefighter.java b/src/main/java/model/MotorFirefighter.java index 7e59abd58bda7aec3d4b8474cd9b99c07e503142..9100a55e8ac3d3a5febc2184f8e07a2c3bb15a4f 100644 --- a/src/main/java/model/MotorFirefighter.java +++ b/src/main/java/model/MotorFirefighter.java @@ -12,7 +12,7 @@ public class MotorFirefighter extends Extinguisher implements Item{ this.color = Color.PURPLE; } - public List<Position> move(FirefighterBoard board) { + public List<Position> move(Board board) { List<Position> result = new ArrayList<>(); Set<Position> seen = new HashSet<>(); HashMap<Position, Position> firstMove = new HashMap<>(); diff --git a/src/main/java/model/Mountain.java b/src/main/java/model/Mountain.java index 837ac033983d4d43c01c72045fad019c7c9251a1..0a28d0f02d3eeec0a1a0ca631de1dc7bb4f84b16 100644 --- a/src/main/java/model/Mountain.java +++ b/src/main/java/model/Mountain.java @@ -2,7 +2,7 @@ package model; import javafx.scene.paint.Color; import util.Position; -import view.FirefighterGrid; +import view.Grid; public class Mountain implements Box{ private final Position position; @@ -18,7 +18,7 @@ public class Mountain implements Box{ return position; } - public void paint(FirefighterGrid grid){ + public void paint(Grid grid){ grid.paintSquare(position.row(), position.column(), color); } public String toString(){ diff --git a/src/main/java/model/Paper.java b/src/main/java/model/Paper.java new file mode 100644 index 0000000000000000000000000000000000000000..06aa9bf3649382dc1acee15323ac56bbfe79e43b --- /dev/null +++ b/src/main/java/model/Paper.java @@ -0,0 +1,26 @@ +package model; + +import util.Position; + +import java.util.ArrayList; +import java.util.List; + +public class Paper extends ShifumiElement implements Item{ + public Paper(Position position) { + super(position); + iconName = "Paper"; + } + + public List<Position> reaction(Board board, Item item, Position potentialMove){ + if (item instanceof Stone){ + return tryKillAndMove(board, potentialMove); + } else if (item instanceof Scissors) { + return escape(board, potentialMove); + } + return new ArrayList<>(); + } + + public String toString(){ + return "Paper position : [" + position.row() + ", " + position.column()+ "]"; + } +} diff --git a/src/main/java/model/Road.java b/src/main/java/model/Road.java index defe96f921249d6b8ea8bad1453f3a9372222e1c..3c658dfe4459e280eb15790b6a9b091723f7e74f 100644 --- a/src/main/java/model/Road.java +++ b/src/main/java/model/Road.java @@ -2,10 +2,10 @@ package model; import javafx.scene.paint.Color; import util.Position; -import view.FirefighterGrid; +import view.Grid; public class Road implements Box{ - private Position position; + private final Position position; private final Color color = Color.BLACK; public Road(Position position){ @@ -15,7 +15,7 @@ public class Road implements Box{ return position; } - public void paint(FirefighterGrid grid){ + public void paint(Grid grid){ grid.paintSquare(position.row(), position.column(), color); } diff --git a/src/main/java/model/Rockeries.java b/src/main/java/model/Rockeries.java index 2bf156a028dc7e9eaa4c26b1116bbc3cfc15ad82..d0f5952444ccf2ee83b7e671ce9145d665696ec7 100644 --- a/src/main/java/model/Rockeries.java +++ b/src/main/java/model/Rockeries.java @@ -2,7 +2,7 @@ package model; import javafx.scene.paint.Color; import util.Position; -import view.FirefighterGrid; +import view.Grid; public class Rockeries implements Box{ private final Position position; @@ -17,7 +17,7 @@ public class Rockeries implements Box{ return position; } - public void paint(FirefighterGrid grid){ + public void paint(Grid grid){ grid.paintSquare(position.row(), position.column(), color); } diff --git a/src/main/java/model/Scissors.java b/src/main/java/model/Scissors.java new file mode 100644 index 0000000000000000000000000000000000000000..69f0a11691288b3f16e80a98cf19d05cbdaaace1 --- /dev/null +++ b/src/main/java/model/Scissors.java @@ -0,0 +1,24 @@ +package model; + +import util.Position; + +import java.util.ArrayList; +import java.util.List; + +public class Scissors extends ShifumiElement implements Item{ + public Scissors(Position position) { + super(position); + iconName = "Scissors"; + } + + public List<Position> reaction(Board board, Item item, Position potentialMove){ + if (item instanceof Paper){ + return tryKillAndMove(board, potentialMove); + } else if (item instanceof Stone) { + return escape(board, potentialMove); + } + return new ArrayList<>(); + } + + public String toString() { return "Scissors position : [" + position.row() + ", " + position.column()+ "]"; } +} diff --git a/src/main/java/model/ShifumiElement.java b/src/main/java/model/ShifumiElement.java new file mode 100644 index 0000000000000000000000000000000000000000..cdc83a23d56cbfab11c83480e972554bd1f91220 --- /dev/null +++ b/src/main/java/model/ShifumiElement.java @@ -0,0 +1,92 @@ +package model; + +import javafx.geometry.Pos; +import util.Position; +import view.Grid; + +import java.util.*; + +public abstract class ShifumiElement { + protected Position position; + protected String iconName; + + public ShifumiElement(Position position){ + this.position = position; + } + + public Position position() { + return position; + } + + public List<Position> update(Board board){ + List<Position> result = new ArrayList<>(); + Set<Position> seen = new HashSet<>(); + HashMap<Position, Position> firstMove = new HashMap<>(); + Queue<Position> toVisit = new LinkedList<>(); + for (Position initialMove : board.neighbors(position)) { + result = reaction(board, board.getItemByPosition(initialMove), initialMove); + if (!result.isEmpty()){ + return result; + } + if (board.getItemByPosition(initialMove) == null) { + firstMove.put(initialMove, initialMove); + toVisit.add(initialMove); + } + } + while (!toVisit.isEmpty()) { + Position current = toVisit.poll(); + result = reaction(board, board.getItemByPosition(current), firstMove.get(current)); + if (!result.isEmpty()) { + break; + } + for (Position adjacent : board.neighbors(current)) { + if (seen.contains(adjacent)) continue; + toVisit.add(adjacent); + seen.add(adjacent); + firstMove.put(adjacent, firstMove.get(current)); + } + } + return result; + } + + + public void paint(Grid grid){ + grid.paintPicture(position.row(), position.column(), "/pictures/"+iconName+".png"); + } + + public abstract String toString(); + + public abstract List<Position> reaction(Board board, Item item, Position potentialMove); + + public List<Position> escape(Board board, Position escapePosition) { + List<Position> result = new ArrayList<>(); + List<Position> neighbors = board.emptyNeighbors(position); + neighbors.remove(escapePosition); + for (Position neighbor: neighbors) { + if (neighbor == board.opposite(escapePosition, position)){ + result.add(position); + position = neighbor; + result.add(position); + return result; + } + } + if (!neighbors.isEmpty()) { + result.add(position); + position = neighbors.get(new Random().nextInt(neighbors.size())); + result.add(position); + return result; + } + return result; + } + + public List<Position> tryKillAndMove(Board board, Position newPosition){ + List<Position> result = new ArrayList<>(); + board.itemList().remove(board.getItemByPosition(newPosition)); + result.add(this.position); + position = newPosition; + result.add(this.position); + return result; + } +} + + diff --git a/src/main/java/model/Stone.java b/src/main/java/model/Stone.java new file mode 100644 index 0000000000000000000000000000000000000000..fbfe0854df73e1b1c815af78524c2dc2783ed39f --- /dev/null +++ b/src/main/java/model/Stone.java @@ -0,0 +1,26 @@ +package model; + +import util.Position; + +import java.util.ArrayList; +import java.util.List; + +public class Stone extends ShifumiElement implements Item{ + public Stone(Position position) { + super(position); + iconName = "Stone"; + } + + public List<Position> reaction(Board board, Item item, Position potentialMove){ + if (item instanceof Scissors){ + return tryKillAndMove(board, potentialMove); + } else if (item instanceof Paper) { + return escape(board, potentialMove); + } + return new ArrayList<>(); + } + + public String toString(){ + return "Stone position : [" + position.row() + ", " + position.column()+ "]"; + } +} diff --git a/src/main/java/model/StonePaperScissorsBoard.java b/src/main/java/model/StonePaperScissorsBoard.java new file mode 100644 index 0000000000000000000000000000000000000000..18fb1c1bd4e8e419b0e077157318eca44a2fb929 --- /dev/null +++ b/src/main/java/model/StonePaperScissorsBoard.java @@ -0,0 +1,165 @@ +package model; + +import util.Position; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class StonePaperScissorsBoard implements Board { + private final int columnCount; + private final int rowCount; + private final int initialPaperCount; + private final int initialScissorsCount; + private final int initialStoneCount; + private List<Item> itemList; + private int step = 0; + private final Random randomGenerator = new Random(); + + public StonePaperScissorsBoard(int columnCount, int rowCount, int initialPaperCount, int initialScissorsCount, int initialStoneCount) { + this.columnCount = columnCount; + this.rowCount = rowCount; + this.itemList = new ArrayList<>(); + this.initialPaperCount = initialPaperCount; + this.initialScissorsCount = initialScissorsCount; + this.initialStoneCount = initialStoneCount; + initializeItems(); + } + + public void initializeItems() { + for (int i = 0; i < initialPaperCount; i++){ + itemList.add(new Paper(randomEmptyPosition())); + } + for (int i = 0; i < initialScissorsCount; i++){ + itemList.add(new Scissors(randomEmptyPosition())); + } + for (int i = 0; i < initialStoneCount; i++){ + itemList.add(new Stone(randomEmptyPosition())); + } + } + + private Position randomEmptyPosition() { + Position result; + for(;;){ + result = randomPosition(); + if (getItemByPosition(result) == null) return result; + } + } + + private Position randomPosition() { + return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount)); + } + + @Override + public int rowCount() { + return rowCount; + } + + @Override + public int columnCount() { + return columnCount; + } + + public List<Position> updateToNextGeneration() { + List<Position> result = new ArrayList<Position>(); + List<Item> actualList = new ArrayList<Item>(itemList); + for (Item item : actualList) { + if (item instanceof Stone) result.addAll(item.update(this)); + } + actualList = new ArrayList<Item>(itemList); + for (Item item : actualList) { + if (item instanceof Paper) result.addAll(item.update(this)); + } + actualList = new ArrayList<Item>(itemList); + for (Item item : actualList) { + if (item instanceof Scissors) result.addAll(item.update(this)); + } + step++; + return result; + } + + @Override + public int stepNumber() { return step; } + + public List<Item> itemList() { return itemList; } + + public Item getItemByPosition(Position position) { + for (Item item : itemList) { + if (item.position().equals(position)) { + return item; + } + } + return null; + } + + @Override + public Box getBoxByPosition(Position position) { + return null; + } + + + @Override + public void reset() { + step = 0; + itemList.clear(); + initializeItems(); + } + + public List<Position> neighbors(Position position) { + List<Position> list = new ArrayList<>(); + if (position.row() > 0) list.add(new Position(position.row() - 1, position.column())); + if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1)); + if (position.row() < rowCount - 1) list.add(new Position(position.row() + 1, position.column())); + if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1)); + return list; + } + + public List<Position> emptyNeighbors(Position position) { + List<Position> list = new ArrayList<>(); + if (position.row() > 0 && getItemByPosition(new Position(position.row() - 1, position.column())) == null) list.add(new Position(position.row() - 1, position.column())); + if (position.column() > 0 && getItemByPosition(new Position(position.row(), position.column() - 1)) == null) list.add(new Position(position.row(), position.column() - 1)); + if (position.row() < rowCount - 1 && getItemByPosition(new Position(position.row()+ 1, position.column())) == null) list.add(new Position(position.row() + 1, position.column())); + if (position.column() < columnCount - 1 && getItemByPosition(new Position(position.row()+ 1, position.column())) == null) list.add(new Position(position.row(), position.column() + 1)); + return list; + } + + @Override + public Position opposite(Position opposite, Position center) { + if (opposite != center && (opposite.column() == center.column() || opposite.row() == center.row())){ + if (opposite.column() == (center.column()+1)) { + return new Position(center.row(), center.column()-1); + } else if (opposite.column() == (center.column()-1)) { + return new Position(center.row(), center.column()-1); + } else if (opposite.row() == (center.row()+1)) { + return new Position(center.row()-1, center.column()); + } else if (opposite.row() == (center.row()-1)) { + return new Position(center.row()+1, center.column()); + } + } + return null; + } + + public void testScreen(){ + Position position; + + System.out.println(itemList.toString()); + + for (int row = 0; row < rowCount; row++){ + for (int column = 0; column < columnCount; column++){ + + position = new Position(row,column); + if (getItemByPosition(position) == null){ + System.out.print("□ "); + } else if (getItemByPosition(position) instanceof Stone) { + System.out.print("St "); + } else if (getItemByPosition(position) instanceof Paper) { + System.out.print("Pa "); + } else if (getItemByPosition(position) instanceof Scissors) { + System.out.print("sc "); + } + } + System.out.println(); + } + System.out.println(); + } +} diff --git a/src/main/java/view/FirefighterGrid.java b/src/main/java/view/FirefighterGrid.java index aeaa2bfef20bc21eb1470af78bd4fb7e5a11fa08..12f6c4eb63e3e4f8f27f0de79221e9cef296b40d 100644 --- a/src/main/java/view/FirefighterGrid.java +++ b/src/main/java/view/FirefighterGrid.java @@ -102,6 +102,10 @@ public class FirefighterGrid extends Canvas implements Grid{ getGraphicsContext2D().fillRect(column*squareWidth,row*squareHeight, squareWidth, squareHeight); } + @Override + public void paintPicture(int row, int column, String iconDirectory) { + } + public void paintTriangle(int row, int column, Color color){ getGraphicsContext2D().setFill(color); getGraphicsContext2D().fillPolygon(new double[]{column*squareWidth , column*squareWidth + squareWidth/2, (column+1)*squareWidth}, diff --git a/src/main/java/view/Grid.java b/src/main/java/view/Grid.java index 599a31208f71d40a4900c1a798f649cd6d953665..db71753bbdfbbcb6c9337dfe5c28fcc99f01e801 100644 --- a/src/main/java/view/Grid.java +++ b/src/main/java/view/Grid.java @@ -1,5 +1,6 @@ package view; +import javafx.scene.paint.Color; import javafx.util.Pair; import model.Item; import util.Position; @@ -11,8 +12,6 @@ import java.util.List; /** * This interface represents a generic grid structure for displaying two-dimensional data. - * - * @param <E> The type of elements stored in the grid. */ public interface Grid { @@ -44,5 +43,13 @@ public interface Grid { int rowCount(); void initialize(Board board); + + void paintCircle(int row, int column, Color color); + + void paintSquare(int row, int column, Color color); + + void paintPicture(int row, int column, String iconDirectory); + + void paintTriangle(int row, int column, Color color); } diff --git a/src/main/java/view/StonePaperScissorsGrid.java b/src/main/java/view/StonePaperScissorsGrid.java new file mode 100644 index 0000000000000000000000000000000000000000..bad702ba9487e702db8483d4b01c62ba70daadc9 --- /dev/null +++ b/src/main/java/view/StonePaperScissorsGrid.java @@ -0,0 +1,109 @@ +package view; + +import javafx.scene.canvas.Canvas; +import javafx.scene.image.Image; +import javafx.scene.paint.Color; +import model.Board; +import model.Box; +import model.Item; +import util.Position; + +import java.io.InputStream; +import java.util.List; + +public class StonePaperScissorsGrid extends Canvas implements Grid { + private int squareWidth; + private int squareHeight; + private int columnCount; + private int rowCount; + + public void repaint(List<Item> itemList, List<Position> clearList, Board board) { + clear(clearList); + paintItems(itemList); + paintLines(); + } + + private void clear(List<Position> positions) { + for (Position position : positions) { + paintSquare(position.row(), position.column(), Color.WHITE); + } + } + + private void paintItems(List<Item> itemList) { + for (Item item : itemList) { + item.paint(this); + } + } + + public void initialize(Board board) { + for (int row = 0; row < rowCount; row++){ + for (int column = 0; column < columnCount; column++){ + paintSquare(row, column, Color.WHITE); + } + } + paintLines(); + paintItems(board.itemList()); + } + + public int columnCount() { + return columnCount; + } + + public int rowCount() { + return rowCount; + } + + @Override + public void setDimensions(int columnCount, int rowCount, int squareWidth, int squareHeight) { + this.squareWidth = squareWidth; + this.squareHeight = squareHeight; + this.columnCount = columnCount; + this.rowCount = rowCount; + super.setWidth(squareWidth*columnCount); + super.setHeight(squareHeight*rowCount); + + } + + private void paintLines(){ + paintHorizontalLines(); + paintVerticalLines(); + } + + private void paintVerticalLines() { + for(int column = 0; column < columnCount; column++) + getGraphicsContext2D().strokeLine(column*squareWidth, 0,column*squareWidth, getHeight()); + } + + private void paintHorizontalLines() { + for(int row = 0; row < rowCount; row++) + getGraphicsContext2D().strokeLine(0, row*squareHeight, getWidth(), row*squareHeight); + } + + public void paintSquare(int row, int column, Color color){ + getGraphicsContext2D().setFill(color); + getGraphicsContext2D().fillRect(column*squareWidth,row*squareHeight, squareWidth, squareHeight); + } + + @Override + public void paintPicture(int row, int column, String iconDirectory) { + InputStream input = this.getClass().getResourceAsStream(iconDirectory); + assert input != null; + getGraphicsContext2D().drawImage(new Image(input, squareWidth, squareHeight,false, true),column*squareWidth , row*squareHeight); + } + + public void paintTriangle(int row, int column, Color color){ + getGraphicsContext2D().setFill(color); + getGraphicsContext2D().fillPolygon(new double[]{column*squareWidth , column*squareWidth + squareWidth/2, (column+1)*squareWidth}, + new double[]{(row+1)*squareHeight , row*squareHeight, (row+1)*squareHeight}, + 3); + } + + public void paintCircle(int row, int column, Color color){ + getGraphicsContext2D().setFill(color); + getGraphicsContext2D().fillOval(column*squareWidth, row*squareHeight, squareHeight, squareWidth); + } + + private void clearSquare(int row, int column){ + getGraphicsContext2D().clearRect(column*squareWidth,row*squareHeight, squareWidth, squareHeight); + } +} diff --git a/src/main/resources/pictures/Paper.png b/src/main/resources/pictures/Paper.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d0c20c35dd5134d6e7c4ed2714eb0ace84be81 Binary files /dev/null and b/src/main/resources/pictures/Paper.png differ diff --git a/src/main/resources/pictures/Scissors.png b/src/main/resources/pictures/Scissors.png new file mode 100644 index 0000000000000000000000000000000000000000..5a50d1ae4c24691c4a8bc1f01971d8e4d2c8cb56 Binary files /dev/null and b/src/main/resources/pictures/Scissors.png differ diff --git a/src/main/resources/pictures/Stone.png b/src/main/resources/pictures/Stone.png new file mode 100644 index 0000000000000000000000000000000000000000..c95af38a86265c54e7bc451116704e5739f273f6 Binary files /dev/null and b/src/main/resources/pictures/Stone.png differ diff --git a/src/main/resources/view/view.fxml b/src/main/resources/view/Firefighterview.fxml similarity index 100% rename from src/main/resources/view/view.fxml rename to src/main/resources/view/Firefighterview.fxml diff --git a/src/main/resources/view/StonePaperScissorsView.fxml b/src/main/resources/view/StonePaperScissorsView.fxml new file mode 100644 index 0000000000000000000000000000000000000000..a93e4635bb04f8e479e7aaa10fb7f4f0c110bb9e --- /dev/null +++ b/src/main/resources/view/StonePaperScissorsView.fxml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.VBox?> +<?import view.StonePaperScissorsGrid?> + +<?import javafx.scene.control.ToggleButton?> +<?import javafx.scene.control.Separator?> +<?import javafx.scene.control.Label?> +<HBox styleClass="background" stylesheets="@DarkTheme.css" + xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" + fx:controller="controller.Controller"> + <VBox> + <Separator maxHeight="-Infinity" maxWidth="-Infinity" + prefHeight="24.0" prefWidth="200.0"/> + <Label maxHeight="-Infinity" maxWidth="-Infinity" alignment="CENTER" prefHeight="24.0" prefWidth="200.0" + text="Generation number"/> + <Label fx:id="generationNumberLabel" alignment="CENTER" contentDisplay="TEXT_ONLY" + maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="24.0" prefWidth="200.0"/> + <Separator maxHeight="-Infinity" maxWidth="-Infinity" + prefHeight="24.0" prefWidth="200.0"/> + <Button fx:id="restartButton" maxHeight="-Infinity" maxWidth="-Infinity" + mnemonicParsing="false" onAction="#restartButtonAction" prefHeight="24.0" prefWidth="200.0" + text="Restart"/> + <Button fx:id="oneStepButton" maxHeight="-Infinity" maxWidth="-Infinity" + mnemonicParsing="false" onAction="#oneStepButtonAction" prefHeight="24.0" prefWidth="200.0" + text="One step"/> + <ToggleButton fx:id="playToggleButton" maxHeight="-Infinity" maxWidth="-Infinity" + mnemonicParsing="false" onAction="#playToggleButtonAction" prefHeight="24.0" + prefWidth="200.0" styleClass="button" text="Play"/> + <ToggleButton fx:id="pauseToggleButton" maxHeight="-Infinity" maxWidth="-Infinity" + mnemonicParsing="false" onAction="#pauseToggleButtonAction" prefHeight="24.0" + prefWidth="200.0" styleClass="button" text="Pause"/> + </VBox> + <StonePaperScissorsGrid fx:id="grid" + xmlns="http://javafx.com/javafx" + xmlns:fx="http://javafx.com/fxml"> + </StonePaperScissorsGrid> +</HBox> \ No newline at end of file