diff --git a/class/application/Controller$1.class b/class/application/Controller$1.class new file mode 100644 index 0000000000000000000000000000000000000000..51b66919e71c48372e4c9fa9a1ea11909dccc0b2 Binary files /dev/null and b/class/application/Controller$1.class differ diff --git a/class/application/Controller.class b/class/application/Controller.class index 9e09295f37fd6a40e3d5de34efcbe6a8cde20d4e..6266957965d0fc7670da3eab97f411957e16d2aa 100644 Binary files a/class/application/Controller.class and b/class/application/Controller.class differ diff --git a/class/application/MainGUI.fxml b/class/application/MainGUI.fxml index e92780c0a7a3a7bb2b4113422cae8dfd6ccc9a13..a6a521c7ea37697baa6dcb4a0347695000b69b8a 100644 --- a/class/application/MainGUI.fxml +++ b/class/application/MainGUI.fxml @@ -1,13 +1,21 @@ <?xml version="1.0" encoding="UTF-8"?> +<?import javafx.scene.control.Label?> <?import javafx.scene.image.ImageView?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.HBox?> +<?import javafx.scene.text.Font?> <AnchorPane prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller"> <children> - <HBox fx:id="hboxPlayerDeck" layoutX="83.0" layoutY="450.0" prefHeight="107.0" prefWidth="634.0" /> + <HBox fx:id="hboxPlayerDeck" alignment="CENTER" layoutX="83.0" layoutY="450.0" prefHeight="107.0" prefWidth="634.0" /> <ImageView fx:id="iconDeck" fitHeight="90.0" fitWidth="57.0" layoutX="447.0" layoutY="230.0" pickOnBounds="true" preserveRatio="true" /> <ImageView fx:id="iconLastCard" fitHeight="90.0" fitWidth="57.0" layoutX="277.0" layoutY="230.0" pickOnBounds="true" preserveRatio="true" /> + <HBox fx:id="hboxAI1" layoutX="246.0" layoutY="31.0" prefHeight="107.0" prefWidth="309.0" /> + <Label fx:id="labelCurrentPlayer" alignment="CENTER" contentDisplay="CENTER" layoutX="320.0" layoutY="377.0" prefHeight="31.0" prefWidth="162.0" textAlignment="CENTER"> + <font> + <Font name="System Bold" size="19.0" /> + </font> + </Label> </children> </AnchorPane> diff --git a/class/logic/AI.class b/class/logic/AI.class index 2244de046670dc6c2f863e8836304ceb02c3c410..653ed62e7299254dd07b0cfe2810c0db4bc913c5 100644 Binary files a/class/logic/AI.class and b/class/logic/AI.class differ diff --git a/class/logic/Game.class b/class/logic/Game.class index 2c08991143131323f6c047ab596d63d1fabdf01e..c148f6bd2cd1beeec9a4af410ccf6433248bb8e8 100644 Binary files a/class/logic/Game.class and b/class/logic/Game.class differ diff --git a/class/logic/Player.class b/class/logic/Player.class index bd82c537dc81df483d302da92a725af1f010820f..8f921401c014056841767dd73eb99de384d60a20 100644 Binary files a/class/logic/Player.class and b/class/logic/Player.class differ diff --git a/src/application/Controller.java b/src/application/Controller.java index d048273a24a8c3b1960d98023e93a548e7629223..e889885b3373f5a0accf72b4172af7ce86b50949 100644 --- a/src/application/Controller.java +++ b/src/application/Controller.java @@ -4,12 +4,15 @@ import java.util.ArrayList; import java.util.Locale; import java.util.ResourceBundle; +import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.geometry.Insets; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.input.MouseEvent; import javafx.scene.layout.HBox; import javafx.stage.Stage; import logic.Card; @@ -21,19 +24,22 @@ public class Controller { @FXML private ImageView iconLastCard; @FXML private ImageView iconDeck; - @FXML private HBox hboxPlayerDeck; - + @FXML private HBox hboxPlayerDeck; + @FXML private HBox hboxAI1; + @FXML private Label labelCurrentPlayer; + public Game game; - + public Stage stage; public Image icon = new Image("images/icon.png"); private final ResourceBundle bundle = ResourceBundle.getBundle("application/", Locale.GERMANY); public void init() { - iconDeck.setImage(createBackCard()); - - game = new Game(this, 3); + iconDeck.setImage(createBackCard()); + + // DEBUG + game = new Game(this, 1); game.newGame(5); } @@ -41,53 +47,97 @@ public class Controller { this.stage = stage; } - + + public void setLabelCurrentPlayer(String text) + { + labelCurrentPlayer.setText(text); + } + public void setLastCard(Card card) { iconLastCard.setImage(createCard(card, true).getImage()); } - + private Image createBackCard() - { - return new Image("images/card-back.png"); + { + return new Image("images/card-back.png"); } - + private ImageView createCard(Card card, boolean valid) - { + { ImageView imageView = new ImageView(new Image("images/" + card.getType() + "-" + card.getColor() + ".png")); imageView.setFitHeight(90.0); - imageView.setFitWidth(57.0); - + imageView.setFitWidth(57.0); + + if(!valid) + { + //TODO +// imageView.setImage(new Image("images/transparent/" + card.getType() + "-" + card.getColor() + ".png")); +// imageView.setStyle("-fx-background-color: transparent;"); + } + + imageView.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() + { + @Override + public void handle(MouseEvent event) + { + if(valid) + { + Color newWishColor = null; + + if(card.getType().equals(CardType.WILD) || card.getType().equals(CardType.DRAW_FOUR)) + { + // TODO chose wishColor + } + + game.playCard(game.getPlayer().playCard(card), newWishColor); + } + } + }); + return imageView; } - + public void setPlayerDeck(ArrayList<Card> deck) { - hboxPlayerDeck.getChildren().clear(); - + hboxPlayerDeck.getChildren().clear(); + for(Card currentCard : deck) { hboxPlayerDeck.getChildren().add(createCard(currentCard, true)); - HBox.setMargin(hboxPlayerDeck.getChildren().get(hboxPlayerDeck.getChildren().size() - 1), new Insets(0,15,0,0)); + HBox.setMargin(hboxPlayerDeck.getChildren().get(hboxPlayerDeck.getChildren().size() - 1), new Insets(0, 15, 0, 0)); } - } - + } + + // TODO other AIs + // TODO set Cards to back + public void setAI1Deck(ArrayList<Card> deck) + { + hboxAI1.getChildren().clear(); + + for(Card currentCard : deck) + { + hboxAI1.getChildren().add(createCard(currentCard, true)); + HBox.setMargin(hboxAI1.getChildren().get(hboxAI1.getChildren().size() - 1), new Insets(0, 15, 0, 0)); + } + } + public void setValidPlayerDeck(ArrayList<Card> deck, ArrayList<Card> validDeck) - { + { for(Card currentCard : deck) { if(validDeck.contains(currentCard)) { hboxPlayerDeck.getChildren().add(createCard(currentCard, true)); - } + } else { hboxPlayerDeck.getChildren().add(createCard(currentCard, false)); } - - HBox.setMargin(hboxPlayerDeck.getChildren().get(hboxPlayerDeck.getChildren().size() - 1), new Insets(0,15,0,0)); + + HBox.setMargin(hboxPlayerDeck.getChildren().get(hboxPlayerDeck.getChildren().size() - 1), new Insets(0, 15, 0, 0)); } - } + } public void about() { diff --git a/src/application/MainGUI.fxml b/src/application/MainGUI.fxml index e92780c0a7a3a7bb2b4113422cae8dfd6ccc9a13..a6a521c7ea37697baa6dcb4a0347695000b69b8a 100644 --- a/src/application/MainGUI.fxml +++ b/src/application/MainGUI.fxml @@ -1,13 +1,21 @@ <?xml version="1.0" encoding="UTF-8"?> +<?import javafx.scene.control.Label?> <?import javafx.scene.image.ImageView?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.HBox?> +<?import javafx.scene.text.Font?> <AnchorPane prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller"> <children> - <HBox fx:id="hboxPlayerDeck" layoutX="83.0" layoutY="450.0" prefHeight="107.0" prefWidth="634.0" /> + <HBox fx:id="hboxPlayerDeck" alignment="CENTER" layoutX="83.0" layoutY="450.0" prefHeight="107.0" prefWidth="634.0" /> <ImageView fx:id="iconDeck" fitHeight="90.0" fitWidth="57.0" layoutX="447.0" layoutY="230.0" pickOnBounds="true" preserveRatio="true" /> <ImageView fx:id="iconLastCard" fitHeight="90.0" fitWidth="57.0" layoutX="277.0" layoutY="230.0" pickOnBounds="true" preserveRatio="true" /> + <HBox fx:id="hboxAI1" layoutX="246.0" layoutY="31.0" prefHeight="107.0" prefWidth="309.0" /> + <Label fx:id="labelCurrentPlayer" alignment="CENTER" contentDisplay="CENTER" layoutX="320.0" layoutY="377.0" prefHeight="31.0" prefWidth="162.0" textAlignment="CENTER"> + <font> + <Font name="System Bold" size="19.0" /> + </font> + </Label> </children> </AnchorPane> diff --git a/src/logic/AI.java b/src/logic/AI.java index 182d1d2f40cf248e4074aa2ef9adecc8c6391516..6dbd96ab03bbb39447ee3682b394bb18bee71d37 100644 --- a/src/logic/AI.java +++ b/src/logic/AI.java @@ -110,6 +110,11 @@ public class AI { return name; } + + public ArrayList<Card> getDeck() + { + return deck; + } public void turn(Card lastCard, Color wishColor, boolean challenge) { @@ -123,12 +128,14 @@ public class AI drawCards(game.getDeck().drawCards(game.getChallengeCounter(), game.getDeadDeck())); System.out.println("draw " + game.getChallengeCounter() + " cards"); System.out.println("deack after draw: " + deck); + game.draw(); } else { drawCard(game.getDeck().drawCard(game.getDeadDeck())); System.out.println("draw one card"); System.out.println("deack after draw: " + deck); + game.draw(); } } else @@ -140,7 +147,7 @@ public class AI Card playedCard = getHighestValuedCard(validDeck); Color newWishColor = null; - if(playedCard.getType().equals(CardType.WILD) || playedCard.getType().equals(CardType.DRAW_TWO)) + if(playedCard.getType().equals(CardType.WILD) || playedCard.getType().equals(CardType.DRAW_FOUR)) { Random random = new Random(); int colorInt = random.nextInt(4) + 1; diff --git a/src/logic/Game.java b/src/logic/Game.java index e4e4aae7dd3ae2fd0ac7df9bfdc7a3e796b2bf77..26af13581c791c9b1050d2eb90443431a592a3d5 100644 --- a/src/logic/Game.java +++ b/src/logic/Game.java @@ -19,6 +19,9 @@ public class Game private boolean challenge; private Direction direction; private Controller controller; + private boolean lastPlayerDraw; + private boolean skipped; + private int counter; public Game(Controller controller, int numberOfAIs) { @@ -27,7 +30,7 @@ public class Game deadDeck = new DeadDeck(); player = new Player("Spieler", this); ais = new ArrayList<AI>(); - for(int i = 0; i < numberOfAIs; i++) + for(int i = 1; i <= numberOfAIs; i++) { ais.add(new AI("AI " + i, this)); } @@ -47,6 +50,8 @@ public class Game wishColor = null; challenge = false; direction = Direction.RIGHT; + lastPlayerDraw = false; + skipped = false; player.initialize(); @@ -60,6 +65,9 @@ public class Game deadDeck.add(deck.drawCard(deadDeck)); lastCard = deadDeck.getCards().get(deadDeck.getCards().size()-1); + controller.setLastCard(lastCard); + + //TODO abfangen wenn +4 oder +2 oder wild am anfang kommt start(); } @@ -69,59 +77,97 @@ public class Game return gameCount; } - private void start() + public void start() { Random random = new Random(); - currentPlayer = random.nextInt(ais.size() + 1) + 1; + currentPlayer = random.nextInt(ais.size() + 1) + 1; - //while(true) - //{ - if(!lastCard.getType().equals(CardType.SKIP)) + counter = 1; + + run(); + } + + private String run() + { + if(player.getDeckSize() == 0) + { + end(player.getName()); + return null; + } + + for(AI winningAI : ais) { - if(lastCard.getType().equals(CardType.REVERSE)) + if(winningAI.getDeckSize() == 0) { - if(direction.equals(Direction.RIGHT)) - { - direction = Direction.LEFT; - } - else - { - direction = Direction.RIGHT; - } - //TODO show icon direction in UI - } - - determineNextPlayer(); - - //DEBUG - currentPlayer = 1; - //TODO mark currentPlayer in UI - - if(currentPlayer == 1) - { - controller.setValidPlayerDeck(player.getDeck(), player.getValidCards(lastCard, wishColor, challenge)); - - //player.turn(lastCard, wishColor, challenge); -// controller.setPlayerDeck(player.getDeck()); - - if(player.getDeckSize() == 0) - { - end(player.getName()); -// break; - } + end(winningAI.getName()); + return null; + } + } + + System.out.println("ROUND: " + counter / 4); + + determineNextPlayer(); + + System.out.println("Player " + currentPlayer + "'s turn"); + + if(skipped || !lastCard.getType().equals(CardType.SKIP)) + { + if(lastCard.getType().equals(CardType.REVERSE) && !lastPlayerDraw) + { + if(direction.equals(Direction.RIGHT)) + { + direction = Direction.LEFT; } else - { - ais.get(currentPlayer - 2).turn(lastCard, wishColor, challenge); - - if(ais.get(currentPlayer - 2).getDeckSize() == 0) - { - end(ais.get(currentPlayer - 2).getName()); -// break; - } + { + direction = Direction.RIGHT; } - } - //} + //TODO show icon direction in UI + } + + //TODO mark currentPlayer in UI + + if(currentPlayer == 1) + { + controller.setLabelCurrentPlayer(player.getName() + " ist am Zug"); + + controller.setValidPlayerDeck(player.getDeck(), player.getValidCards(lastCard, wishColor, challenge)); + + player.turn(lastCard, wishColor, challenge); + controller.setPlayerDeck(player.getDeck()); + } + else + { + AI currentAI = ais.get(currentPlayer - 2); + + controller.setLabelCurrentPlayer(currentAI.getName() + " ist am Zug"); + + currentAI.turn(lastCard, wishColor, challenge); + + switch(currentPlayer) + { + case 2: controller.setAI1Deck(currentAI.getDeck()); + break; +// case 3: controller.setAI2Deck(currentAI.getDeck()); +// break; +// case 4: controller.setAI3Deck(currentAI.getDeck()); +// break; + default: break; + } + } + } + else + { + if(!skipped) + { + System.out.println("SKIPPED player " + currentPlayer); + skipped = true; + run(); + } + } + counter++; + + return null; } private void determineNextPlayer() @@ -153,7 +199,16 @@ public class Game private void end(String name) { //TODO in UI - System.out.println("Player " + name + " wins!"); + System.err.println("Player " + name + " wins!"); + + if(currentPlayer == 1) + { + controller.setLabelCurrentPlayer(player.getName() + " gewinnt!"); + } + else + { + controller.setLabelCurrentPlayer(ais.get(currentPlayer - 2).getName() + " gewinnt!"); + } } public Deck getDeck() @@ -171,6 +226,20 @@ public class Game return challengeCounter; } + public Player getPlayer() + { + return player; + } + + public void draw() + { + challenge = false; + challengeCounter = 0; + lastPlayerDraw = true; + + run(); + } + public void playCard(Card card, Color wishColor) { deadDeck.add(card); @@ -187,12 +256,21 @@ public class Game challenge = true; challengeCounter += 4; } + else + { + challenge = false; + challengeCounter = 0; + } - controller.setLastCard(lastCard); + lastPlayerDraw = false; + skipped = false; + controller.setLastCard(lastCard); System.out.println("new lastCard: " + lastCard); System.out.println("new wishColor: " + this.wishColor); System.out.println("new challenge: " + challenge); System.out.println("new challengeCounter: " + challengeCounter); + + run(); } } \ No newline at end of file diff --git a/src/logic/Player.java b/src/logic/Player.java index c20df037be54a926a46f1ebeb24b74c3422fb2f8..57931d34bc75b602307354f62b77e4a08ff9a006 100644 --- a/src/logic/Player.java +++ b/src/logic/Player.java @@ -124,14 +124,14 @@ public class Player if(challenge) { drawCards(game.getDeck().drawCards(game.getChallengeCounter(), game.getDeadDeck())); - System.err.println("draw " + game.getChallengeCounter() + " cards"); - System.out.println("deack after draw: " + deck); + System.out.println("draw " + game.getChallengeCounter() + " cards"); + System.out.println("deack after draw: " + deck); } else { drawCard(game.getDeck().drawCard(game.getDeadDeck())); - System.err.println("draw one card"); - System.out.println("deack after draw: " + deck); + System.out.println("draw one card"); + System.out.println("deack after draw: " + deck); } } else @@ -139,18 +139,7 @@ public class Player System.out.println("choose"); //playerInput (draw or turnCard) - //DEBUG - Card playedCard = new Card(CardType.EIGHT, Color.RED, 0); - Color newWishColor = null; - - if(playedCard.getType().equals(CardType.WILD) || playedCard.getType().equals(CardType.DRAW_TWO)) - { - //TODO choose color - //DEBUG - newWishColor = Color.BLUE; - } - - game.playCard(playCard(playedCard), newWishColor); + //TODO add "draw" - Button } } } \ No newline at end of file