Mr_HO1A

Controller.java

Apr 12th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.44 KB | None | 0 0
  1. import javafx.animation.TranslateTransition;
  2. import javafx.application.Platform;
  3. import javafx.fxml.FXML;
  4. import javafx.fxml.Initializable;
  5. import javafx.geometry.Point2D;
  6. import javafx.scene.control.*;
  7. import javafx.scene.layout.GridPane;
  8. import javafx.scene.layout.Pane;
  9. import javafx.scene.paint.Color;
  10. import javafx.scene.shape.Circle;
  11. import javafx.scene.shape.Rectangle;
  12. import javafx.scene.shape.Shape;
  13. import javafx.util.Duration;
  14.  
  15. import java.net.ConnectException;
  16. import java.net.URL;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.Optional;
  20. import java.util.ResourceBundle;
  21. import java.util.stream.Collectors;
  22. import java.util.stream.IntStream;
  23. import java.sql.*;
  24. import java.util.logging.Level;
  25. import java.util.logging.Logger;
  26.  
  27. public class Controller implements Initializable {
  28.  
  29.     private static final int COLUMNS = 7;
  30.     private static final int ROWS = 6;
  31.     private static final int CIRCLE_DIAMETER = 80;
  32.     private static final String discColor1 = "#0000cd";
  33.     private static final String discColor2 = "#40e0d0";
  34.  
  35.     private static String PLAYER_ONE = "Player One";
  36.     private static String PLAYER_TWO = "Player Two";
  37.  
  38.     private boolean isPlayerOneTurn = true;
  39.     private boolean isPlayerTwoTurn = true;
  40.  
  41.     private Disc[][] insertedDiscsArray = new Disc[ROWS][COLUMNS]; // For Structural Changes: For the developers.
  42.  
  43.     @FXML
  44.     public GridPane rootGridPane;
  45.  
  46.     @FXML
  47.     public Pane insertedDiscsPane;
  48.  
  49.     @FXML
  50.     public Label playerNameLabel;
  51.  
  52.     @FXML
  53.     public Button setNames;
  54.  
  55.     @FXML
  56.     public TextField playerOne;
  57.  
  58.     @FXML
  59.     public TextField playerTwo;
  60.  
  61.     private boolean isAllowedToInsert = true; // Flag to avoid same color disc being added.
  62.  
  63.     public void createPlayground() {
  64.  
  65.         Shape rectangleWithHoles = createGameStructuralGrid();
  66.         rootGridPane.add(rectangleWithHoles, 0, 1);
  67.  
  68.         List < Rectangle > rectangleList = createClickableColumns();
  69.  
  70.         for (Rectangle rectangle: rectangleList) {
  71.             rootGridPane.add(rectangle, 0, 1);
  72.         }
  73.     }
  74.  
  75.     private Shape createGameStructuralGrid() {
  76.  
  77.         Shape rectangleWithHoles = new Rectangle((COLUMNS + 1) * CIRCLE_DIAMETER, (ROWS + 1) * CIRCLE_DIAMETER);
  78.  
  79.         for (int row = 0; row < ROWS; row++) {
  80.  
  81.             for (int col = 0; col < COLUMNS; col++) {
  82.                 Circle circle = new Circle();
  83.                 circle.setRadius(CIRCLE_DIAMETER / 2);
  84.                 circle.setCenterX(CIRCLE_DIAMETER / 2);
  85.                 circle.setCenterY(CIRCLE_DIAMETER / 2);
  86.                 circle.setSmooth(true);
  87.  
  88.                 circle.setTranslateX(col * (CIRCLE_DIAMETER + 5) + CIRCLE_DIAMETER / 4);
  89.                 circle.setTranslateY(row * (CIRCLE_DIAMETER + 5) + CIRCLE_DIAMETER / 4);
  90.  
  91.                 rectangleWithHoles = Shape.subtract(rectangleWithHoles, circle);
  92.             }
  93.         }
  94.  
  95.         rectangleWithHoles.setFill(Color.WHITE);
  96.  
  97.         return rectangleWithHoles;
  98.     }
  99.  
  100.     private List < Rectangle > createClickableColumns() {
  101.  
  102.         List < Rectangle > rectangleList = new ArrayList < > ();
  103.  
  104.         for (int col = 0; col < COLUMNS; col++) {
  105.  
  106.             Rectangle rectangle = new Rectangle(CIRCLE_DIAMETER, (ROWS + 1) * CIRCLE_DIAMETER);
  107.             rectangle.setFill(Color.TRANSPARENT);
  108.             rectangle.setTranslateX(col * (CIRCLE_DIAMETER + 5) + CIRCLE_DIAMETER / 4);
  109.  
  110.             rectangle.setOnMouseEntered(event - > rectangle.setFill(Color.valueOf("#eeeeee26")));
  111.             rectangle.setOnMouseExited(event - > rectangle.setFill(Color.TRANSPARENT));
  112.  
  113.             final int column = col;
  114.             rectangle.setOnMouseClicked(event - > {
  115.                 if (isAllowedToInsert) {
  116.                     isAllowedToInsert = false; // When disc is being dropped then no more disc will be inserted
  117.                     insertDisc(new Disc(isPlayerOneTurn), column);
  118.                 }
  119.             });
  120.  
  121.             rectangleList.add(rectangle);
  122.         }
  123.  
  124.         return rectangleList;
  125.     }
  126.  
  127.     private void insertDisc(Disc disc, int column) {
  128.  
  129.         int row = ROWS - 1;
  130.         while (row >= 0) {
  131.  
  132.             if (getDiscIfPresent(row, column) == null)
  133.                 break;
  134.  
  135.             row--;
  136.         }
  137.  
  138.         if (row < 0) // If it is full, we cannot insert anymore disc
  139.             return;
  140.  
  141.         insertedDiscsArray[row][column] = disc; // For structural Changes: For developers
  142.         insertedDiscsPane.getChildren().add(disc); // For Visual Changes : For Players
  143.  
  144.         disc.setTranslateX(column * (CIRCLE_DIAMETER + 5) + CIRCLE_DIAMETER / 4);
  145.  
  146.         int currentRow = row;
  147.         TranslateTransition translateTransition = new TranslateTransition(Duration.seconds(0.5), disc);
  148.         translateTransition.setToY(row * (CIRCLE_DIAMETER + 5) + CIRCLE_DIAMETER / 4);
  149.         translateTransition.setOnFinished(event - > {
  150.  
  151.             isAllowedToInsert = true; // Finally, when disc is dropped allow next player to insert disc.
  152.             if (gameEnded(currentRow, column)) {
  153.                 gameOver();
  154.             }
  155.  
  156.             isPlayerOneTurn = !isPlayerOneTurn;
  157.             playerNameLabel.setText(isPlayerOneTurn ? PLAYER_ONE : PLAYER_TWO);
  158.         });
  159.  
  160.         translateTransition.play();
  161.     }
  162.  
  163.     private boolean gameEnded(int row, int column) {
  164.  
  165.         List < Point2D > verticalPoints = IntStream.rangeClosed(row - 3, row + 3) // If, row = 3, column = 3, then row = 0,1,2,3,4,5,6
  166.             .mapToObj(r - > new Point2D(r, column)) // 0,3  1,3  2,3  3,3  4,3  5,3  6,3 [ Just an example for better understanding ]
  167.             .collect(Collectors.toList());
  168.  
  169.         List < Point2D > horizontalPoints = IntStream.rangeClosed(column - 3, column + 3)
  170.             .mapToObj(col - > new Point2D(row, col))
  171.             .collect(Collectors.toList());
  172.  
  173.         Point2D startPoint1 = new Point2D(row - 3, column + 3);
  174.         List < Point2D > diagonal1Points = IntStream.rangeClosed(0, 6)
  175.             .mapToObj(i - > startPoint1.add(i, -i))
  176.             .collect(Collectors.toList());
  177.  
  178.         Point2D startPoint2 = new Point2D(row - 3, column - 3);
  179.         List < Point2D > diagonal2Points = IntStream.rangeClosed(0, 6)
  180.             .mapToObj(i - > startPoint2.add(i, i))
  181.             .collect(Collectors.toList());
  182.  
  183.         boolean isEnded = checkCombinations(verticalPoints) || checkCombinations(horizontalPoints) ||
  184.             checkCombinations(diagonal1Points) || checkCombinations(diagonal2Points);
  185.  
  186.         return isEnded;
  187.     }
  188.  
  189.     private boolean checkCombinations(List < Point2D > points) {
  190.  
  191.         int chain = 0;
  192.  
  193.         for (Point2D point: points) {
  194.  
  195.             int rowIndexForArray = (int) point.getX();
  196.             int columnIndexForArray = (int) point.getY();
  197.  
  198.             Disc disc = getDiscIfPresent(rowIndexForArray, columnIndexForArray);
  199.  
  200.             if (disc != null && disc.isPlayerOneMove == isPlayerOneTurn) { // if the last inserted Disc belongs to the current player
  201.  
  202.                 chain++;
  203.                 if (chain == 4) {
  204.                     return true;
  205.                 }
  206.             } else {
  207.                 chain = 0;
  208.             }
  209.         }
  210.  
  211.         return false;
  212.     }
  213.  
  214.     private Disc getDiscIfPresent(int row, int column) { // To prevent ArrayIndexOutOfBoundException
  215.  
  216.         if (row >= ROWS || row < 0 || column >= COLUMNS || column < 0) // If row or column index is invalid
  217.             return null;
  218.  
  219.         return insertedDiscsArray[row][column];
  220.     }
  221.  
  222.     private void gameOver() {
  223.         //String winner = isPlayerOneTurn ? PLAYER_ONE : PLAYER_TWO;
  224.         String winner = "NULL";
  225.         if (isPlayerOneTurn == true) {
  226.             winner = PLAYER_ONE;
  227.             System.out.println("Winner is: " + winner);
  228.         } else if (isPlayerTwoTurn == true) {
  229.             winner = PLAYER_TWO;
  230.             System.out.println("Winner is: " + winner);
  231.         } else if (isPlayerOneTurn != true && isPlayerTwoTurn != true) {
  232.             System.out.println("It is a Tie");
  233.             System.out.print("Match is a draw saving data !");
  234.  
  235.         }
  236.  
  237.         if(winner == "NULL"){
  238.             Alert alert = new Alert(Alert.AlertType.INFORMATION);
  239.             alert.setTitle("Connect Four");
  240.             alert.setHeaderText("The match was a draw!");
  241.             saveDraw();
  242.         }
  243.         else {
  244.             Alert alert = new Alert(Alert.AlertType.INFORMATION);
  245.             alert.setTitle("Connect Four");
  246.             alert.setHeaderText("The Winner is " + winner);
  247.             winnerSave(winner);
  248.         }
  249.  
  250.         alert.setContentText("Want to play again? ");
  251.  
  252.         ButtonType yesBtn = new ButtonType("Yes");
  253.         ButtonType noBtn = new ButtonType("No, Exit");
  254.         alert.getButtonTypes().setAll(yesBtn, noBtn);
  255.  
  256.         Platform.runLater(() - > { // Helps us to resolve IllegalStateException.
  257.  
  258.             Optional < ButtonType > btnClicked = alert.showAndWait();
  259.             if (btnClicked.isPresent() && btnClicked.get() == yesBtn) {
  260.                 // ... user chose YES so RESET the game
  261.                 resetGame();
  262.             } else {
  263.                 // ... user chose NO .. so Exit the Game
  264.                 Platform.exit();
  265.                 System.exit(0);
  266.             }
  267.         });
  268.     }
  269.  
  270.     public void resetGame() {
  271.  
  272.         insertedDiscsPane.getChildren().clear(); // Remove all Inserted Disc from Pane
  273.  
  274.         for (int row = 0; row < insertedDiscsArray.length; row++) { // Structurally, Make all elements of insertedDiscsArray[][] to null
  275.             for (int col = 0; col < insertedDiscsArray[row].length; col++) {
  276.                 insertedDiscsArray[row][col] = null;
  277.             }
  278.         }
  279.  
  280.         isPlayerOneTurn = true; // Let player start the game
  281.         playerNameLabel.setText(PLAYER_ONE);
  282.  
  283.         createPlayground(); // Prepare a fresh playground
  284.     }
  285.  
  286.     private static class Disc extends Circle {
  287.  
  288.         private final boolean isPlayerOneMove;
  289.  
  290.         public Disc(boolean isPlayerOneMove) {
  291.  
  292.             this.isPlayerOneMove = isPlayerOneMove;
  293.             setRadius(CIRCLE_DIAMETER / 2);
  294.             setFill(isPlayerOneMove ? Color.valueOf(discColor1) : Color.valueOf(discColor2));
  295.             setCenterX(CIRCLE_DIAMETER / 2);
  296.             setCenterY(CIRCLE_DIAMETER / 2);
  297.         }
  298.     }
  299.  
  300.     @Override
  301.     public void initialize(URL location, ResourceBundle resources) {
  302.         setNames.setOnAction(event -> {
  303.  
  304.             setPlayers();
  305.         });
  306.  
  307.     }
  308.     String player1 = null;
  309.     String player2 = null;
  310.  
  311.     private void setPlayers() {
  312.         player1 = playerOne.getText();
  313.         PLAYER_ONE = player1;
  314.         playerNameLabel.setText(PLAYER_ONE);
  315.         player2 = playerTwo.getText();
  316.         PLAYER_TWO = player2;
  317.         try {
  318.             Class.forName("com.mysql.jdbc.Driver");
  319.             Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/connectfour", "root", "");
  320.             String sql = "insert into userreg(player1,player2) values('" +
  321.                 player1 + "','" + player2 + "')";
  322.             Statement stat = conn.createStatement();
  323.             stat.execute(sql);
  324.             stat.close();
  325.             conn.close();
  326.             System.out.println("Record saved");
  327.  
  328.         } catch (Exception ex) {
  329.             System.out.println(ex.toString());
  330.         }
  331.     }
  332.  
  333.     // Function to get game ID from the database
  334.     public int getGameID() {
  335.         int gameID = 0;
  336.         try {
  337.             // Getting class from the lib
  338.             Class.forName("com.mysql.jdbc.Driver");
  339.             // Creating Connection With The Database
  340.             Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/connectfour", "root", "");
  341.             // Create Statement
  342.             Statement stmt = conn.createStatement();
  343.             // Setting Sql Query
  344.             String querry = "select * from userreg ORDER BY ID DESC LIMIT 1";
  345.             // Execute Statement to get results
  346.             ResultSet rs = stmt.executeQuery(querry);
  347.             if (rs.next()) {
  348.                 gameID = rs.getInt("ID");
  349.             } else {
  350.                 System.out.println("Cannot Get Game ID!");
  351.             }
  352.         } catch (Exception ex) {
  353.             Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex);
  354.         }
  355.         System.out.println("Returning ID : " + gameID);
  356.         return gameID;
  357.     }
  358.     public void winnerSave(String w) {
  359.         try {
  360.             Class.forName("com.mysql.jdbc.Driver");
  361.             Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/connectfour", "root", "");
  362.             String sql = "update userreg set winner='" +
  363.                 w + "' where ID='" + getGameID() + "'";
  364.             Statement stat = conn.createStatement();
  365.             stat.execute(sql);
  366.             stat.close();
  367.             conn.close();
  368.             System.out.println("Record saved For Winner : " + w);
  369.  
  370.         } catch (Exception ex) {
  371.             System.out.println(ex.toString());
  372.         }
  373.     }
  374.  
  375.     // Function to get List Of Winners
  376.     public ResultSet getHistory() {
  377.         ResultSet rs = null;
  378.         try {
  379.             // Getting class from the lib
  380.             Class.forName("com.mysql.jdbc.Driver");
  381.             // Creating Connection With The Database
  382.             Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/connectfour", "root", "");
  383.             // Create Statement
  384.             Statement stmt = conn.createStatement();
  385.             // Setting Sql Query
  386.             String querry = "select * from userreg";
  387.             // Execute Statement to get results
  388.             rs = stmt.executeQuery(querry);
  389.         } catch (Exception ex) {
  390.             System.out.println("Error in getting history of players!");
  391.             System.exit(1);
  392.         }
  393.         return rs;
  394.     }
  395.  
  396.     //Function to store draw match
  397.     public void saveDraw() {
  398.         try {
  399.             Class.forName("com.mysql.jdbc.Driver");
  400.             Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/connectfour", "root", "");
  401.             String sql = "update userreg set winner='" +
  402.                 "Draw" + "' where ID='" + getGameID() + "'";
  403.             Statement stat = conn.createStatement();
  404.             stat.execute(sql);
  405.             stat.close();
  406.             conn.close();
  407.             System.out.println("Record saved For Draw : ");
  408.  
  409.         } catch (Exception ex) {
  410.             System.out.println(ex.toString());
  411.         }
  412.     }
  413. }
Add Comment
Please, Sign In to add comment