Прикрутить сеть к крестикам ноликам
Имеется готовый код для игры в крестики нолики, на swing + логика в отдельном классе. Необходимо прикрутить сеть к этим классам. В теории должно все происходить а-ля один игрок - делает ход, он отрисовывается на поле второго игрока и первому игроку блокируется ход. Но я не могу реализовать это в коде.
Код основной Логики
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
class Initial extends JComponent {
protected static final int EMPTY_FIELD = 0;
protected static final int X_FIELD = 10;
protected static final int ZERO_FIELD = 100;
public static int j;
static int i;
int[][] Field;
boolean X_Turn;
public Initial(){
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
Field = new int[3][3];
InitGame();
}
public void InitGame(){
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
Field[i][j] = EMPTY_FIELD;
}
}
X_Turn = true;
}
@Override
protected void processMouseEvent(MouseEvent e) {
if(e.getButton() == e.BUTTON1 ){
int x = e.getX();
int y = e.getY();
int i = (int)((float)x/getWidth()*3);
int j = (int)((float)y/getHeight()*3);
if(Field[i][j] == EMPTY_FIELD){
Field[i][j] = X_Turn?X_FIELD:ZERO_FIELD;
X_Turn = !X_Turn;
repaint();
}
int result = ChekWin();
if(result!=0){
if(result == X_FIELD*3)
JOptionPane.showMessageDialog(this,"Победа крестиков!","Победа",JOptionPane.INFORMATION_MESSAGE);
else if(result == ZERO_FIELD*3)
JOptionPane.showMessageDialog(this,"Победа ноликов!","Победа",JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(this,"Ничья!","Ниья",JOptionPane.INFORMATION_MESSAGE);
InitGame();
repaint();
}
}
}
@Override
protected void paintComponent(Graphics g) {
DrawGrid(g);
ChekVoid(g);
}
protected void DrawGrid(Graphics graphics){
int w = getWidth();
int h = getHeight();
int dw = w/3;
int dh = h/3;
graphics.setColor(Color.BLACK);
for (int i = 1; i < 3; i++) {
graphics.drawLine(0,dh*i,w,dh*i);
graphics.drawLine(dw*i,0,dw*i,h);
}
}
protected void DrawX(int i,int j, Graphics graphics){
graphics.setColor(Color.BLACK);
int dw = getWidth()/3;
int dh = getHeight()/3;
int x = i* dw;
int y = j *dh;
graphics.drawLine(x,y,x+dw,y+dh);
graphics.drawLine(x,y+dh,x+dw,y);
}
public void DrawZero(int i,int j, Graphics graphics){
graphics.setColor(Color.BLACK);
int dw = getWidth()/3;
int dh = getHeight()/3;
int x = i * dw;
int y = j * dh;
graphics.drawOval(x+5*dw/100,y,dw*9/10,dh);
}
protected void ChekVoid(Graphics graphics) {
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j) {
if(Field[i][j] == X_FIELD)
DrawX(i,j,graphics);
else if(Field[i][j] == ZERO_FIELD)
DrawZero(i,j,graphics);
}
}
protected int ChekWin(){
int dg1 = 0,dg2 =0;
for (int i = 0; i < 3; i++) {
dg1 += Field[i][i];
dg2 += Field[i][2-i];
}
if(dg1 ==ZERO_FIELD*3 || dg1 == X_FIELD*3)
return dg1;
if(dg2 ==ZERO_FIELD*3 || dg2 == X_FIELD*3)
return dg2;
boolean isEmpty = false;
int chekH=0,chekV = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if(Field[i][j] == 0) isEmpty = true;
chekH +=Field[i][j];
chekV +=Field[j][i];
}
if(chekH == ZERO_FIELD*3 || chekH == X_FIELD*3) break;
if(chekV == ZERO_FIELD*3 || chekV == X_FIELD*3) break;
chekV =0;
chekH =0;
}
if(chekH ==ZERO_FIELD*3 || chekH == X_FIELD*3)
return chekH;
if(chekV ==ZERO_FIELD*3 || chekV == X_FIELD*3)
return chekV;
if(isEmpty)
return 0;
else
return -1;
}
}
Код основного класса игры
import javax.swing.*;
public class MainGame {
public MainGame(){
InitUI();
}
private static void InitUI(){
JFrame Field = new JFrame();
Initial Grid = new Initial();
Field.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Field.setSize(500,500);
Field.setLocationRelativeTo(null);
Field.add(Grid);
Field.setVisible(true);
}
}
Далее я создал 2 класса игроков, которые должны перекидываться данными, но это не происходит. Я запускаю, они коннектятся и дальше я ставлю х/о в клетке, но ничего не выводится, как должно было бы.
Код первого игрока
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class FirstPlayer extends Initial{
public static void main(String[] args) {
int PORT = 9000;
String HOST = "localhost";
Socket p1;
int lock = 1;
MainGame mg = new MainGame();
try{
while (true){
p1 = new Socket(HOST, PORT);
try(InputStream in = p1.getInputStream(); OutputStream out = p1.getOutputStream()){
lock = in.read();
System.out.println("____");
if(lock!=0){
out.write(lock);
out.write(Initial.i);
out.write(Initial.j);
System.out.println(lock);
System.out.print(i);
System.out.print(j);
}
}
}
}catch (Exception e){ }
}
}
Код второго игрока
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SecondPlayer extends Initial{
public static void main(String[] args) {
int PORT = 9000;
int lock = 0;
MainGame mg = new MainGame();
try {
ServerSocket serverSocket = new ServerSocket(PORT);
while (true){
Socket p2 = serverSocket.accept();
try(InputStream in = p2.getInputStream(); OutputStream out = p2.getOutputStream()){
lock = in.read();
System.out.println("____");
if(lock!=0){
out.write(lock);
out.write(Initial.i);
out.write(Initial.j);
System.out.println(lock);
System.out.print(i);
System.out.print(j);
}
}
}
} catch (IOException exception) {
exception.printStackTrace();
}
}
}