2017-06-17 6 views
0

このゲームは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)); 
     } 
    } 
+0

両方のクライアントで同じランダムシーケンスが必要な場合は、クライアントのコードの外側でそれを生成し、両方のクライアントに渡す必要があります。クライアントのコンストラクタまたはメソッドのようなセッターのいずれか。基本的にsetArrayListText()コードはクライアントの外部で実行する必要があります。 – Ivanko

+0

Ok setArrayListText()コードがサーバーに追加されました。しかし、私はどのように両方の選手にそれを送るのですか?グリッドは両方とも空です。 – insyspower

答えて

0

あなたの問題は、クライアント側でシャッフルされていることです、あなたは2つのクライアントを実行しているとき、彼らはお互いに別々に実行し、シャッフルはあなたに異なる結果を与えるので、サーバー上の論理をシャッフルすると、サーバーはグリッドを生成し、それを両方のプレーヤーに送信します。

ObjectOutputStreamを使用するのは好きではありません。特に、より複雑なオブジェクトを送信する場合、大きなミスやエラーが発生しやすく、Rawデータを使用する方が常に優れていて、DataOutputStream/DataInputStreamを使用して送信します。

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)); 
    } 
} 

は、その後、あなたが両方のためsendListを呼び出します:あなたはそこにソケットを送信している

Serverのリストを送信するための方法がPlayerクラス内にある必要がありますので、サーバ側でクライアント・ハンドラは、プレーヤーのクラスであると仮定すると

このようなServidor classのプレイヤー:

player[0].sendList(gameList); 
player[1].sendList(gameList); 

クライアント受信:

// You will need to fit this properly in your client class 
public List<Integer> listReciever(){ 
List<Integer> list = new ArrayList<>(); 
int size = input.readInt(); 
for(int i = 0; i < size; i++){ 
     list.add(input.readInt()); 
} 
+0

ok setArrayListText()コードがサーバーにあります。しかし、私はどのように両方の選手にそれを送るのですか?グリッドは両方とも空です。 – insyspower

+0

クライアントとサーバー間の通信に使用しているコードをコードなしで提供できますか?複数の方法があるため、適切な答えを得ることは困難です。 – FilipRistic

+0

また、1つの提案は、あなたがクライアント - サーバーに新しい場合は、クライアントからサーバーに2つの番号を送信し、サーバーからクライアントに合計を送信するような単純なものから開始する方が良いです。あなたがつかむと、ゆっくりと新しいものを加えることができます。 – FilipRistic

関連する問題