package vn.edu.rmit.sadi;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client extends JFrame implements Runnable {
public static void main(String[] args) throws IOException {
new Client();
}
private Player me;
private Communicator server;
private JLabel lblMessage;
private JButton[] buttons;
private boolean myTurn;
public Client() throws IOException {
initializeUI();
initializeConnection();
new Thread(this).start();
}
private void initializeConnection()
throws UnknownHostException, IOException {
Socket socket = new Socket("localhost", 9999);
ObjectOutputStream oos = new ObjectOutputStream(
socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(
socket.getInputStream());
server = new Communicator(socket, ois, oos);
}
private void initializeUI() {
lblMessage = new JLabel("Waiting to play...");
lblMessage.setPreferredSize(new Dimension(60, 20));
add(lblMessage, BorderLayout.SOUTH);
JPanel btnPanel = new JPanel();
btnPanel.setLayout(new GridLayout(3, 3));
buttons = new JButton[9];
for (int i = 0; i < buttons.length; i++) {
JButton button = createButton(i);
buttons[i] = button;
btnPanel.add(button);
}
add(btnPanel);
setVisible(true);
setSize(300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private JButton createButton(final int index) {
final JButton button = new JButton();
button.setPreferredSize(new Dimension(50, 50));
button.setFont(new Font("Arial", Font.BOLD, 40));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (!myTurn) return;
button.setText(me == Player.Player1 ? "O" : "X");
button.setEnabled(false);
myTurn = false;
lblMessage.setText("Opponent's turn");
server.write(new Move(index/3, index%3));
}
});
return button;
}
public void run() {
Object message = server.read();
while (message != null) {
if (message instanceof Player) {
me = (Player)message;
this.setTitle(me.toString());
} else if (message instanceof Move) {
Move move = (Move)message;
JButton button = buttons[move.x*3 + move.y];
button.setText(me == Player.Player1 ? "X" : "O");
button.setEnabled(false);
} else if (message instanceof Status) {
Status status = (Status)message;
if (status == Status.Continue) {
lblMessage.setText("Your turn");
myTurn = true;
} else { // win, lose, tie
String msg = status == Status.Win ? "You won!"
: status == Status.Lose ? "You lose!"
: "Tie!";
lblMessage.setText(msg);
return;
}
}
message = server.read();
}
}
}