このゲームは2人のプレイヤー/クライアントとして1つの「X」が「O」です。私のゲームは、最初のプレーヤーが乱数で満たされたグリッドとしてすでに始まっているときに、ペア(1から8)の乱数で満たされた4x4グリッドを使用しますが、両方のプレーヤーのグリッドで等しい数。メモリゲーム2プレーヤーJavaクライアントサーバー
関数setArrayListText()のコードを変更するか、コードのインスタンスを追加/変更する必要がありますか?
Cliente.java(クライアント)
public class Cliente extends JFrame implements ActionListener,Runnable
{
...
private JPanel boardPanel, panel2;
private JButton[] gameBtn = new JButton[16];
private JPanel gamePnl = new JPanel();
...
public void start2()
{
try
{
connection = new Socket(InetAddress.getByName("localhost"), 5000);
output = new ObjectOutputStream(connection.getOutputStream());
input = new ObjectInputStream(connection.getInputStream());
inputThread = new Thread(this);
inputThread.start();
MsgIdt msg = new MsgIdt();
msg.envia(output);
System.out.println(msg);
}
catch (Exception e)
{
e.printStackTrace();
}
}
...
public void createGUI()
{
for (int i = 0; i < gameBtn.length; i++)
{
gameBtn[i] = new JButton(ButtonIcon);
gameBtn[i].addActionListener(this);
}
...
public void createJPanels()
{
gamePnl.setLayout(new GridLayout(4, 4));
TrataRato tr = new TrataRato();
for (int i = 0; i < gameBtn.length; i++)
{
gamePnl.add(gameBtn[i]);
gameBtn[i].addMouseListener(tr);
}
...
}
// You will need to fit this properly in your client class
public List<Integer> listReciever() throws IOException
{
List<Integer> lista = new ArrayList<>();
int size = input.readInt();
for(int i = 0; i < size; i++)
{
lista.add(input.readInt());
}
return lista;
}
Servidor.java(サーバー)
public class Servidor extends JFrame
{
private ArrayList<Integer> gameList = new ArrayList<Integer>();
public Servidor()
{
super("Tic-Tac-Toe Server");
Container cont = getContentPane();
board = new byte[9];
players = new Player[2];
currentPlayer = 0;
try
{
server = new ServerSocket(5000, 2);
}
catch (IOException e)
{
e.printStackTrace();
System.exit(1);
}
output = new TextArea(10, 30);
output.setEditable(false);
JScrollPane sp = new JScrollPane(output);
cont.add("Center", sp);
display("Tic-Tac-Toe Server running.");
addWindowListener(new ProcessaJanela());
setVisible(true);
pack();
}
public void execute()
{
for (int i = 0 ; i < players.length; i++)
{
try
{
players[i] = new Player(server.accept(), this, i);
players[i].start();
++numberOfPlayers;
}
catch (IOException e)
{
e.printStackTrace();
System.exit(1);
}
}
setTurn();
}
public int getNumberOfPlayers()
{
return numberOfPlayers;
}
public int getCurrentPlayer()
{
return currentPlayer;
}
public int getWinner()
{
return winner;
}
public boolean getGameOver()
{
return gameOver;
}
public void setArrayListText() // generates random numbers
{
java.util.List<Integer> lista = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8);
Collections.shuffle(lista);
gameList.addAll(lista);
}
public void gridclients() throws IOException
{
players[0].sendList(gameList);
players[1].sendList(gameList);
}
public void setTurn()
{
try
{
players[currentPlayer].setTurn("OK");
players[(currentPlayer == 0 ? 1 : 0)].setTurn("NOK");
}
catch (Exception e)
{
e.printStackTrace();
}
}
...
}
...
Player.java
public class Player extends Thread
{
private JButton[] gameBtn = new JButton[16];
Servidor control;
Socket connection;
ObjectInputStream input; //por no protocolo as msgs serem da classe Object
ObjectOutputStream output;
int number;
char mark;
public Player(Socket s, Servidor t, int num)
{
connection = s;
control = t;
number = num;
mark = (num == 0 ? 'X' : 'O');
try
{
input = new ObjectInputStream(connection.getInputStream());
output = new ObjectOutputStream(connection.getOutputStream());
}
catch (IOException e)
{
e.printStackTrace();
System.exit(1);
}
}
public void run()
{
try
{
while(!control.getGameOver())
{
processaMsg(Protocolo.recebe(input));
}
connection.close();
}
catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
public void sendList(List<Integer> gameList) throws IOException
{
output.writeInt(gameList.size());
for(int i = 0; i < gameList.size(); i++)
{
output.writeInt(gameList.get(i));
}
}
両方のクライアントで同じランダムシーケンスが必要な場合は、クライアントのコードの外側でそれを生成し、両方のクライアントに渡す必要があります。クライアントのコンストラクタまたはメソッドのようなセッターのいずれか。基本的にsetArrayListText()コードはクライアントの外部で実行する必要があります。 – Ivanko
Ok setArrayListText()コードがサーバーに追加されました。しかし、私はどのように両方の選手にそれを送るのですか?グリッドは両方とも空です。 – insyspower