应用随机停止响应。

时间:2012-03-16 23:59:36

标签: android

我是编程的新手,我正在制作一个只有基本功能的非常简单的二十一点游戏。当我在模拟器上运行程序时,它可能只运行一只手,两只,有时是5只或更多,但是当我点击三个按钮之一时,它总是在某个阶段停止响应。有一个启动画面,运行三秒钟,并有一个线程从该活动开始,启动此菜单活动。任何人都可以告诉为什么会这样吗?它通常发生在我按下其中一个按钮时,即使没有太多的计算机

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);   
    btDeal = (Button) findViewById(R.id.deal);
    playerCards1 = (TextView) findViewById(R.id.playerCards);
    playerPoints = (TextView) findViewById(R.id.playerPoints);
    dealerCards1 =  (TextView) findViewById(R.id.dealerCard);

    mpBusted= MediaPlayer.create(this, R.raw.busted);
    mpWin = MediaPlayer.create(this, R.raw.win);
    mpShuffling = MediaPlayer.create(this, R.raw.shuffling);
    mpEven = MediaPlayer.create(this, R.raw.even);
    mpHit= MediaPlayer.create(this, R.raw.hit);

    btDeal.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            deal ();

        }
    });  //getTotalDealerCards()
        //getTotalPlayerCards()


    btHit = (Button) findViewById(R.id.hit);
    btHit.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            Boolean busted = isBusted();


            if(!busted){
                hitPlayer();
                playerCards1.setText(getPlayerCardsToString());
                if (isBusted()){
                    mpBusted.start();

                }else{
                    playerCards1.setText(getPlayerCardsToString());
                    playerPoints.setText(Integer.toString(getTotalPlayerPoints()));
                }
            }

        }
    });

    btStand = (Button) findViewById(R.id.stand);

    btStand.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            checkWinner();

        }// testValue(getTotalPlayerCards())
    });
}





/***********    Function declarations starts here    **********/





//Sum and return the total points for the dealer cards
public int getTotalDealerPoints(){
    int points = 0;
    int aceFlag = 0; //flag to deal with Aces
    int counter;

    for (counter = 0; counter <= getTotalDealerCards(); counter++){
        if (dealerCards [counter].getCard() + 1 == 1){
               points += 11;
               aceFlag++;               
        }
        else if (dealerCards [counter].getCard() + 1 > 10)
            points += 10;

        else
            points += dealerCards [counter].getCard() + 1;
    }

    do {
        if (points > 21 && aceFlag > 0){
            points -= 10;
            aceFlag--;
        }
    } while (aceFlag>0);

    return points;
}


//Get the total player points deal
public int getTotalPlayerPoints(){
    int points = 0;
    int aceFlag = 0; //flag to deal with Aces
    int counter;

    for (counter = 0; counter <= getTotalPlayerCards(); counter++){
        if (playerCards [counter].getCard() + 1 == 1){
               points += 11;
               aceFlag++;               
        }
        else if (playerCards [counter].getCard() + 1 > 10)
            points += 10;

        else
            points += playerCards [counter].getCard() + 1;
    }

    do {
        if (points > 21 && aceFlag > 0){        
            points -= 10;
            aceFlag--;
        }
    } while (aceFlag>0);

    return points;
}


//Deal function to start hand
public void deal (){

    // If deal is pressed reset all and start over.
    mpShuffling.start();
    totalDealerPoints = 0;
    totalPlayerPoints = 0;
    totalCreatedCards = 0;

    for (int i = 0; i < TOTAL_CARDS; i++){
        dealerCards [i] = null;
        playerCards [i] = null;
        createdCards [i] = null;

    }
// create dealer & player cards and save them to dealer, player and total arrays.       

    for (int dealcounter = 0; dealcounter <=1 ; dealcounter++){

        dealerCards[dealcounter]= createCard();
        addCardToCreatedCards(dealerCards[dealcounter]);        
        playerCards[dealcounter] = createCard();
        addCardToCreatedCards(playerCards[dealcounter]);
    }

    String theCards = getPlayerCardsToString();
    String dealerCard = dealerCards[0].toString();
    String playerpoints= Integer.toString(getTotalPlayerPoints());
    playerCards1.setText(theCards);
    dealerCards1.setText(dealerCard);
    playerPoints.setText(playerpoints);//getTotalPlayerPoints()


    while (getTotalDealerPoints() < 16){
        hitDealer();    
    }

}

//创建卡并在返回对象之前验证现有卡。     public Card createCard(){

    int counter2 = 0;
    int flag = 0;
    int value;
    int suit;

    do {
        flag = 0;
        suit = randomer.nextInt(4);
        value = randomer.nextInt(13);
        // validate against permitted values before creating cards
        while (counter2 <= getTotalPlayerCards()) {
           if (createdCards[counter2].getSuit() == suit && createdCards[counter2].getCard() == value || suit > 3 || suit < 0 || value > 12 || value < 0){
              flag = -1;
           }
           counter2++;
        } 

    } while (flag != 0);

    Card theCard = new Card (suit, value);

    return theCard;     
}




// Add card to the records of created cards
public void addCardToCreatedCards(Card aCard){      
    createdCards [totalCreatedCards] = aCard;
    totalCreatedCards++;
}




// Add a card to dealers cards
public void hitPlayer(){

    //If the hand was started add card, else deal to start hand.

    if (getTotalPlayerCards()+1 != 0){ 
        mpHit.start();
        playerCards [getTotalPlayerCards()+1] = createCard();
        addCardToCreatedCards(playerCards [getTotalPlayerCards()]);
    }
    else
        deal();
}

// Create a new card for the dealer
public void hitDealer(){

    dealerCards [getTotalDealerCards()+1] = createCard();
    addCardToCreatedCards(dealerCards [getTotalDealerCards()]);

}

public String getPlayerCardsToString(){

    String cards = "";
    int total = getTotalPlayerCards();

    if (getTotalPlayerPoints() <=21){
        int counter = 0;

        while (counter <= total){

            cards += playerCards[counter].toString() + "  ";
            counter++;
        }

    return  cards;

    }else {
        int counter=0;
        while (counter <= total){

            cards += playerCards[counter].toString() + "  ";
            counter++;
        }
        return cards;
    }
}


public int getTotalPlayerCards(){
    int initialCount = 0;

    while (playerCards[initialCount] != null){

        initialCount++;
    }

    return initialCount-1;
}



public int getTotalDealerCards(){
    int initialCount = 0;

    while (dealerCards[initialCount] != null){

        initialCount++;
    }

    return initialCount-1;
}

public int getTotalCreatedCards(){
    int initialCount = 0;

    while (createdCards[initialCount] != null){

        initialCount++;
    }

    return initialCount-1;
}


public Boolean isBusted(){
    Boolean busted = false;

    if (getTotalPlayerPoints()>21){
        busted=true;
        totalDealerPoints = 0;
        totalPlayerPoints = 0;
        mpBusted.start();
        playerPoints.setText("You were busted!!");


        for (int i = 0; i < TOTAL_CARDS; i++){
            dealerCards [i] = null;
            playerCards [i] = null;
            createdCards [i] = null;

        }

    }
    return busted;
}


//Check for winner
public void checkWinner(){

    if (getTotalDealerPoints() <= 21 || getTotalPlayerPoints() <= 21 && !isBusted()){




             if (getTotalDealerPoints() > 21 || getTotalDealerPoints() < getTotalPlayerPoints()){
                 playerPoints.setText("You won!!");
                 mpWin.start();

             }

             else if(getTotalDealerPoints() > getTotalPlayerPoints()){
                 mpBusted.start();
                 playerPoints.setText("You were busted!!");

                 for (int i = 0; i < TOTAL_CARDS; i++){
                      dealerCards [i] = null;
                      playerCards [i] = null;
                      createdCards [i] = null;

                 }

             }

             else{

                 mpEven.start();
                 playerCards1.setText("We have same points!");

            }   



    }
    else {

        deal ();            
    }

}

}

2 个答案:

答案 0 :(得分:2)

在eclipse中使用调试器找出它被冻结的位置。

即使使用快速PC,Android模拟器也非常慢。

答案 1 :(得分:0)

尝试使用低分辨率模拟器。

从android-sdk \ tools打开DDMS,检查哪个方法或线程需要更多时间来执行。

当有功能(计算)事情在运行时使用AsyncTask或Handler。