我还是新手编程,所以在这里,我创建了一个很好的卡片和甲板课程,但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
类或我的驱动程序中完成吗?
我知道这相当长,但在正确的方向上推动会非常感激。
答案 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类中,那对我来说意味着玩家正在积极地将一张新牌放在他们手中,而不仅仅是它!噗!出现。
请注意,在上面的示例中,没有必要区分Players
和Hands
。它们基本上是一回事。现在,如果您在Player
上有更多属性(例如,男/女,他们玩过多少次游戏,得分等),那么您需要单独的课程。不过,我认为你可以将它们结合起来。
当你deal()
时,重复你的玩家&#39;并将卡分配给数组中的插槽(Card[]
类中的Hand
数组)。
tldr: OO(面向对象)编程的美感在于它模仿真实世界的对象。试着想一下你的游戏将如何在现实生活中播放,涉及哪些对象(卡片,牌组,玩家等)。记住你的克制检查。例如,普通甲板只有52张牌。如果您的情况属于这种情况,则无法向15人发放5张卡片!
从我到目前为止所看到的情况来看,看起来你开始没问题,然后就让你自己陷入困境中。请记住,有时退一步从不同角度看问题是件好事。尝试在黑板/白板上绘制图表(不要使用sharpie)。
你走在正确的轨道上。祝你好运。