/* Connect four - written in java Copyright (C) 2020 Oliver Schappacher and Dorian Zedler This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package de.itsblue.ConnectFour; import java.awt.*; import java.io.Serializable; import javax.swing.*; import de.itsblue.ConnectFour.Plate.PlateType; import de.itsblue.ConnectFour.player.Player; import de.itsblue.ConnectFour.player.*; public class ConnectFour extends JFrame implements PlayerMoveListener { /** * */ private static final long serialVersionUID = 1L; private GameBoard gameBoard; private ButtonRow buttonRow; private int player = 0; private Player players[] = new Player[2]; private GameType gameType; enum GameType { Local, RemoteServer, RemoteClient } /** * Constructor */ ConnectFour() { // initialize window this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setTitle("Connect 4"); this.setPreferredSize(new Dimension(600, 600)); // initialize layout this.getContentPane().setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); // initialize GameBoard this.gameBoard = new GameBoard(); // initialize ButtonRow this.buttonRow = new ButtonRow(this.gameBoard.getColumns()); // add components to window c.gridy = 0; add(buttonRow, c); c.gridy = 1; this.add(gameBoard, c); // finish up this.pack(); this.setVisible(true); } public void startNewGame(GameType type) { this.gameType = type; switch (type) { case Local: { this.players[0] = new LocalPlayer(this.buttonRow, PlateType.O); this.players[0].addMoveListener(this); this.players[1] = new LocalPlayer(this.buttonRow, PlateType.X); this.players[1].addMoveListener(this); this.player = 0; this.players[player].setIsMyTurn(true); break; } case RemoteClient: { this.players[0] = new LocalPlayer(this.buttonRow, null); this.players[1] = new RemotePlayerClient(this.buttonRow, "localhost", this.players[0]); this.players[0].addMoveListener(this); this.players[1].addMoveListener(this); break; } case RemoteServer: { this.players[0] = new LocalPlayer(this.buttonRow, PlateType.O); this.players[1] = new RemotePlayerServer(this.buttonRow, PlateType.X, this.players[0]); this.players[0].addMoveListener(this); this.players[1].addMoveListener(this); this.player = 0; this.players[player].setIsMyTurn(true); this.players[1].setIsMyTurn(false); break; } } } /** * Function to switch the player */ private void switchPlayer() { this.players[player].setIsMyTurn(false); if (player == 0) { player = 1; } else{ player = 0; } this.players[player].setIsMyTurn(true); } /** * Function to check if the window is in landscape or portrait mode * * @return true if window is in landscape mode, false * if it is not */ public boolean landscape() { return this.getSize().height < this.getSize().width; } /** * Catch player moves */ @Override public void movePerformed(int column, Player src) { if(this.players[this.player].equals(src) || this.gameType == GameType.RemoteClient) { String res; res = this.gameBoard.insertPlate(new Plate(src.usingPlateType), column); if (res == "err") { // beep in case of error Toolkit.getDefaultToolkit().beep(); } else if (res != "ok" && res != "err") { PlateType winnerType = PlateType.valueOf(res); System.out.println("A player won: " + winnerType); } if(this.gameType != GameType.RemoteClient) switchPlayer(); } } /** * Override validate in order to resacle the components when the window is * rescaled */ @Override public void validate() { // determine optimal size for board Dimension boardSize = new Dimension(); boardSize.width = this.landscape() ? this.getSize().height / 2 : this.getSize().width / 2; boardSize.height = this.landscape() ? this.getSize().width : this.getSize().height; // set board size this.gameBoard.setPreferredSize(boardSize); // set button row size this.buttonRow.setPreferredSize( new Dimension(this.gameBoard.getPreferredSize().width, this.gameBoard.getPreferredSize().height / 7)); // call super super.validate(); } public static void main(final String[] args) { ConnectFour game; System.out.println(game = new ConnectFour()); System.out.println("argc: " + args.length); System.out.println("args[0]: " + args[0]); if(args.length <= 0) game.startNewGame(GameType.Local); else if(args[0].equals("server")) game.startNewGame(GameType.RemoteServer); else if(args[0].equals("client")) game.startNewGame(GameType.RemoteClient); else System.out.println("Usage: java ConnectFour.java [server|client]"); } }