From 51f4857fb88c7f7b89fb7224fa2fca1d8eabe991 Mon Sep 17 00:00:00 2001 From: JacksoncWagner <62567251+JacksoncWagner@users.noreply.github.com> Date: Sun, 12 Apr 2020 23:24:54 -0400 Subject: [PATCH 1/2] Add files via upload GuiWhy updated rules/instructions page --- guiWhy.java | 753 ++++++++++++++++++++++++---------------------------- 1 file changed, 352 insertions(+), 401 deletions(-) diff --git a/guiWhy.java b/guiWhy.java index 1493f74..d6b245e 100644 --- a/guiWhy.java +++ b/guiWhy.java @@ -1,401 +1,352 @@ -// GUI Libraries -import javafx.application.Application; -import javafx.scene.Scene; -import javafx.scene.control.*; -import javafx.scene.layout.*; -import javafx.stage.Stage; -import javafx.geometry.Pos; -//import javafx.event.*; -//import javax.swing.JFrame; - -// GAME LOGIC Libraries -import java.util.Random; // roll dice -import java.util.stream.Collectors; -import java.util.Collections; // use collections methods such as frequency -import java.util.ArrayList; // for arraylist -import java.util.List; // for list - -// Libraries for writing and reading to file. Save and load game functionality -import java.io.File; // for saving and loading game -import java.io.FileWriter; // write files -import java.io.IOException; -//import java.util.Scanner; // reading from file - - -public class guiWhy extends Application // Start of Class -{ - - //Game Logic Vars - private int players=1; // number of players - private int currentPlayer = 0; // increment by one every main loop, helps track current player - private Random rand = new Random(); // random for roll - private int reroll = 3; // tracks rerolls available - private int setButtonArr; // used to setOnAction for button array categories - Multiplayer[] playerobj; // holds each player obj, including their scoreboard, and overall score - // int[] reservedDice = new int[5]; to be implemented later - - // gui vars - Stage window; // main windows that gui runs ins - Scene scene1, scene2; // scene 1 is main menu and scene 2 will be main board screen - Button button2; // click to start playing - Button [] categories = new Button [13]; // buttons to that score roll in a category - Button roll = new Button("Roll!"); // button to roll dice - Label numberPlayers = new Label("Number of players: " + players); // label that contain's the amount of players playing - Label rollVal = new Label("You rolled a: "); // value of the roll - Label curPlayer = new Label("Player "+(currentPlayer+1)+"'s Turn"); // who the current player is - Label numRolls = new Label("Rolls Left: "+ reroll); // number of rolls available per turn - TextField input = new TextField("# of players?"); // field for the number of players playing - - - public static void main(String[] args) { // main, runs start function - launch(args); - } - - @Override // required for start, which is pulled from application class - public void start(Stage primaryStage) { - window = primaryStage; // set window to primary stage - - //Button 1 - Label label1 = new Label("Yahtzee!"); // set up welcome label - // Button button1 = new Button("Go to scene 2"); // no longer needed - // button1.setOnAction(e -> window.setScene(scene2)); - - button2 = new Button("Click me to play"); // button that when clicked, sets player (# of players) to textfield input and switches scenes - button2.setOnAction(e->setPlayer(input)); - - //Layout 1 - elements in vertical column - VBox layout1 = new VBox(20); - layout1.setAlignment(Pos.BASELINE_CENTER); - layout1.getChildren().addAll(label1, input, button2); - scene1 = new Scene(layout1, 350, 300); - - - //Button 2 - Button button2 = new Button("Go back to the Main Menu"); - button2.setOnAction(e -> { - window.setScene(scene1); saveGame();}); // change scene to main menu and saveGame func - - Button button3 = new Button("Increment current player by 1"); - button3.setOnAction(e -> setCurrentPlayer()); // increment turn to next player or next roll if 1 player - - // Button Roll - roll.setOnAction(e->YahtzeeRollLogic()); // roll 5 di, calls rollLogic function - - //Layout 2 - FlowPane layout2 = new FlowPane(20,20); // scene 2 element put into a FlowPane - layout2.getChildren().addAll(button2,button3, numberPlayers, roll, rollVal,curPlayer, numRolls); - - for (setButtonArr=0; setButtonArr<13; setButtonArr++ ) // set button text to correct numbered option. - { - int i = setButtonArr; // set i here because of final int issue if declared in for loop - categories[setButtonArr] = new Button("Option " + (setButtonArr+1)); - categories[setButtonArr].setOnAction(e->yahtzeeScoreRoll(i+1)); // Score roll based on corresponding number - layout2.getChildren().add(categories[setButtonArr]); // add button at i to the layout - } - layout2.setAlignment(Pos.CENTER); // position layout center - scene2 = new Scene(layout2, 450, 400); // set scene to new scene - - //Display scene 1 at first - scene1.getStylesheets().add("style.css"); - window.setScene(scene1); - window.setTitle("Yahtzee!"); - window.show(); - } - - public void setPlayer(TextField input) - { // Try-catch that catches if entered value is not a valid integer - try - { - players = Integer.parseInt(input.getText()); - } catch (NumberFormatException e) - { - input.setText("Invalid value! Please enter a positive number"); - return; - } - // Checks that passed in int is greater than 0s - if(Integer.parseInt(input.getText())<1) - return; - - System.out.println(players); - YahtzeeSetupLogic(); - numberPlayers.setText("Number of players: "+players); - window.setScene(scene2); - return; - } - - public int getPlayer() - { - return players; - } - - public void setCurrentPlayer() - { - currentPlayer=(currentPlayer+1)%players; - curPlayer.setText("Player "+(currentPlayer+1)+"'s Turn"); - System.out.print(currentPlayer); - reroll=3; - numRolls.setText("Rolls Left: "+ reroll); - rollVal.setText("You rolled a: "); - } - - - public void YahtzeeSetupLogic() - { - System.out.print("Function started with given parameter "+ players + " "); - playerobj = new Multiplayer[players]; - - for(int i =0; i-1 ) // while choice is taken alert user and prompt for input - { - System.out.println("Option already taken or invalid" ); // + option picked by player AKA choice - //choice = cat.nextInt(); - return; - } - if(rollVal.getText()=="You rolled a: ") - { - System.out.println("You need to roll first!"); - return; - } - - playerobj[currentPlayer].setScoreboard(choice-1,categories(playerobj[currentPlayer].getRollList(), choice)); // assign scoreboard category to score of dice based on result of category method - playerobj[currentPlayer].setScore(playerobj[currentPlayer].getScoreboard(choice-1)); // assign total score to itself + new points from category - - System.out.println("current score is:" + playerobj[currentPlayer].getScore()); // print our current score and score for that specific roll - System.out.println("Score for category " +choice+ " is " + playerobj[currentPlayer].getScoreboard(choice -1)); - - setCurrentPlayer(); - } - - - - public static int categories(ArrayList rolls, int choice) // method to determine score of that roll in relation category chosen by user - { - int score = 0; - - if (choice < 7) // if less than 7, then score is the sum of dice that value was chosen by user (choice) - { - for(int i =0; i< rolls.size(); i++) - { - if(rolls.get(i)== choice) - score+=choice; - } - - return score; - } - - if (choice == 7 || choice == 8) // if 7 or 8 check frequency for three of a kind or four of a kind. If valid score is sum off all dice, otherwise 0 - { - int threeKind = Collections.frequency(rolls, rolls.get(0)); - int threeKindMid = Collections.frequency(rolls, rolls.get(2)); - int threeKind2 = Collections.frequency(rolls, rolls.get(4)); - if(choice==7) - { - if (threeKind > 2 || threeKind2 > 2 || threeKindMid > 2) - { - for(int total : rolls) - score+=total; - } - } - else if (choice == 8) - { - if (threeKind > 3 || threeKind2 > 3) - { - for(int total : rolls) - score+=total; - } - } - - return score; - - } - - if (choice == 9) // if 9, check for full house. Score is 25 - { - int fullHouse = Collections.frequency(rolls, rolls.get(0)); - int fullHouse2 = Collections.frequency(rolls, rolls.get(4)); - - if ( (fullHouse > 1 & fullHouse2 > 2) || (fullHouse > 2 && fullHouse2 > 1) ) - score+=25; - - return score; - } - - if (choice == 10) // if 10 look for small straight, 4 in a row. Score is 30 - { - List Straights = rolls.stream().distinct().collect(Collectors.toList()); - if(Straights.size()<4) // convert rolls into distinct list with uniques integers - return score; // if size is less than 4, than can't be a small straight - - boolean straight=true; - - for(int i=0; i<3; i++) - { - if (Straights.get(i)!=Straights.get(i+1)-1) - straight=false; - } - if(straight==true) - return 30; - - //otherwise size is 5 - if(Straights.size()==5) - { - for(int i=1; i 4) - score+=50; - - return score; - } - - if (choice == 13) // if 13 chance, score is sum of dice - { - for(int total : rolls) - score+=total; - - return score; - } - - return score; - } - - public static boolean fullScorecard (Multiplayer scoreBoard) // checks scoreboard to see if it is full - { - boolean full = true; - for (int i=0; i<13; i++) - { - if(scoreBoard.getScoreboard(i) <0) - full = false; - } - - return full; - } - - public static boolean gameOver (Multiplayer[] scoreBoard) // uses fullScorecard to check if every player's scorecard is full - { - boolean full = true; - for (int i=0; i{ reserveDice(repetitive);}); + } + + Image ximg = new Image("resources/x.png"); // default image for dice + Button xbut=new Button("", new ImageView(ximg)); + xbut.setStyle("-fx-background-color: transparent;"); + Label olabel = new Label("= Reroll Dice"); // set up welcome label + + Image oimg = new Image("resources/o.png"); // default image for dice + Button obut=new Button("", new ImageView(oimg)); + obut.setStyle("-fx-background-color: transparent;"); + Label xlabel = new Label("= Don't Reroll"); // set up welcome label + + + xlabel.setPadding(new Insets(6,0,0,-15)); + olabel.setPadding(new Insets(6,0,0,-15)); + + + //Button 1 + Label label1 = new Label("Yahtzee!"); // set up welcome label + label1.setFont(Font.font("Arial Black",25)); + + Button startGame = new Button("Click me to play"); // button that when clicked, sets player (# of players) to textfield input and switches scenes + Button instruct = new Button("Instructions"); // FINISH? + startGame.setOnAction(e->{ setPlayerGui(input);}); // sets up intial player values + input.setMaxWidth(310); // set textfeild width where user enters number of players + input.setOnAction(e->{ setPlayerGui(input);}); + instruct.setOnAction(e->{instructbutton();}); + //Layout 1 - elements in vertical column for main menu/start screen + textarea.setWrapText(true); + textarea.setEditable(false); + + VBox layout1 = new VBox(20); + layout1.setAlignment(Pos.BASELINE_CENTER); + layout1.getChildren().addAll(label1, canvas, input, startGame, instruct); + scene1 = new Scene(layout1, 1030, 770); + + ///////////////////////////////////////////////////////////////////////////////////// START OF LAYOUT 2 + + //Button 2 + Button Menu = new Button("Back to the Main Menu"); + Menu.setOnAction(e -> { + window.setScene(scene1); playerobj.saveGame();}); // change scene to main menu and saveGame func + + Button button3 = new Button("Next Player/Turn"); + button3.setOnAction(e -> {playerobj.setCurrentPlayer(); curLabel();}); // increment turn to next player or next roll if 1 player + + HBox topBorder = new HBox(); // HBox and Border Top + topBorder.setPadding(new Insets(10,0,0,0)); + topBorder.setSpacing(10); + curPlayer.setFont(Font.font("Arial Black",14)); + HBox.setMargin(curPlayer,new Insets(5,0,0,0)); + topBorder.getChildren().addAll(Menu,button3,curPlayer,obut,olabel,xbut,xlabel); + + // Button Roll + Button roll = new Button("Roll!"); // button to roll dice + roll.setFont(Font.font("Arial Black",14)); + roll.setOnAction(e->{rollSet();}); // roll 5 di, calls rollLogic function + + HBox innercenterBorder1 = new HBox(); + HBox innercenterBorder2 = new HBox(30); + HBox innercenterBorder3 = new HBox(); + + innercenterBorder1.getChildren().addAll(diceButtons[0],diceButtons[1],diceButtons[2],diceButtons[3],diceButtons[4]); + innercenterBorder2.getChildren().addAll(numberPlayers, roll, rollVal, numRolls); + innercenterBorder3.getChildren().addAll(availableChoice); + + + VBox centerBorder = new VBox(40); + centerBorder.getChildren().addAll(innercenterBorder1,innercenterBorder2,innercenterBorder3); + + //HBox bottomBorder = new HBox(); + //bottomBorder.setSpacing(10); + //bottomBorder.setPadding(new Insets(10,10,10,10)); + //bottomBorder.getChildren().addAll(numberPlayers, roll, rollVal, numRolls, availableChoice); + + //LAYOUT 2 grid and border + GridPane eastBorder = new GridPane(); // scene 2 element put into a FlowPane. Categories[] + eastBorder.setVgap(20); + eastBorder.setPadding(new Insets(10,0,-40,10)); + + GridPane westBorder = new GridPane(); //sBoard + westBorder.setVgap(25); + westBorder.setPadding(new Insets(30,0,0,10)); + westBorder.setGridLinesVisible(true); + + sboardTitle.setFont(Font.font("Arial Black",14)); + westBorder.getChildren().add(sboardTitle); + + + BorderPane layout2 = new BorderPane(); // scene 2 main gui layout + //////////////////////////////////////////////Layout 3////////////////////////////////////////////// + VBox Layout3 = new VBox(); + + Layout3.setPadding(new Insets(15, 12, 15, 12)); + Layout3.setSpacing(10); + + final ImageView selectedImage = new ImageView(); + selectedImage.setImage(rules); + Layout3.setAlignment(Pos.CENTER); + Layout3.getChildren().addAll(Menu,textarea,selectedImage); + + /////////////////////////////////////////////End Layout 3/////////////////////////////////////////// + for (setButtonArr=0; setButtonArr<13; setButtonArr++ ) // set button text to correct numbered option. + { + int i = setButtonArr; // set i here because of final int issue if declared in for loop + + categories[setButtonArr] = new Button(options[i]); // Set Buttons for scoring + categories[setButtonArr].setOnAction(e->scoreRoll(i+1)); // Score roll based on corresponding number + GridPane.setConstraints(categories[setButtonArr], 0,i); // add button at i to the layout + categories[i].setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); // set button to a max size so they are all the same width + categories[i].setFont(Font.font("Arial Black",14)); // set font style + eastBorder.getChildren().add(categories[i]); // add each button to the eastborder vbox + + sBoard[setButtonArr] = new Label(scoreOptions[i]+" -"); // set Label for sBoard + GridPane.setConstraints(sBoard[setButtonArr], 0,i); // add button at i to the layout + sBoard[i].setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); // set button to a max size so they are all the same width + sBoard[i].setFont(Font.font("Verdana",14)); // set font style + westBorder.add(sBoard[i],0,i+1); // add each button to the eastborder vbox // i + 1 to avoid aces and scoreboard on same cell + } + + layout2.setRight(eastBorder); + layout2.setLeft(westBorder); + layout2.setTop(topBorder); + // layout2.setBottom(bottomBorder); + layout2.setCenter(centerBorder); + + BorderPane.setMargin(centerBorder, new Insets(50,0,0,0)); + BorderPane.setMargin(westBorder, new Insets(0,12,0,12)); + BorderPane.setMargin(eastBorder, new Insets(-41,20,0,0)); + + scene2 = new Scene(layout2, 1030, 770); // set scene to new scene + scene3 = new Scene(Layout3, 1030, 770); + scene3.getStylesheets().add("style_1.css"); + + //Display scene 1 at first + scene1.getStylesheets().add("style.css"); + window.setScene(scene1); + window.setTitle("Yahtzee!"); + window.show(); + } + + public void setPlayerGui(TextField input) + { + playerobj = new logic(); + curPlayer.setText("Player "+(playerobj.getCurPlayer()+1)+"'s Turn"); + if(playerobj.setPlayer(input)) + { + numberPlayers.setText("Number of players: "+playerobj.getPlayers()); + window.setScene(scene2); + } + else return; + } + + public void curLabel() + { + curPlayer.setText("Player "+(playerobj.getCurPlayer()+1)+"'s Turn"); + System.out.print(playerobj.getCurPlayer()); + numRolls.setText("Rolls Left: "+ playerobj.getreroll()); + rollVal.setText("You rolled a: "); + + for(int i =0; i<5; i++) + diceButtons[i].setGraphic(new ImageView(diceNullImg)); // reset dice images to dicenull/? + + for(int i=0;i<13;i++) // set scoreboard + { + if(playerobj.getSboard(i)!=-1) + sBoard[i].setText(scoreOptions[i]+": "+playerobj.getSboard(i)); + else + sBoard[i].setText(scoreOptions[i]+" -"); // if other players categories values are still default + } + + } + + public void reserveDice(int idex) + { + if(rollVal.getText()!="You rolled a: ") + { + playerobj.toggleDice(idex); + + for(int i =0; i<5; i++) + { + if (playerobj.getDiceToggle(i)==0) + diceButtons[i].setGraphic(new ImageView(new Image("resources/dice"+(playerobj.getMulti()[playerobj.getCurPlayer()].getRoll(i))+".png"))); + else + diceButtons[i].setGraphic(new ImageView(new Image("resources/dice"+(playerobj.getMulti()[playerobj.getCurPlayer()].getRoll(i))+"dark.png"))); + } + + } + } + + public void rollSet() + { + if(playerobj.getreroll()!=0) + rollVal.setText("You rolled a: "); // reset roll label + + int test = playerobj.YahtzeeRollLogic(); + + if(test==0) + { + numRolls.setText("OUT OF ROLLS!"); + return; + } + if(test==-1) + { + playerobj.setCurrentPlayer(); + curLabel(); + return; + } + + //if(playerobj.getreroll()!=0) + numRolls.setText("Rolls Left: "+ playerobj.getreroll()); + + for(int i = 0; i < 5; i++) // set roll label to sorted roll + rollVal.setText(rollVal.getText()+ " " +playerobj.getMulti()[playerobj.getCurPlayer()].getRoll(i)); + + for(int i =0; i<5; i++) + { + if (playerobj.getDiceToggle(i)==0) + diceButtons[i].setGraphic(new ImageView(new Image("resources/dice"+(playerobj.getMulti()[playerobj.getCurPlayer()].getRoll(i))+".png"))); + else + diceButtons[i].setGraphic(new ImageView(new Image("resources/dice"+(playerobj.getMulti()[playerobj.getCurPlayer()].getRoll(i))+"dark.png"))); + } + } + + public void scoreRoll(int choice) + { + if(rollVal.getText()=="You rolled a: ") + { + System.out.println("You need to roll first!"); + return; + } + + if(playerobj.yahtzeeScoreRoll(choice)) + { + rollVal.setText("You rolled a: "); + numRolls.setText("Rolls Left: "+ playerobj.getreroll()); + curPlayer.setText("Player "+(playerobj.getCurPlayer()+1)+"'s Turn"); + + for(int i =0; i<5; i++) + playerobj.setDiceToggle(i,0); + + for(int i =0; i<5; i++) + diceButtons[i].setGraphic(new ImageView(diceNullImg)); // reset dice images to dicenull/? + + for(int i=0;i<13;i++) // set scoreboard + { + if(playerobj.getSboard(i)!=-1) + sBoard[i].setText(scoreOptions[i]+": "+playerobj.getSboard(i)); + else + sBoard[i].setText(scoreOptions[i]+" -"); // if other players categories values are still default + } + + availableChoice.setText("");// SET LABEL TO "" + + } + else + availableChoice.setText("Option Already Taken!");// SET LABEL TO OPTION TAKEN! + } + + private void instructbutton() { + // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + window.setScene(scene3); + + } + + } \ No newline at end of file From 61d038cd47cecfa09487145b8e9a6f2e7c23b551 Mon Sep 17 00:00:00 2001 From: JacksoncWagner <62567251+JacksoncWagner@users.noreply.github.com> Date: Thu, 16 Apr 2020 20:20:15 -0400 Subject: [PATCH 2/2] Add files via upload Added buttons for player selection screen, changed setPlayer logic --- guiWhy.java | 46 +++++-- logic.java | 358 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 394 insertions(+), 10 deletions(-) create mode 100644 logic.java diff --git a/guiWhy.java b/guiWhy.java index d6b245e..160f555 100644 --- a/guiWhy.java +++ b/guiWhy.java @@ -33,7 +33,7 @@ public class guiWhy extends Application // Start of Class private Label [] sBoard = new Label [13]; private Label sboardTitle = new Label("SCOREBOARD"); private Label totalScore = new Label("SCOREBOARD"); - + private TextArea howmanyplayers = new TextArea("Please select how many players"); private Button diceButtons [] = new Button[5]; // dice images for roll values and reserve toggle private Image diceNullImg = new Image("resources/diceNull.png"); // default image for dice private Image rules = new Image("resources/helpview.png"); @@ -63,7 +63,7 @@ public void start(Stage primaryStage) { ///////////////////////////////////////////////// START OF LAYOUT 1 - Canvas canvas = new Canvas(350,200 ); // canvas upon gc graphics title will be drawn + Canvas canvas = new Canvas(500,50 ); // canvas upon gc graphics title will be drawn GraphicsContext gc = canvas.getGraphicsContext2D(); @@ -72,8 +72,8 @@ public void start(Stage primaryStage) { gc.setLineWidth(2); Font theFont = Font.font( "Times New Roman", FontWeight.BOLD, 48 ); gc.setFont( theFont ); - gc.fillText( "Yahtzee!", 90, 35 ); - gc.strokeText( "Yahtzee!",90, 35 ); + gc.fillText( "How many Players?", 90, 35 ); + gc.strokeText( "How many Players?",90, 35 ); // Image dice = new Image( "resources/dice.png" ); //gc.drawImage( dice, 130, 100 ); // END OF GRAPHICS DRAW @@ -107,17 +107,43 @@ public void start(Stage primaryStage) { Button startGame = new Button("Click me to play"); // button that when clicked, sets player (# of players) to textfield input and switches scenes Button instruct = new Button("Instructions"); // FINISH? - startGame.setOnAction(e->{ setPlayerGui(input);}); // sets up intial player values + // startGame.setOnAction(e->{ setPlayerGui(input);}); // sets up intial player values input.setMaxWidth(310); // set textfeild width where user enters number of players - input.setOnAction(e->{ setPlayerGui(input);}); + // input.setOnAction(e->{ setPlayerGui(input);}); instruct.setOnAction(e->{instructbutton();}); //Layout 1 - elements in vertical column for main menu/start screen textarea.setWrapText(true); textarea.setEditable(false); + Button player1 = new Button(); + player1.setGraphic(new ImageView(new Image("resources/dice1.png"))); + player1.setOnAction(e->{ setPlayerGui(1);}); + + Button player2 = new Button(); + player2.setGraphic(new ImageView(new Image("resources/dice2.png"))); + player2.setOnAction(e->{ setPlayerGui(2);}); + + Button player3 = new Button(); + player3.setGraphic(new ImageView(new Image("resources/dice3.png"))); + player3.setOnAction(e->{ setPlayerGui(3);}); + + Button player4 = new Button(); + player4.setGraphic(new ImageView(new Image("resources/dice4.png"))); + player4.setOnAction(e->{ setPlayerGui(4);}); + + Button player5 = new Button(); + player5.setGraphic(new ImageView(new Image("resources/dice5.png"))); + player5.setOnAction(e->{ setPlayerGui(5);}); + + Button player6 = new Button(); + player6.setGraphic(new ImageView(new Image("resources/dice6.png"))); + player6.setOnAction(e->{ setPlayerGui(6);}); + + HBox buttonline = new HBox(player1, player2, player3, player4, player5, player6); + buttonline.setAlignment(Pos.CENTER); VBox layout1 = new VBox(20); - layout1.setAlignment(Pos.BASELINE_CENTER); - layout1.getChildren().addAll(label1, canvas, input, startGame, instruct); + layout1.setAlignment(Pos.CENTER); + layout1.getChildren().addAll(label1, canvas,buttonline, instruct); scene1 = new Scene(layout1, 1030, 770); ///////////////////////////////////////////////////////////////////////////////////// START OF LAYOUT 2 @@ -225,11 +251,11 @@ public void start(Stage primaryStage) { window.show(); } - public void setPlayerGui(TextField input) + public void setPlayerGui(int input1) { playerobj = new logic(); curPlayer.setText("Player "+(playerobj.getCurPlayer()+1)+"'s Turn"); - if(playerobj.setPlayer(input)) + if(playerobj.setPlayer(input1)) { numberPlayers.setText("Number of players: "+playerobj.getPlayers()); window.setScene(scene2); diff --git a/logic.java b/logic.java new file mode 100644 index 0000000..1830e20 --- /dev/null +++ b/logic.java @@ -0,0 +1,358 @@ + +// GAME LOGIC Libraries +import java.util.Random; // roll dice +import java.util.stream.Collectors; + +import javafx.scene.control.TextField; + +import java.util.Collections; // use collections methods such as frequency +import java.util.ArrayList; // for arraylist +import java.util.List; // for list + +// Libraries for writing and reading to file. Save and load game functionality +import java.io.File; // for saving and loading game +import java.io.FileWriter; // write files +import java.io.IOException; +//import java.util.Scanner; // reading from file + +public class logic { + + //Game Logic Vars +private int players; // number of players +private int currentPlayer = 0; // increment by one every main loop, helps track current player +private Random rand = new Random(); // random for roll +private int reroll = 3; // tracks rerolls available +Multiplayer[] playerobj; // holds each player obj, including their scoreboard, and overall score +int[] toggleDice = new int[] {0,0,0,0,0}; // track if dice is being reserved or not + +public void setup(int p) // setup inital values +{ + System.out.print("Function started with given parameter "+ players + " "); + players=p; + playerobj = new Multiplayer[players]; + + for(int i =0; i0 && categories(playerobj[currentPlayer].getRollList(), choice)==0)) + { // if invalid yahztee choice then deny score + System.out.println("Option already taken or invalid" ); // + option picked by player AKA choice + return false; + } + } // if category other than yahtzee has already been selected, deny score + else if(playerobj[currentPlayer].getScoreboard(choice -1)>-1 && choice !=12) // while choice is taken alert user and prompt for input + { + System.out.println("Option already taken or invalid" ); // + option picked by player AKA choice + return false; + } + + // set scoreboard and score for current player + playerobj[currentPlayer].setScoreboard(choice-1,categories(playerobj[currentPlayer].getRollList(), choice)); // assign scoreboard category to score of dice based on result of category method + playerobj[currentPlayer].setScore(); + + //CMD Line + System.out.println("current score is:" + playerobj[currentPlayer].getScore()); // print our current score and score for that specific roll + System.out.println("Score for category " +choice+ " is " + playerobj[currentPlayer].getScoreboard(choice -1)); + + setCurrentPlayer(); + //CMD Line + return true; + } + + + + public int categories(ArrayList rolls, int choice) // method to determine score of that roll in relation category chosen by user + { + int score = 0; + playerobj[currentPlayer].sortRoll(); // sort in between print out for user readibility + + if (choice < 7) // if less than 7, then score is the sum of dice that value was chosen by user (choice) + { + for(int i =0; i< rolls.size(); i++) + { + if(rolls.get(i)== choice) + score+=choice; + } + + return score; + } + + if (choice == 7 || choice == 8) // if 7 or 8 check frequency for three of a kind or four of a kind. If valid score is sum off all dice, otherwise 0 + { + int threeKind = Collections.frequency(rolls, rolls.get(0)); + int threeKindMid = Collections.frequency(rolls, rolls.get(2)); + int threeKind2 = Collections.frequency(rolls, rolls.get(4)); + if(choice==7) + { + if (threeKind > 2 || threeKind2 > 2 || threeKindMid > 2) + { + for(int total : rolls) + score+=total; + } + } + else if (choice == 8) + { + if (threeKind > 3 || threeKind2 > 3) + { + for(int total : rolls) + score+=total; + } + } + + return score; + + } + + if (choice == 9) // if 9, check for full house. Score is 25 + { + int fullHouse = Collections.frequency(rolls, rolls.get(0)); + int fullHouse2 = Collections.frequency(rolls, rolls.get(4)); + + if ( (fullHouse > 1 & fullHouse2 > 2) || (fullHouse > 2 && fullHouse2 > 1) ) + score+=25; + + return score; + } + + if (choice == 10) // if 10 look for small straight, 4 in a row. Score is 30 + { + List Straights = rolls.stream().distinct().collect(Collectors.toList()); + if(Straights.size()<4) // convert rolls into distinct list with uniques integers + return score; // if size is less than 4, than can't be a small straight + + boolean straight=true; + + for(int i=0; i<3; i++) + { + if (Straights.get(i)!=Straights.get(i+1)-1) + straight=false; + } + if(straight==true) + return 30; + + //otherwise size is 5 + if(Straights.size()==5) + { + for(int i=1; i 4) + score+=50; + + if(fiveKind > 4 && playerobj[currentPlayer].getScoreboard(11)>0) // another 50 for +100 when seconde yahtzee or more + score+=50; + + return score; + } + + if (choice == 13) // if 13 chance, score is sum of dice + { + for(int total : rolls) + score+=total; + + return score; + } + + return score; + } + + public static boolean fullScorecard (Multiplayer scoreBoard) // checks scoreboard to see if it is full + { + boolean full = true; + for (int i=0; i<13; i++) + { + if(scoreBoard.getScoreboard(i) <0) + full = false; + } + + return full; + } + + public static boolean gameOver (Multiplayer[] scoreBoard) // uses fullScorecard to check if every player's scorecard is full + { + boolean full = true; + for (int i=0; i