我的程序有一个菜单有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;
}
}
答案 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次。