2017-05-31 67 views
0

讓我們開始,3類(卡開始,Deckofcards)Java數組(卡)

1º卡:

public class Card { 
    private String type; 
    private int value; 
    private String number; 



    public Card(String number,String type,int value) { 
     this.type=type; 
     this.value=value; 
     this.number=number; 
    } 
    public String gettype() { 
     return type; 
    } 
    public String getNumber() { 
     return number; 
    } 
    public int getValue() { 
     return value; 
    } 
    @Override 
    public String toString() { 
     return getNumber() + " de " + gettype() + " --> VALUE " + getValue() ; 
     } 
    } 

2º開始

public class Start { 

    public static void main(String[] args) { 
     Deckofcards deckofcards = new Deckofcards(); 
     Card c = deckofcards.newCard(); 
     String s =c.toString(); 
     System.out.println(s); 

     Card c2 = deckofcards.newCard(); 
     String s2 =c2.toString(); 
     System.out.println(s2); 
    } 
    } 

然後,問題is here

Deckofcards:

public class Deckofcards { 
     private Card CardsR[]; 
     private final Card[] Cards = { 
      new Card("A","heart",1), 
      new Card("2","heart",2), 
      new Card("3","heart",3), 
      new Card("4","heart",4), 
      new Card("5","heart",5), 
      new Card("6","heart",6), 
      new Card("7","heart",7), 
      new Card("8","heart",8), 
      new Card("9","heart",9), 
      new Card("10","heart",10), 
      new Card("J","heart",10), 
      new Card("Q","heart",10), 
      new Card("K","heart",10), 
      new Card("As","Diamond",1), 
      new Card("2","Diamond",2), 
      new Card("3","Diamond",3), 
      new Card("4","Diamond",4), 
      new Card("5","Diamond",5), 
      new Card("6","Diamond",6), 
      new Card("7","Diamond",7), 
      new Card("8","Diamond",8), 
      new Card("9","Diamond",9), 
      new Card("10","Diamond",10), 
      new Card("J","Diamond",10), 
      new Card("Q","Diamond",10), 
      new Card("K","Diamond",10), 
      new Card("A","clover",1), 
      new Card("2","clover",2), 
      new Card("3","clover",3), 
      new Card("4","clover",4), 
      new Card("5","clover",5), 
      new Card("6","clover",6), 
      new Card("7","clover",7), 
      new Card("8","clover",8), 
      new Card("9","clover",9), 
      new Card("10","clover",10), 
      new Card("J","clover",10), 
      new Card("Q","clover",10), 
      new Card("K","clover",10), 
      new Card("A","Spades",1), 
      new Card("2","Spades",2), 
      new Card("3","Spades",3), 
      new Card("4","Spades",4), 
      new Card("5","Spades",5), 
      new Card("6","Spades",6), 
      new Card("7","Spades",7), 
      new Card("8","Spades",8), 
      new Card("9","Spades",9), 
      new Card("10","Spades",10), 
      new Card("J","Spades",10), 
      new Card("Q","Spades",10), 
      new Card("K","Spades",10), 
     }; 

    //Sorry if the translation its not correct, this is only a little part of a 
    //big code. 
     public Deckofcards() { 
      Collections.shuffle(Arrays.asList(Cards)); //SHUFFLE 
      CardsR=Cards.clone(); //COPY 
     } 
     public Card newCard(){ 
      boolean while1 = true; 
      Card take=null; 
       for(int i = 0; i < CardsR.length; i++){ 
        while(while1){ 
        if(CardsR[i]!=null){ 
         take=Cards[i]; 
         //CardsR[i]=null; 
         while1=false; 

        } 
       } 
      } 
      return take; 
     } 
    } 

讓我們來解釋一下。

我有一系列的卡,我混合。好的。 ALL CORRECT

然後我打電話給recive卡(Class:start)。好的。全部正確

--- THEN --- 當我打電話的另一次,卡返回相同的值... 我試圖設置一個空......但然後它開始無緣無故循環? 。

任何可能的解決方案? 謝謝

回答

0

take的值將總是在數組中的第一張卡片。

當您將值設置爲空時,while循環不會終止,因爲while2僅在設置爲非空條目時設置爲false。一旦找到null,則不會發生任何反應,並且while循環會永久運行,因爲while2無法設置爲false

一個break聲明應該做的伎倆在這裏

public Card newCard(){ 
     Card take=null; 
      for(int i = 0; i < CardsR.length; i++){ 
       if(CardsR[i]!=null){ 
        take=Cards[i]; 
        CardsR[i]=null; 
        break; 
       } 
      } 
     } 
     return take; 
    } 

一個break聲明將退出它在任何循環。

或者,你可以使用一個List<Card>,而不是一個數組,利用它們可以從您的洗牌清單中刪除條目並返回它們,無需設置和檢查null

private List<Card> cardList; 

public Deckofcards() { 
     cardList = Collections.shuffle(Arrays.asList(Cards)); //SHUFFLE 
     } 

public Card newCard(){ 
    if(!cardList.isEmpty()){ 
     return cardList.remove(0);   
    }    
    return null; 
} 
+1

'採取將始終處於array.'沒了,'while'條件將只第一次和'while1'將被設置爲'FALSE'所以總是先卡將從陣列返回的最後一張牌 –

+0

謝謝。修復。 – binskits

+0

非常感謝<3。 PS:我終於使用了第一個選項。 <3 –

1

你真的沒有做任何與洗牌清單的任何事情;該實例基本上是暫時的,因此被垃圾收集。請注意,將您在陣列中創建的列表進行混洗,不會混洗陣列。相反,你可以這樣做:

List<Card> cardList = Arrays.asList(Cards); 
Collections.shuffle(cardList); 

CardsR = cardList.toArray(new Card[cardList.size()]); 

你的newCard方法不需要這麼複雜。我假設你只是想從洗牌陣列中返回一張牌。做到這一點的一種方法是保留最後一張牌的索引。你可以在你的構造函數中將它初始化爲-1。在newCard中,只要不超出範圍,您就會增加此索引並返回該索引處的卡片。如果你是,你可能會打印一條消息,說明沒有卡片(例如)。

其他一些指針:

  • 請務必遵循Java命名約定;字段和變量名稱不應該大寫。
  • 考慮使用卡片的List<Card>而不是數組;這樣你就可以簡單地洗牌而不必在陣列和列表之間來回轉換。
1

我的呼喚另一次,卡片返回

因爲

  for(int i = 0; i < CardsR.length; i++){ // i = 0 
       while(while1){      // true 
       if(CardsR[i]!=null){     // true 
        take=Cards[i];     // 
        while1=false;     // so no more while loop execution 
                // first card will always returned 

我試圖設置一個空...相同的值,但隨後開始無限循環由沒有 的原因?

第一次調用 Card c = deckofcards.newCard();CardsR[0]期間

設置第二個電話Card c2 = deckofcards.newCard();if條件if(CardsR[i]!=null)期間爲null所以永遠不會被執行,現在你是停留在一個無限while循環

boolean while1 = true; 
      Card take=null; 
       for(int i = 0; i < CardsR.length; i++){ 
        while(while1){ 
        if(CardsR[i]!=null){ 
         take=Cards[i]; 
         //CardsR[i]=null; 
         while1=false; 

        } 
       } 
      } 

解決方案:只需你可以使用Random實例從數組中隨機選取並返回cards

How to randomly pick an element from an array