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;
}
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.