0

私はAndroid SDKを初めて使用するので、私に厳しくしないでください。atm 私は最初の Android アプリを使用しています。ほぼ完了していますが、現在少し問題に直面しています。

このアプリは、4 人のプレーヤー (3 人のコンピューターの敵) が参加する小さなシングル プレーヤー カードプレイ ゲームです。

問題は、私が動きをした後..コンピューターの敵がkiロジックに基づいて動きを行っていることです..それはうまく機能しています..しかし、メソッドの終了後にプレイヤー4の最後の動きだけが表示されます. 各ki moveの後にメソッド手順を遅らせても..現在のki moveを表示するためにImageViewsを更新しません...

私は本当にかなり迷っています..論理的な間違いを見つけることができないので..どんな種類の助けにも感謝します..読むためのthx-英語のネイティブスピーカーではありません:-)

さて、ここにいくつかのコードがあります.. cardDeck は現在の移動を保持します

List<Card> cardDeck = new ArrayList<Card>();
List<Card> move = new ArrayList<Card>();
KI player2 = new KI();

but.setText("GO");
but.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View vw) {

 if (!move.isEmpty()) {

    if (Rules.checkIsPlayableHand(move)) {
    sort();
    setClickAble();
        ki4Moves(vw);   
    }

sort() は次のようになります。

public void sort(){

   cardDeck.clear();
   cardDeck.addAll(move);

    if (cardDeck.size() == 1) {
        dkView1 = (ImageView) findViewById(R.id.dkView1);
        Card card = cardDeck.get(0);
        dkView1.setImageBitmap(card.getBitmap());
    } else {
        dkView1 = (ImageView) findViewById(R.id.dkView1);
        dkView1.setImageBitmap(blank);
    }
}

ki4Moves() は次のようになります。

public void ki4Moves(View vw){

   player2.think();
   List<Card> kiMove = new ArrayList<Card>();
   kiMove = player2.getPossibleMove(cardDeck);

    if (!kiMove.isEmpty()) {

        trash.addAll(kiMove);
        move.clear();
        move.addAll(kiMove);
        sort();
   }
   // same for the other both ki s
}

編集:

いくつかの調査の後.. Androidドキュメントを読んでも、私の問題の本当の解決策は見つかりませんでした。

私がやりたかったことは: SORT() の後にメイン UI スレッドを強制的に更新する .. 次のように:

 @Override
 public void onClick(View vw) {

 if (!move.isEmpty()) {

    if (Rules.checkIsPlayableHand(move)) {
    sort();
            // FORCE MAIN UI THREAD TO UPDATE .. just one line 
            // let SystemClock.sleep(2000);
    setClickAble();
        ki4Moves(vw);   
    }

今..メインスレッドを強制的に更新したり、メインスレッドの外でアクセスしたりすることはできません..ANDROIDは私にスレッディング、痛みのないスレッディング、非同期タスクを提供します..すごいありがとう!

  1. プロシージャの負荷は高くありません...データベース操作などはありません。
  2. thread.join を使用すると ... メインの UI スレッドがまだロックされている

まず第一に..スレッドを使用する論理的な理由がわかりません..しかし、私はちょっとしなければなりませんか?さて、ここに行きます..コードを次のように変更するとしましょう:

Handler h = new Handler();
@Override
public void onClick(View vw) {

 if (!move.isEmpty()) {

    if (Rules.checkIsPlayableHand(move)) {

            Thread t = new Thread(new Runnable){

                void run(){
                h.post(new Runnable(){
                    // do some logic here
                });
                h.post(new Runnable(){
                   if (cardDeck.size() == 1) {
               dkView1 = (ImageView) findViewById(R.id.dkView1);
           Card card = cardDeck.get(0);
           dkView1.setImageBitmap(card.getBitmap());
               } else {
           dkView1 = (ImageView) findViewById(R.id.dkView1);
           dkView1.setImageBitmap(blank);
               }
                });
                Thread.sleep(2000);
                }
            });
            t.start();

    setClickAble();
        ki4Moves(vw);   
    }

これは正常に動作しています..しかし、ああ..このメソッド「ki4Moves(vw)」があります...私はそれをt.join()にすることはできません..私が言ったように、メインのUIスレッドがロックされます。だから私はki4Movesから200行をスレッドにラップする必要があります..

そして、あなたがたはこれが機能しています..すべての移動の後..メインUIが更新されます。

BUUUT ki4Moves は最も簡単な方法の 1 つです.. 移動をパスするとどうなりますか.. CPU プレーヤーがループに入ってそれを終了するとどうなりますか.. このループでメイン UI に階層的にアクセスすることはできません.. だから私は再びそこにいます.

わかりません..ロジックを実装するのに2週間ほどかかりました..このゲームのルールはかなり特殊なので..そして今では意図したとおりに実行されているため、kiはスマートです..UIロックの原因で失敗しますUP ..これは恥ずかしい..

4

1 に答える 1

0

コードはちょっと複雑に見えますが、よく理解していれば、setImageBitmap() の後に dkView1 で invalidate() を呼び出すと問題が解決します。

しかし、ここにヒントがあります。可能であれば、Bitmap の代わりに drawable を使用してみてください。

于 2013-03-18T11:48:03.250 に答える