4

ボタンの画像アイコンを更新する方法を知っている人はいますか?

問題は:

チェッカー ゲームを作成し、GUI を作成しています。AI を含むすべてが機能しますが、移動後に AI を呼び出したため、ボタンにチェッカーが表示されません。

  1. クリックされたボタン
  2. チェッカーがある特定のボタンをクリックします
  3. チェッカーが行かなければならない次の場所をクリックします
  4. すぐにAIを呼び出して行動させます。

私のボタンにはチェッカーの画像の ImageIcons があります。チェッカーが移動する必要がある次の場所をクリックすると、JPanel の JButton はその瞬間に更新されませんが、AI が移動して移動を終了するまで待機します。チェッカーがどこに行ったかわかりません。

3-4 Calls が次々と実行されると、AI が行った結果の動きのみが表示されますが、実装された actionListener を終了した後にすべてが更新されるため、私の動きは表示されません。

呼び出してみました:repaint(); 再検証(); 無効にする(); ボタンを含む JPanel 上。

ステップ 4 の前に、AI が移動する前に何を置いたかをユーザーが確認できるようにします。

else
{
     //This is where the code starts
     if ("White".equals(Red_Or_White.getText()))
     {
          //Meaning that it is white's turn, then
          playerPlaysAMove(x, y, goingToGo_x, goingToGo_y);
     }
     if ("AI".equals(AI_Enabled.getText()))
     {
          //AI is enabled
          AIMoves(board, "Red");
          //the AI needs to play the position as if the AI was a red player, 
          //because the player must be white
     }
}

両方の AI が同じラウンドでプレイしますが、AI の計算には約 1 分かかり、その際、actionListener (else ステートメントの後) を抜けた後にすべてのボタンを更新するため、AI がプレイするまでプレイヤーの動きはわかりません。 .

ボードは、JPanel に配置される 8x8 ボタンの配列です。

static void playerPlaysAMove(int save_x, int save_y, int moveTo_x, int moveTo_y)
{
    if(save_x - moveTo_x == 1 || save_x - moveTo_x == -1)
    {
        board[moveTo_x][moveTo_y].setIcon(board[save_x][save_y].getIcon());
        board[save_x][save_y].setIcon(null);
    }
    else if (save_x - moveTo_x == 2 && save_y - moveTo_y == 2)
    {
        board[save_x-1][save_y-1].setIcon(null);
        board[moveTo_x][moveTo_y].setIcon(board[save_x][save_y].getIcon());
        board[save_x][save_y].setIcon(null);
    }
    else if (save_x - moveTo_x == 2 && save_y - moveTo_y == -2)
    {
        board[save_x-1][save_y+1].setIcon(null);
        board[moveTo_x][moveTo_y].setIcon(board[save_x][save_y].getIcon());
        board[save_x][save_y].setIcon(null);            
    }
    else if (save_x - moveTo_x == -2 && save_y - moveTo_y == 2)
    {
        board[save_x+1][save_y-1].setIcon(null);
        board[moveTo_x][moveTo_y].setIcon(board[save_x][save_y].getIcon());
        board[save_x][save_y].setIcon(null);            
    }
    else if (save_x - moveTo_x == -2 && save_y - moveTo_y == -2)
    {
        board[save_x+1][save_y+1].setIcon(null);
        board[moveTo_x][moveTo_y].setIcon(board[save_x][save_y].getIcon());
        board[save_x][save_y].setIcon(null);            
    }        
}

基本的には、ユーザーの選択ボタンとユーザーの移動先ボタンの XY 座標を計算しました。正しい技かどうかのチェックもありますが、ここがメインの動きです。

XY 座標の差が 1 の場合、プレイヤーはジャンプではなく移動していることを意味し、XY 座標の差が 2 の場合、プレイヤーはジャンプしていることを意味します。また、元の XY 座標のボタンを null に設定する必要があります。つまり、アイコンが消えてから、新しい imageIcon を目的の XY 座標に配置します。

プレーヤーがジャンプしている場合は、ユーザーがピースを食べた場所も計算し、その imageIcon も null に設定する必要があります。

AI はまったく同じことを行いますが、AI は再帰関数を使用して XY 座標を計算し、最適な動きを計算します。

主な問題は、プレーヤーがプレーヤーであり、次に AI が計算し、再生し、プロセスの後に両方の結果を一緒に表示することです。AI が計算して再生する前に、画像アイコンを再描画させることは可能ですか? プレイヤーが何をプレイしたか、次に AI が何をプレイしたかをプレイヤーが確認できるようにするため

4

1 に答える 1