在使用菜单进行洗牌后打印一副牌

时间:2014-02-02 23:07:50

标签: java

我的程序有一个菜单有3个选项。 1是显示牌组(如果用户输入1则首先显示新牌组)。 2是在没有打印甲板的情况下洗牌。 3只退出程序。因此,例如,为了打印洗牌的牌组,用户必须输入2进行随机播放然后按1以显示洗牌的牌组。我无法弄清楚如何在不打印新牌组的情况下打印洗牌的牌组。

import java.util.Scanner;
public class Prog4 {

public static void main(String[] args){
    double menuOption = 0;
    int z = 0;
    MyDeck d1 = new MyDeck();
    MyCard c;
    System.out.println();

   while (true){
     Scanner option = new Scanner(System.in);
       try{
          System.out.println("1.  Display the deck");
          System.out.println("2.  Shuffle the cards");
          System.out.println("3.  Quit");
          System.out.print("(Choose a menu 1, 2, or 3 : ");

          menuOption = option.nextDouble();

          if (menuOption == 1) {
             System.out.println("You selected display deck!! ");

   while(true){
     while(z<=12){
       c = d1.printDeck2(z);
       System.out.print(c.toString() + " ");
       z++;
    }
    System.out.println();  

    while(z<=25){
      c = d1.printDeck2(z);
      System.out.print(c.toString() + " ");
      z++;
   }
    System.out.println();

    while(z<=38){
     c = d1.printDeck2(z);
     System.out.print(c.toString() + " ");
     z++;
   }
   System.out.println();

   while(z<=51){
    c = d1.printDeck2(z);
    System.out.print(c.toString() + " ");
    z++;
   }
    if(z>51)
          break;   
   }
     System.out.println();
 }   
 else if(menuOption == 2){
    System.out.println("You selected Shuffle the cards!! ");
    c = d1.shuffle3();
}

else if(menuOption == 3){
    System.out.println("You selected exit!!");
    break;
}
else
 break;

}   

catch (Exception e) {
  System.out.println("Invalid menu selected. Please choose menu 1, 2, or 3");
}

}
}
}


public class MyCard {
private int suit;
 private int rank;

private  String[] suits = {"S","D","H","C"};
private  String[] ranks = {"01","02","03","04","05","06","07","08","09","10","11","12","13" };

public MyCard(int suit, int rank) {
    this.suit = suit;
    this.rank = rank;
}
public int getSuit() {
    return suit;
}

public void setSuit(int suit) {
    this.suit = suit;
}

public int getRank() {
    return rank;
}

public void setRank(int rank) {
    this.rank = rank;
}
public String toString() {
    return suits[suit] + "" +  ranks[rank];
}
}

 import java.util.Random;
public class MyDeck {
private MyCard[] cards;
int i;
int q = 51;
int z = 51;
public MyDeck() {
    i = 1;
    cards = new MyCard[52];
    int x = 0;
    for(int t=0;t<=3;t++){
        for(int s=0;s<=12;s++){
            cards[x] = new MyCard(t,s);
            x++;
        }
    }
 }

 public MyCard shuffle3(){
     Random randomNumber = new Random();
     int index = 0; 
       while(z>0){
         index = randomNumber.nextInt(q);
         break;
       }
         MyCard temp =  cards[index];
         cards[index] = cards[z];
         cards[z] = temp;
         MyCard temp2 = temp;
         z--;
         q--;
    return temp2;
}
     public MyCard printDeck2(int y){
     MyCard temp = cards[y];
     return temp;
}



}

1 个答案:

答案 0 :(得分:0)

而不是在第一个选项中创建你的牌组,有一个名为initDeck()的单独方法来进行牌组初始化。

然后当输入选项1时,检查卡座是否已初始化,如果没有创建,则打印它。如果它已初始化,只需打印即可。

当再次选择选项2时,检查卡座是否已初始化,如果未创建,则将其随机播放。如果已经初始化,只需将其洗牌。

关键是,方法initDeck()只应在程序运行期间调用一次。

另一种选择是使用Singleton pattern


我写的这个没有真正查看你的代码...我假设你的选项1正在创建包含所有那些while循环的套牌但实际上它只是一团糟..它运行相同的代码只是一个打印在里面。并且可以用类似的东西替换(println条件可能需要一些调整) - 它也应该在Deck类中,不应该需要和输入arugments:

while (z <= 52) {
      c = d1.printDeck2(z);
      System.out.print(c.toString() + " ");
      if(z%12 == 0)
          System.out.println();
      z++;
}

从您更新的帖子中,您的随机播放方法似乎只会交换两张卡片而您只调用一次,因此请仔细检查您的打印方法是否实际换过两张卡片。

要解决此问题,您需要重新考虑您的随机播放方法或将其调用x次。