无法实现我的套牌和手工课程

时间:2015-03-23 19:46:59

标签: java oop

我还是新手编程,所以在这里,我创建了一个很好的卡片和甲板课程,但Hand课程是我遇到麻烦的地方。在驱动程序中,我必须询问用户,将会有多少玩家以及手中有多少张牌。这是我到目前为止所做的,我将尝试仅发布必要的代码以保持简短。

这是我的甲板课程:

public class Deck 
{

    private Cards [] deck;
    private int nextCard;


    public Deck()
    {
        deck = new Cards[52];
        int iCardCount=0;   // Holds how many cards have been created.
        for ( int suit = 0; suit <= 3; suit++ ) 
        {
            for ( int face = 1; face <= 13; face++ ) 
            {
                deck[iCardCount] = new Cards(iCardCount);
                iCardCount++;
            }
        }
        nextCard = 0;
    }


    public void shuffle ()
    {


        for ( int i = 0; i < deck.length; i++) 
        {
            Random ran = new Random();
            int iRand = ran.nextInt(52);
            Cards temp = deck[i];
            deck[i] = deck[iRand];
            deck[iRand] = temp;
        }
        nextCard = 0;
    }


    public Cards dealACard ()
    {
        if (nextCard < 52)
        {
            System.out.println( deck[nextCard++]);
        }
        else
        {
            System.out.print("\nError, out of cards." );

        }
        return (null);
    }

    public Hand dealAHand (int n)
    {   
        Hand deal = new Hand();
        String sHand = "";

        for (int i = 0; i < n; i++) 
        { 
            sHand += "" + dealACard();
        }
        return deal;
    }   

}

对于dealAHand方法,我的导师让我们之前使用返回一个String,但是现在我们已经创建了一个Hand类,她让我们将String改为Hand,这已经把我抛出了一个循环。

这是我的手课:

public class Hand 
{
    private int handSize;           //how many cards in the hand
    private int cardsInHand;        //counter
    private Cards [] hand;

    public Hand ()
    {
        hand = new Cards[];
        handSize = 5;
        cardsInHand = 0;
    }

    public Hand (int handSize)
    {
        hand = new Cards [handSize];
        this.handSize = handSize;
    }

    public void addCard (Cards card)
    {
        if (cardsInHand >= handSize) 
        {
            Cards[] temp = new Cards[hand.length*2];
            for (int i=0; i < cardsInHand; i++)
            {   
                temp[i] = hand[i];
                hand = temp;
            }
        }

    }

我遇到的问题是当询问用户将播放多少玩家时,我是否会为手创建一个新对象?像Hand player1 = new Hand ();?如果他们输入5名球员怎么办?

另外,当我要求手中有多少张牌时,如果有3名牌手,他们会输入15张牌?我知道我需要使用Do While循环,但这可以在Hand类或我的驱动程序中完成吗?

我知道这相当长,但在正确的方向上推动会非常感激。

2 个答案:

答案 0 :(得分:2)

使用面向对象中的对象来帮助您。

卡片是对象吗?是的,所以你有一个对象。

手是一个物体吗?是(你必须在具体和抽象之间进行思考。)所以你有一个对象。

如果你有多只手怎么办? 考虑一下您可以放置​​多个 int 值或多个整数值的位置。玩家会成为一个对象吗?

你想让司机直接在手牌中迭代吗? 如果没有,那会怎么样?您需要做什么才能让驱动程序迭代卡片?

请记住面向对象的原则:封装等。

答案 1 :(得分:1)

请记住,Java是一种面向对象的编程语言。把你的课想象成现实世界的对象吧。您的Deck包含一些Cards A Hand属于Player,并且包含一定数量的Cards。你在玩什么?一个Game。所以,想象一下:

您正在玩Game

public class Game {

}

你的游戏中有多少玩家?无论答案是什么,都要创建那么多Players

public class Game {

    public Player[] players;

    public Game(int numPlayers) {
        players = new Player[numPlayers];
    }

}

每位球员......

public class Player {

}

......有一只手:

public class Player {
    public Hand hand;
}

每只手都由一些Cards组成:

public class Hand {
    public Card[] cards;
}

手中会有多少张牌?在创建游戏时设置值:

public class Game {

    public Player[] players;
    public static int numCardsPerHand; // static, unless you have multiple games going at the same time

    public Game(int numPlayers, int numCardsPerHand) {
        players = new Player[numPlayers];
        this.numCardsPerHand = numCardsPerHand
    }

}

...并在创建双手时使用该值:

public class Hand {
    public Card[] cards;

    public Hand() {
        cards = new Card[Game.numCardsPerHand];// alternatively, pass this value in the ctor.
    }
}

......等等。还要考虑&#34;行动&#34;得到表演。例如,在我看来,如果你要在Hand类中创建一个AddCardToHand(newCard)方法,那么这意味着被动地/神奇地拥有一张新牌。但是,如果你把这个方法放在Player类中,那对我来说意味着玩家正在积极地将一张新牌放在他们手中,而不仅仅是它!噗!出现。

请注意,在上面的示例中,没有必要区分PlayersHands。它们基本上是一回事。现在,如果您在Player上有更多属性(例如,男/女,他们玩过多少次游戏,得分等),那么您需要单独的课程。不过,我认为你可以将它们结合起来。

当你deal()时,重复你的玩家&#39;并将卡分配给数组中的插槽(Card[]类中的Hand数组)。

tldr: OO(面向对象)编程的美感在于它模仿真实世界的对象。试着想一下你的游戏将如何在现实生活中播放,涉及哪些对象(卡片,牌组,玩家等)。记住你的克制检查。例如,普通甲板只有52张牌。如果您的情况属于这种情况,则无法向15人发放5张卡片!

从我到目前为止所看到的情况来看,看起来你开始没问题,然后就让你自己陷入困境中。请记住,有时退一步从不同角度看问题是件好事。尝试在黑板/白板上绘制图表(不要使用sharpie)。

你走在正确的轨道上。祝你好运。