2012-03-16 106 views
0

我是编程新手,我正在制作一个只有基本功能的简单的二十一点游戏。当我在模拟器上运行程序时,它可能是一只手,两只,有时甚至是五只或更多,但当我点击三个按钮之一时,它总是停止响应。有一个启动屏幕运行三秒钟,并有一个线程从该活动开始,启动此菜单活动。任何人都可以告诉为什么发生这种情况?它通常当我clcik按钮中的一个是即使没有太多COMPUT应用程序随机停止响应。

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();  
    } 

} 

//创建卡,并验证对返回对象之前存在。 市民卡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

使用调试器在Eclipse中找出它被冻结。

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

0

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

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

当有一个功能(计算)的东西在运行时使用AsyncTask或Handler。