Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

JAVA: Im creating a client server game for Connect4. Right now I have the client

ID: 3748447 • Letter: J

Question

JAVA:

Im creating a client server game for Connect4. Right now I have the client class sending info to the server class to populate the board. This is functioning correctly. I can not figure out how to make this a 2 player game, where I will run the client class twice and one player moves while the other waits and the board continues to be populated from both players. Any help would be greatly appreciated. Thanks!

***********client***********


import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Client extends JFrame {

    // Indicate whether the player has the turn
    private boolean myTurn = false;

    // Indicate the token for the player
    private char myToken = ' ';

    // Indicate the token for the other player
    private char otherToken = ' ';

    private static char[][] objArray;
    private static int row;
    private static int col;

    // Text field for receiving column
    private JTextField jtf = new JTextField();

    // Text area to display contents
    private JTextArea jta = new JTextArea();

    // IO streams
    private DataOutputStream toServer;
    private DataInputStream fromServer;

    public static void main(String[] args) {
        new Client();
    }

    public Client() {

        // Panel p to hold the label and text field
        JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        p.add(new JLabel("Enter row"), BorderLayout.WEST);
        p.add(jtf, BorderLayout.CENTER);
        jtf.setHorizontalAlignment(JTextField.RIGHT);
        setLayout(new BorderLayout());
        add(p, BorderLayout.NORTH);
        add(new JScrollPane(jta), BorderLayout.CENTER);

        jtf.addActionListener(new TextFieldListener()); // Register listener
        setTitle("Client");
        setSize(500, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true); // It is necessary to show the frame here!

        try {

            // Create a socket to connect to the server
            Socket socket = new Socket("localhost", 8000);

            // Socket socket = new Socket("130.254.204.36", 8000);
            // Socket socket = new Socket("drake.Armstrong.edu", 8000);
            // Create an input stream to receive data from the server
            fromServer = new DataInputStream(socket.getInputStream());

            // Create an output stream to send data to the server
            toServer = new DataOutputStream(socket.getOutputStream());
        } catch (IOException ex) {
            jta.append(ex.toString() + ' ');
        }
    }

    private class TextFieldListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            try {
                // Get the col from the text field
                int col = Integer.parseInt(jtf.getText().trim());

                // Send the column to the server
                toServer.writeInt(col);
                toServer.flush();

                // Get area from the server
                char x = fromServer.readChar();

                // Display to the text area
                jta.append("Row is " + x + " ");
                // jta.append("Col from the server is " + col + ' ');
            } catch (IOException ex) {
                System.err.println(ex);
            }
        }
    }

}

******************Server************


import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;

public class Server extends JFrame {

    private static int row1 = 6;
    private static int row2 = 6;
    private static int row3 = 6;
    private static int row4 = 6;
    private static int row5 = 6;
    private static int row6 = 6;
    private static int row7 = 6;
// determines total number of possible moves
    private static int count = 42;
// instance to determine who's move it is
    private static int determinePlayer = 0;

//create array
    private static char[][] objArray;

    private static char value;

    // Text area for displaying contents
    private JTextArea jta = new JTextArea();

    public static void main(String[] args) {

        new Server();
    }

    public Server(int x, int y) {
        objArray = new char[x][y];
    }

    public Server() {
        Connect4TextConsole display = new Connect4TextConsole();
        Server matrix = new Server(7, 7);
        // Place text area on the frame
        setLayout(new BorderLayout());
        add(new JScrollPane(jta), BorderLayout.CENTER);
        setTitle("Server");
        setSize(500, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true); // It is necessary to show the frame here!

        try {

            // Create a server socket
            ServerSocket serverSocket = new ServerSocket(8000);
            jta.append("Server started at " + new Date() + ' ');

            // Listen for a connection request
            Socket socket = serverSocket.accept();

            // Create data input and output streams
            DataInputStream inputFromClient = new DataInputStream(socket.getInputStream());
            DataOutputStream outputToClient = new DataOutputStream(socket.getOutputStream());

            while (true) {

                // Receive column from the client
                int col = inputFromClient.readInt();

                /* col = validChoice(col);

                while (!columnSpace(col)) {
                    System.out.print("No more space available! Enter "
                            + "a column (1-7): ");
                    validChoice(col);
                } // end of while*/
                matrix.add(col);
                display.printArray(matrix);
                // Send area back to the client
                outputToClient.writeChar(value);
                //jta.append("Col received from client: " + col + ' ');
                //jta.append("Area found: " + area + ' ');
            }
        } catch (IOException ex) {
            System.err.println(ex);
        }
    }

    public void add(int x) {

        switch (x) {
            case 1:
                if (determinePlayer % 2 == 0) {

                    setElement(row1, 0, 'X');
                    value = 'X';
                } else {

                    setElement(row1, 0, 'O');
                    value = 'O';
                }
                row1--;
                count--;
                determinePlayer++;
                break;

            case 2:
                if (determinePlayer % 2 == 0) {

                    setElement(row2, 1, 'X');
                    value = 'X';
                } else {
                    setElement(row2, 1, 'O');
                    value = 'O';
                }
                row2--;
                count--;
                determinePlayer++;
                break;

            case 3:
                if (determinePlayer % 2 == 0) {
                    setElement(row3, 2, 'X');
                    value = 'X';
                } else {
                    setElement(row3, 2, 'O');
                    value = 'O';
                }
                row3--;
                count--;
                determinePlayer++;
                break;

            case 4:
                if (determinePlayer % 2 == 0) {
                    setElement(row4, 3, 'X');
                    value = 'X';
                } else {
                    setElement(row4, 3, 'O');
                    value = 'O';
                }
                row4--;
                count--;
                determinePlayer++;
                break;

            case 5:
                if (determinePlayer % 2 == 0) {
                    setElement(row5, 4, 'X');
                    value = 'X';
                } else {
                    setElement(row5, 4, 'O');
                    value = 'O';
                }
                row5--;
                count--;
                determinePlayer++;
                break;

            case 6:
                if (determinePlayer % 2 == 0) {
                    setElement(row6, 5, 'X');
                    value = 'X';
                } else {
                    setElement(row6, 5, 'O');
                    value = 'O';
                }
                row6--;
                count--;
                determinePlayer++;
                break;

            case 7:
                if (determinePlayer % 2 == 0) {
                    setElement(row7, 6, 'X');
                    value = 'X';
                } else {
                    setElement(row7, 6, 'O');
                    value = 'O';
                }
                row7--;
                count--;
                determinePlayer++;
                break;
        } // end of switch
    } // end of add

    public char getElement(int a, int b) {
        return objArray[a][b];
    }

    public void setElement(int a, int b, char value) {
        objArray[a][b] = value;
    }

    public static int validChoice(int choice) {
        Scanner scan = new Scanner(System.in);
        int value2;
        while (choice > 7 || choice < 1) { // while for incorrect inputs
            System.out.print("Incorrect Choice - Player 1 enter a column (1-7): ");
            choice = scan.nextInt();
        } // end of while
        value2 = choice;

        return value;
    } // end of valid

    /**
     * column space retrns boolean if enough spcae in column left.
     *
     * @param choice players entered column choice
     * @return boolean for whether or not there is enough space
     */
    public static boolean columnSpace(int choice) {

        if (choice == 1 && row1 < 1) {
            return false;
        } else if (choice == 2 && row2 < 1) {
            return false;
        } else if (choice == 3 && row3 < 1) {
            return false;
        } else if (choice == 4 && row4 < 1) {
            return false;
        } else if (choice == 5 && row5 < 1) {
            return false;
        } else if (choice == 6 && row6 < 1) {
            return false;
        } else if (choice == 7 && row7 < 1) {
            return false;
        } else {
            return true;
        } // if not false then true there is spcae
    }

}

******************Connect4Text************

public class Connect4TextConsole extends Server {

    public Connect4TextConsole() {
        super(7, 7);
    } // end of constructor

    /**
     * Takes in an object array and prints it out
     *
     * @param connect 2D array to be printed
     */
    public void printArray(Server connect) {

        for (int i = 1; i < 7; i++) {
            for (int i2 = 0; i2 < 7; i2++) {
                if (connect.getElement(i, i2) == '') {
                    System.out.print("| |");
                } // end of if
                else {
                    System.out.print("|" + connect.getElement(i, i2) + "|");
                } // end of else
            } // end of 1st for loop
            System.out.println("");
        } // end of 2nd for loop*/
    } // end of printArray

} // end of class Connect4TextConsole

Explanation / Answer

connectfourclient.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.io.*;
import java.net.*;

public class connectfourclient extends JApplet
implements Runnable, connectfourconstraints {
private boolean my_Turn = false;
private char my_token = ' ';
private char other_token = ' ';
private Cell[][] cells = new Cell[6][7];
private JLabel jibl_Title = new JLabel();
private JLabel jibl_Status = new JLabel();
private int row_Select;
private int column_Select;
private DataInputStream from_server;
private DataOutputStream to_server;
private boolean Continuing_PLaying = true;
private boolean wait = true;
private boolean is_StandAlone = false;
private String host = "localhost";
public void init() {
    JPanel pn = new JPanel();
    pn.setLayout(new GridLayout(6, 7, 0, 0));
    for (int i = 0; i < 6; i++)
      for (int j = 0; j < 7; j++)
        pn.add(cells[i][j] = new Cell(i, j, cells));
    pn.setBorder(new LineBorder(Color.black, 1));
    jibl_Title.setHorizontalAlignment(JLabel.CENTER);
    jibl_Title.setFont(new Font("SansSerif", Font.BOLD, 16));
    jibl_Title.setBorder(new LineBorder(Color.black, 1));
    jibl_Status.setBorder(new LineBorder(Color.black, 1));
    add(jibl_Title, BorderLayout.NORTH);
    add(pn, BorderLayout.CENTER);
    add(jibl_Status, BorderLayout.SOUTH);
    COnnect_To_Server();
}

private void COnnect_To_Server() {
    try {
      Socket sckt;
      if (is_StandAlone)
        sckt = new Socket(host, 1234);
      else
        sckt = new Socket(getCodeBase().getHost(), 1234);
      from_server = new DataInputStream(sckt.getInputStream());
      to_server = new DataOutputStream(sckt.getOutputStream());
    }
    catch (Exception ex) {
      System.err.println(ex);
    }
    Thread thread = new Thread(this);
    thread.start();
}
public void run() {
    try {
      int plyer = from_server.readInt();
      if (plyer == PLAYER1) {
        my_token = 'r';
        other_token = 'b';
        jibl_Title.setText("Player 1 with color red");
        jibl_Status.setText("Waiting for plyer 2 to join");
        from_server.readInt();
        jibl_Status.setText("Player 2 has joined. I start first");
        my_Turn = true;
      }
      else if (plyer == PLAYER2) {
        my_token = 'b';
        other_token = 'r';
        jibl_Title.setText("Player 2 with color blue");
        jibl_Status.setText("Waiting for plyer 1 to move");
      }
      while (Continuing_PLaying) {
        if (plyer == PLAYER1) {
          wait_4_Player_Action();
          sendMove();
          receiveInfoFromServer();
        }
        else if (plyer == PLAYER2) {
          receiveInfoFromServer();
          wait_4_Player_Action();
          sendMove();
        }
      }
    }
    catch (Exception ex) {
    }
}

private void wait_4_Player_Action() throws InterruptedException {
    while (wait) {
      Thread.sleep(100);
    }
    wait = true;
}
private void sendMove() throws IOException {
    to_server.writeInt(row_Select);
    to_server.writeInt(column_Select);
}
private void receiveInfoFromServer() throws IOException {
    int stats = from_server.readInt();
    if (stats == PLAYER1_WON) {
      Continuing_PLaying = false;
      if (my_token == 'r') {
        jibl_Status.setText("I won! (red)");
      }
      else if (my_token == 'b') {
        jibl_Status.setText("Player 1 (red) has won!");
        receiveMove();
      }
    }
    else if (stats == PLAYER2_WON) {
      Continuing_PLaying = false;
      if (my_token == 'b') {
        jibl_Status.setText("I won! (blue)");
      }
      else if (my_token == 'r') {
        jibl_Status.setText("Player 2 (blue) has won!");
        receiveMove();
      }
    }
    else if (stats == DRAW) {
      Continuing_PLaying = false;
      jibl_Status.setText("Game is over, no winner!");
      if (my_token == 'b') {
        receiveMove();
      }
    }
    else {
      receiveMove();
      jibl_Status.setText("My turn");
      my_Turn = true;
    }
}
private void receiveMove() throws IOException {
    int rows = from_server.readInt();
    int columns = from_server.readInt();
    cells[rows][columns].setToken(other_token);
}
public class Cell extends JPanel {
    private int rows;
    private int columns;
    private Cell[][] cells;
    private char tkn = ' ';
    public Cell(int rows, int columns, Cell[][] cells) {
      this.rows = rows;
      this.cells = cells;
      this.columns = columns;
      setBorder(new LineBorder(Color.black, 1));
      addMouseListener(new ClickListener());
    }
    public char getToken() {
      return tkn;
    }
    public void setToken(char c) {
      tkn = c;
      repaint();
    }
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (tkn == 'r') {
        g.drawOval(9, 9, getWidth() - 20, getHeight() - 20);
        g.setColor(Color.red);
        g.fillOval(9 ,9, getWidth() - 20, getHeight() - 20);
      }
      else if (tkn == 'b') {
        g.drawOval(10, 10, getWidth() - 20, getHeight() - 20);
        g.setColor(Color.blue);
        g.fillOval(9 ,9, getWidth() - 20, getHeight() - 20);
      }
    }
    private class ClickListener extends MouseAdapter {
      public void mouseClicked(MouseEvent e) {
      int r= -1;
      for(int x =5; x>= 0; x--){
        if(cells[x][columns].getToken() == ' '){
         r=x;
         break;
        }
      }
        if ((r != -1) && my_Turn) {
          cells[r][columns].setToken(my_token);
          my_Turn = false;
          row_Select = r;
          column_Select = columns;
          jibl_Status.setText("Waiting for the other plyer to move");
          wait = false;
        }
      }
    }
}
public static void main(String[] args) {
    JFrame frame = new JFrame("Connect Four Client");
    connectfourclient applet = new connectfourclient();
    applet.is_StandAlone = true;
    if (args.length == 1) applet.host = args[0];
    frame.getContentPane().add(applet, BorderLayout.CENTER);
    applet.init();
    applet.start();
    frame.setSize(640, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
}


-------------------------------------------------------------------------------
connectfourconstraints.java


public interface connectfourconstraints {
public static int player_1 = 1;
public static int player_2 = 2;
public static int player_1_WON = 1;
public static int player_2_WON = 2;
public static int DRAW = 3;
public static int CONTINUE = 4;
}


--------------------------------------------------------------------------------

connectfourserver.java

import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.util.Date;
import java.awt.event.*;

public class connectfourserver extends JFrame implements connectfourconstraints {
JButton jbtConnect;
JTextField iport;
JTextArea jtaLog;
JLabel e;
private class ButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
System.out.println("INSIDE BUTTON LISTENER");
      int port_1 =Integer.parseInt(iport.getText());

  listen(port_1);
    }
}
private void listen(int port_1){
System.out.println("BEGIN LISTEN METHOD");
    try {
      jtaLog.append("WORK!!!!");
System.out.println("CONNECT");
      ServerSocket serverSocket = new ServerSocket(port_1);
System.out.println("DONE");
      jtaLog.append(new Date() + ": Server started at sckt 1234 ");
      int sessionNo = 1;
      while (true) {
        jtaLog.append(new Date() +
          ": Wait for players to join session " + sessionNo + ' ');
System.out.println("GET P1");
        Socket playr1 = serverSocket.accept();
System.out.println("DONE");
        jtaLog.append(new Date() + ": Player 1 joined session " +
          sessionNo + ' ');
        jtaLog.append("Player 1's IP address" +
          playr1.getInetAddress().getHostAddress() + ' ');
        new DataOutputStream(
          playr1.getOutputStream()).writeInt(player_1);
        Socket player2 = serverSocket.accept();
        jtaLog.append(new Date() +
          ": Player 2 joined session " + sessionNo + ' ');
        jtaLog.append("Player 2's IP address" +
          player2.getInetAddress().getHostAddress() + ' ');
        new DataOutputStream(
          player2.getOutputStream()).writeInt(player_2);
        jtaLog.append(new Date() + ": Start a thread for session " +
          sessionNo++ + ' ');
        HandleASession task = new HandleASession(playr1, player2);
        new Thread(task).start();
      }
    }
    catch(IOException ex) {
      System.err.println(ex);
    }
    }
public static void main(String[] args) {
   connectfourserver frame = new connectfourserver();
}
public connectfourserver() {
JPanel pn1 = new JPanel();
JPanel pn2 = new JPanel(new GridLayout(1,2));
jbtConnect= new JButton("Connect");
iport = new JTextField(4);
jtaLog = new JTextArea();
e = new JLabel("Port:");
pn1.add(jtaLog);
pn2.add(jbtConnect);
pn2.add(e);
pn2.add(iport);
jtaLog.append("TEsting ");
    add(pn1, BorderLayout.CENTER);
add(pn2, BorderLayout.SOUTH);
jbtConnect.addActionListener(new ButtonListener());
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500, 700);
    setTitle("Connect Four Server");
    setVisible(true);
}
}

class HandleASession implements Runnable, connectfourconstraints {
private Socket playr1;
private Socket player2;
private char[][] cells = new char[6][7];
private DataInputStream fromPlayer1;
private DataOutputStream toPlayer1;
private DataInputStream fromPlayer2;
private DataOutputStream toPlayer2;
private boolean Continuing_PLaying = true;
public HandleASession(Socket playr1, Socket player2) {
    this.playr1 = playr1;
    this.player2 = player2;
    for (int i = 0; i < 6; i++)
      for (int j = 0; j < 7; j++)
        cells[i][j] = ' ';
}

public void run() {
    try {
      DataInputStream fromPlayer1 = new DataInputStream(
        playr1.getInputStream());
      DataOutputStream to_Player1 = new DataOutputStream(
        playr1.getOutputStream());
      DataInputStream from_player2 = new DataInputStream(
        player2.getInputStream());
      DataOutputStream to_player2 = new DataOutputStream(
        player2.getOutputStream());
      to_Player1.writeInt(1);
      while (true) {
        int rows = fromPlayer1.readInt();
        int columns = fromPlayer1.readInt();
        char tkn = 'r';
        cells[rows][columns] = 'r';
        if (isWon(rows, columns, tkn)) {
          to_Player1.writeInt(player_1_WON);
          to_player2.writeInt(player_1_WON);
          sendMove(to_player2, rows, columns);
          break;
        }
        else if (isFull()) {
          to_Player1.writeInt(DRAW);
          to_player2.writeInt(DRAW);
          sendMove(to_player2, rows, columns);
          break;
        }
        else {
          to_player2.writeInt(CONTINUE);
          sendMove(to_player2, rows, columns);
       }
        rows = from_player2.readInt();
        columns = from_player2.readInt();
        cells[rows][columns] = 'b';
        if (isWon(rows, columns, tkn)) {
          to_Player1.writeInt(player_2_WON);
          to_player2.writeInt(player_2_WON);
          sendMove(to_Player1, rows, columns);
          break;
        }
        else {
          to_Player1.writeInt(CONTINUE);
          sendMove(to_Player1, rows, columns);
        }
      }
    }
    catch(IOException ex) {
      System.err.println(ex);
    }
}

private void sendMove(DataOutputStream out, int rows, int columns)
      throws IOException {
    out.writeInt(rows);
    out.writeInt(columns);
}
private boolean isFull() {
    for (int i = 0; i < 6; i++)
      for (int j = 0; j < 7; j++)
        if (cells[i][j] == ' ')
          return false;
    return true;
}
private boolean isWon(int rows, int columns, char tkn) {
for (int a = 0; a < 5; a++) {
  for (int b = 0; b < 6; b++) {
   System.out.print(cells[a][b]);
  }
  System.out.println();
}
for (int a = 0; a < 6; a++) {
  for (int b = 0; b < 3; b++) {
   if (cells[a][b] == tkn && cells[a][b+1] == tkn && cells[a][b+2] == tkn && cells[a][b+3] == tkn) {
    return true;
   }
  }
}
for (int a = 0; a < 3; a++) {
  for (int b = 0; b < 7; b++) {
   if (cells[a][b] == tkn && cells[a+1][b] == tkn && cells[a+2][b] == tkn && cells[a+3][b] == tkn) {
    return true;
   }
  }
}
for (int a = 0; a < 3; a++) {
  for (int b = 0; b < 6; b++) {
   if (cells[a][b] == tkn && cells[a+1][b+1] == tkn && cells[a+2][b+2] == tkn && cells[a+3][b+3] == tkn) {
    return true;
   }
  }
}
for (int a = 0; a < 3; a++) {
  for (int b = 3; b < 7; b++) {
   if (cells[a][b] == tkn && cells[a+1][b-1] == tkn && cells[a+2][b-2] == tkn && cells[a+3][b-3] == tkn) {
    return true;
   }
  }
}
return false;
}
}