2017-02-11 119 views
-1

我想在tictactoe遊戲中添加以下功能:如果玩家輪到他在某段時間(10秒)內沒有做任何事情,另一位玩家輪到了。在GameHub類中(擴展了一個用於創建一個遊戲的Server類),我有內部類「GameState」,它維護遊戲的當前狀態並將它作爲消息傳遞給服務器(然後它被轉發給所有客戶/玩家)。讓玩家在一段時間後改變遊戲規則

public class GameHub extends Server { 

private GameState state; 

public GameHub(int port) throws IOException { 
    super(port); 
    state = new GameState(); 
    setAutoreset(true); 
} 

protected void messageReceived(int playerID, Object message) { 
    state.applyMessage(playerID, message); 
    sendToAll(state); 
} 

protected void playerConnected(int playerID) { 
    if (getPlayerList().length == 2) { 
     shutdownServerSocket(); 
     state.startFirstGame(); 
     sendToAll(state); 
    } 
} 

protected void playerDisconnected(int playerID) { 
    state.playerDisconnected = true; 
    sendToAll(state); 
} 

public static class GameState implements Serializable { 

    public boolean playerDisconnected; 

    public char[][] board; 

    public boolean gameInProgress; 

    public int playerPlayingX; 
    public int playerPlayingO; 
    public int currentPlayer; 

    public boolean gameEndedInTie; 
    public int winner; 

    public void applyMessage(int sender, Object message) {   

     if (gameInProgress && message instanceof int[] && sender == currentPlayer) { 
      int[] move = (int[]) message; 
      if (move == null || move.length != 2) { 
       return; 
      } 
      int row = move[0]; 
      int col = move[1]; 
      if (row < 0 || row > 2 || col < 0 || col > 2 || board[row][col] != ' ') { 
       return; 
      } 

      board[row][col] = (currentPlayer == playerPlayingX) ? 'X' : 'O'; 

      if (winner()) { 
       gameInProgress = false; 
       winner = currentPlayer; 
      } else if (tie()) { 
       gameInProgress = false; 
       gameEndedInTie = true; 
      } 

      else { 
       currentPlayer = (currentPlayer == playerPlayingX) ? playerPlayingO : playerPlayingX; 
      } 

     } else if (!gameInProgress && message.equals("newgame")) { 
      startGame(); 
     } 
    } 

    void startFirstGame() { 
     startGame(); 
    } 

    private void startGame() { 
     board = new char[3][3]; 
     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       board[i][j] = ' '; 
      } 
     } 
     int xPlr = (Math.random() < 0.5) ? 1 : 2; 
     playerPlayingX = xPlr; // Will be 1 or 2. 
     playerPlayingO = 3 - xPlr; // The other player (3 - 1 = 2, and 3 - 2 = 1) 
     currentPlayer = playerPlayingX; 
     gameEndedInTie = false; 
     winner = -1; 
     gameInProgress = true; 
    } 

    private boolean winner() { 
     if (board[0][0] != ' ' 
       && (board[0][0] == board[1][1] && board[1][1] == board[2][2])) { 
      return true; 
     } 
     if (board[0][2] != ' ' 
       && (board[0][2] == board[1][1] && board[1][1] == board[2][0])) { 
      return true; 
     } 
     for (int row = 0; row < 3; row++) { 
      if (board[row][0] != ' ' 
        && (board[row][0] == board[row][1] && board[row][1] == board[row][2])) { 
       return true; 
      } 
     } 
     for (int col = 0; col < 3; col++) { 
      if (board[0][col] != ' ' 
        && (board[0][col] == board[1][col] && board[1][col] == board[2][col])) { 
       return true; 
      } 
     } 
     return false; 
    } 

    private boolean tie() { 
     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       if (board[i][j] == ' ') { 
        return false; 
       } 
      } 
     } 
     return true; 
    } 

} 

}

對於時間測量我有「倒計時」類,其目的是所經過的所需時間後改變播放器。

 public class Countdown { 

     int timer; 

     public void counter(int timeFrame) { 

      timer = timeFrame; 

      Timer TimerA = new Timer(); 
      TimerTask TaskA = new TimerTask() { 

       @Override 
       public void run() { 
        if (timer >= 0) { 
         timer--; 
        } 
        if (timer == -1) { 
         currentPlayer = (currentPlayer == playerPlayingX) ? playerPlayingO : playerPlayingX; 
         TimerA.cancel(); 
        } 

       } 
      }; 
      TimerA.schedule(TaskA, 0, 1000); 
     } 

     public int getTimer(){ 
      return timer; 
     } 

    } 

恰恰在那一部分,我卡住了。在我看來,我需要在「GameState」類的某個地方添加和啓動計時器,但由於某種原因,我無法弄清楚它到底在哪裏。

int timeFrame = 10; 
Countdown C = new Countdown(); 
C.counter(timeFrame); 

我認爲應該在「else塊」

else {currentPlayer = (currentPlayer == playerPlayingX) ? playerPlayingO : playerPlayingX; 
int timeFrame = 10; 
Countdown C = new Countdown(); 
C.counter(timeFrame);} 

啓動但它不能正常工作=>它只是爲「playerPlayingO」(如果他延遲10秒,他錯過了他)。 playerPlayingX不受影響......

可能我也失去了一些東西別的......

回答

0

如果你使用一個JavaFX您可以使用此一task - 只需交任務運行是這樣的:

Thread.sleep(10000); //Wait 10 Secs 
if (activePlayer == initialActivePlayer) switchPlayer(); //Better write your own "ShouldWeSwitch"-Condition 

後,可能需要玩家觸發開關擺弄同步一點,也許終止任務,但這可能工作爲您的遊戲。

PS:如果你不使用JavaFX,你可以簡單地創建一個類來擴展你自己的任務:Thread