2016-05-30 7 views
1

「クーデター」と呼ばれるゲームのプログラミングに問題があり、問題の内容を説明するために、ゲームの内容を簡単に説明する必要があります。クーデターは、プレイヤーがお互いを排除し、最後に残ったプレーヤーになるカードゲームです。これを行うために、プレイヤーはいくつかのアクションを選択できますが、他のプレイヤーにも嘘をつけることができます。このゲームでは、他のプレイヤーは「間抜け」と呼ぶことも、他のプレイヤーのアクションをブロックすることもできます。このため、レスポンスウィンドウを作成して、他のプレイヤーがチャレンジ、ブロック、または何もしないようにする必要があります。アクションの結果は、応答に依存します。例えば、プレーヤーは対外援助を得ようとします。私は彼の行動を阻止するか、彼を続けることを決めることができます。もし私がブロックするが、それはここで問題ではありません。JFrameが白く、whileループで反応しない

実際の問題は次のとおりです。すべてのプレイヤーにJFrame経由で応答(ブロックまたは何もしない)を与えるチャンスを与え、すべてのプレイヤーの応答を待つためにwhileループを使用します。しかし、このループは、結果がプレイヤーの反応に依存するため、メソッドが進行しないようにする以外は何もしません。 whileループでは、私が作成したJFrameは白く表示され、私が作成した2つのボタンが含まれていません。この時点で私は閉じるボタンを押すこともできますが、私のレスポンスのないウィンドウに依存するwhileループのために反応しません。とにかくこれを修正するには?

if (turnCount == players[currentPlayerNum].getPlayerNum()){ 
     for(int i=0; i<players.length;i++){ 
      //If it is not the players turn and they have one or two lives, make response window 
      if (players[i].getPlayerNum() != turnCount){ 
       if (players[i].getLives() != 0){ 
        //foreignAidBlock constructs the response window 
        players[i].foreignAidBlock(turnCount); 
       } 

       else{ 
       //Not applicable since out of game/not in game 
       players[i].setResponse("NA"); 
       } 
      } 
      else{ 
      //Not applicable since out of game/not in game 
      players[i].setResponse("NA"); 
      } 
     } 

     //Idea: PAUSE TILL RESPONSES COME IN 
     while(players[0].getResponse() != null || players[1].getResponse() != null || players[2].getResponse() != null || players[3].getResponse() != null) 
     { 
      System.out.println(players[0].getResponse()); 
      System.out.println(players[1].getResponse()); 
      System.out.println(players[2].getResponse()); 
      System.out.println(players[3].getResponse()); 
     } 

私はこのコードの一部を実行しているから得る結果は次のとおりです。 "NA ヌル NA NA " 連続 。まだ答えられていないプレーヤーを表すためにnullを使用します。方法の終わりに、私はすべての選手の能力をヌルに戻しました。

私の回答ウィンドウは、プレイヤーの応答をnullから "B"または "N"に変更することだけです。しかし、ボタンへのアクセスがなければ、私はこれを行うことはできません。誰も私のスレッドを一時停止するために何かを使う方法についてのヒントはありますか?

+0

JFrameを強制的に開いたままにしておくと、他のアクションが続行されなくなる可能性があります。おそらくJOptionPaneのように –

+0

コードの構造を変更してください。条件に対して*ループ*をしないでください:これはUIをブロックし、レンダリングなどの独自の処理を行うことはできません。その代わりに、イベントを使用して状態を変化させてから状態をチェックし、「次の適切なことを行う」 - 「ブロック」は論理的ですが、特定の機能内のフローとは独立しています。 – user2864740

答えて

0

whileループがUIスレッドをブロックしています。 whileループチェックを別のスレッドで実行します。

Thread t = new Thread(new Runnable(){...}); 
t.start(); 

あなたのUIがブロックされず、コントロールが応答のままになりますこの方法です。

1

Abdul Fatirが述べたように、UIスレッドがブロックされているためです。

しかし、私は直接スレッドを使いこなすことを推奨しません。このシナリオでは正確にSwingWorkerクラスがあり、これを使用することをお勧めします。

: - あなたはまた、次のSO問題のいくつかの有用な情報を見つけることができます

Swing Worker Example - ここHow do I use SwingWorker in Java


は公式のjavadocからの迅速な使用例で、このブログの記事をチェック詳細情報については

"Meaning of Life"を見つけてその結果をJLabelに表示したいとします。

final JLabel label; 
    class MeaningOfLifeFinder extends SwingWorker<String, Object> { 
     @Override 
     public String doInBackground() { 
      return findTheMeaningOfLife(); 
     } 

     @Override 
     protected void done() { 
      try { 
       label.setText(get()); 
      } catch (Exception ignore) { 
      } 
     } 
    } 

    (new MeaningOfLifeFinder()).execute(); 
関連する問題