我准备好驱动程序类后,为“ WAR”纸牌游戏创建一个类

时间:2018-11-27 17:05:39

标签: java bluej playing-cards

任务分配的方向是:编写战争游戏。在战争中,如果卡牌的价值大于对手的卡牌,您将获得1分。如果对手的牌大于您的牌,则对手得到一个点。如果你打领带,那是一场战争!这意味着下一手值得2分。如果是另一局,则下一局得4分,而您继续加2直到局被打破。然后得分恢复正常。

1)您应该使用Cards类来获得2张扑克牌。

2)询问用户他们想玩几轮。

3)如果输入的回合数为负数,则有一个循环来捕捉。

4)如果他们想玩0回合,则结束程序。

5)每轮打印用户的汽车和计算机卡。

6)每轮比赛后打印出正确的分数。

7)ace为低(价值1分)。

8)在所有回合结束后,打印一条消息,告诉用户他们是赢了,输了还是平局。

我已经准备好驱动程序类(请参见下文)。我需要帮助创建一个可以完成上述工作的类。在每一轮之后,都应要求用户按Enter键以进入下一轮。 这是我的驾驶员代码,它提供了卡号和西装。

public class Cards
{

    private int A;
    private int B;
    private String c;
    private String b;

    public Cards()
    {    
         getSuit();
         getCardName();
         suit();
         name();
    }

    public int getSuit()
    {
        A = (int) (Math.random()*4+1); //rolls a number between 1 and 4
        return A;
    }

    public int getCardName()
    {
        B = (int) (Math.random()*13+1); //rolls a number between 1 and 13
        return B;
    }

    public String suit()
    {
        if (A == 1)  b = "Hearts";
        else if (A == 2) b = "Diamonds";
        else if (A == 3) b = "Clubs";
        else  b = "Spades";

        return b;
    }

    public String name()
    {
        if (B == 1)  c = "Ace";
        else if (B == 2) c = "2";
        else if (B == 3) c = "3";
        else if (B == 4) c = "4";
        else if (B == 5) c = "5";
        else if (B == 6) c = "6";
        else if (B == 7) c = "7";
        else if (B == 8) c = "8";
        else if (B == 9) c = "9";
        else if (B == 10) c = "10";
        else if (B == 11) c = "Jack";
        else if (B == 12) c = "Queen";
        else  c = "King";

        return c;
    }

    public String toString()
    {
        return c + " of " + b;
    }
}

2 个答案:

答案 0 :(得分:0)

我想对您的代码进行审查,希望对您有所帮助。

  • 变量名A / B / c / b不能完全理解它们的含义。我也猜不到它们是什么,因为也没有评论。
  • getSuit()和getCardName()引起副作用。调用getCardName()导致卡号发生更改。这不是很好,因为大多数开发人员都期望 getter 方法不会更改对象。例如,以下代码会令人困惑:

    card.name();   // "Ace"
    card.name();   // "Ace" 
    card.getCardName();  // 10. Should be 1???
    card.name();   // "10". Huh?
    
    • 最好在构造函数中设置卡的花色和编号。至少将方法设置为私有。

    • suit()和name()方法返回一个字符串。无需将值保存到类字段b和c中,除非您在toString()方法中使用它们,除非可以将其重写为:

      return name() + " of " + suit();
      

      这将减少您的数据重复。

    • 您可能会考虑循环生成(和存储!)卡,而不是随机生成,因为当前两个玩家都可以绘制完全相同的卡。虽然这可能不符合要求,但我不希望两位玩家在战争游戏中都能抓到同一张牌。

    • getCardName()的名称不正确。 getCardValue()可能更好,但是如上所述,它不应​​更改当前值。

答案 1 :(得分:-1)

我已经编写了课程,它看起来应该像这样:

import java.util.Scanner;

public class WarGame extends Cards {
    public static void main(String args[]) {
        boolean playing = true;
        int myScore = 0;
        int oppsScore = 0;
        int round = 0;
        int increment = 1;
        while (playing) {
            Scanner scan = new Scanner(System.in);
            int input = scan.nextInt();
            if (input == 0 || input < 0)
            {
                System.out.println("INVALID ROUND NUMBER ENTERED!");
                playing = false;
            }
            while (round <= input)
            {
                Cards myCard = new Cards();
                Cards oppsCard = new Cards();
                System.out.println("You have the " + myCard.toString());
                System.out.println("The computer has the " + oppsCard.toString());
                if (myCard.getSuit() > oppsCard.getSuit())
                {
                    myScore += 1;
                }
                else if (oppsCard.getSuit() > myCard.getSuit())
                {
                    oppsScore += 1;
                }
                else
                {
                    increment *= 2;
                    System.out.println("WAR!!!!");
                }
                System.out.println("Your score: " + myScore);
                System.out.println("Computer's score: " + oppsScore);
            }
        }
        if (myScore > oppsScore) {
            System.out.println("You win!");
        } else if (myScore < oppsScore) {
            System.out.println("You lose!");
        } else {
            System.out.println("It's a tie!");
        }
    }
}