2012-04-13 78 views
0

我对这件事情相当陌生,对我来说太光鲜了!使用MVC的二十一点爪哇

我是currenlty在Java中创建一个BlackJack游戏,并尝试在创建它时使用MVC设计。我到目前为止创建了以下类别: - 卡:持有创建卡片 - 卡组:创建一个装满所有52张卡片的卡组 - 手中:持有卡片的“手” - 玩家:创建游戏使用的球员 - BlackJackTest:在这里,我正在测试游戏的所有功能,试图让一些工作起作用!

我目前已经到了可以显示所有52张牌的地步,并且还可以将2张牌交给一手牌并展示此牌。但我在接下来的步骤中遇到了很多麻烦。理想情况下,在“BlackJackTest”课程中,我希望将其用作游戏引擎,在该引擎中输入X数量的玩家和他们的名字,然后创建玩家并循环播放该游戏。

我的问题是我完全停留在接下来要做的事上,或者我做错了什么。我的下一个任务应该是实现一个功能,以便我可以对阵一名经销商,并且不知道如何做到这一点......我还应该实现我不确定的打/站功能我应该在哪里或如何编码这些。

任何帮助表示赞赏!

这里是我的代码:

import java.util.Scanner; 

public class BlackJackTest { 

    public static void main(String[] args) { 

     /*System.out.println(deck.getCard(0).toString()); 
     System.out.println(deck.getCard(0).getSuit()); 
     System.out.println(deck.getCard(0).getSuitCode()); 
     System.out.println(deck.getCard(0).getValue()); 
     System.out.println(deck.getCard(0).getValueCode()); 
     System.out.println(); 
     System.out.println(deck.cardsLeft()); 
     hand.addCard(deck.dealCard()); 
     hand.addCard(deck.dealCard()); 
     hand.showHand(); 
     System.out.println(deck.cardsLeft()); 
     System.out.println(hand.getHandSize()); 
     System.out.println(hand.getCard(0)); 
     System.out.println(hand.getCard(1)); 
     System.out.println(hand.getBlackJackValue()); 
     System.out.println(); 
     */ 

     Deck deck = new Deck(); 

     Hand p1hand = new Hand(); 
     Player player = new Player(); 

     Scanner sc = new Scanner(System.in); 
     System.out.println("Enter your name: "); 
     player.setName(sc.nextLine()); 

     System.out.println("Welcome " + player.getName() + "!"); 

     player.setHand(p1hand); 

     p1hand.addCard(deck.dealCard()); 
     p1hand.addCard(deck.dealCard()); 

     System.out.println(player.getName() + ": "); 
     p1hand.showHand(); 
     System.out.println("Score: " + p1hand.getBlackJackValue()); 
     System.out.println(); 
    } 
} 

public class Card { 

    public enum Value { 
     TWO(2), 
     THREE(3), 
     FOUR(4), 
     FIVE(5), 
     SIX(6), 
     SEVEN(7), 
     EIGHT(8), 
     NINE(9), 
     TEN(10), 
     JACK(10), 
     QUEEN(10), 
     KING(10), 
     ACE(1); 

     public final int value; 

     Value(int c) { 
      value = c; 
     } 
    } 

    public enum Suit { 
     CLUBS('C'), 
     SPADES('S'), 
     DIAMONDS('D'), 
     HEARTS('H'); 

     public final char symbol; 

     Suit(char c) { 
      symbol = c; 
     } 
    } 

    private Suit suit; 
    private Value value; 

    public Card(Suit suit, Value value) { 
     this.suit = suit; 
     this.value = value; 
    } 

    public Suit getSuit() { 
     return suit; 
    } 

    public Value getValue() { 
     return value; 
    } 

    public char getSuitCode() { 
     return suit.symbol; 
    } 

    public int getValueCode() { 
     return value.value; 
    } 

    public String toString() { 
     return value + " of " + suit; 
    } 
} 

import java.util.Collections; 
import java.util.LinkedList; 
import java.util.List; 

public class Deck { 

    private List<Card> deck = new LinkedList<Card>(); 

    public Deck() { 
     for(Card.Suit suit : Card.Suit.values()) { 
      for(Card.Value value : Card.Value.values()) { 
       deck.add(new Card(suit,value)); 
      } 
     } 
     shuffle(); 
    } 

    public void shuffle() { 
     Collections.shuffle(deck); 
    } 

    public int cardsLeft() { 
      // As cards are dealt from the deck, the number of cards left 
      // decreases. This function returns the number of cards that 
      // are still left in the deck. 
     return deck.size(); 
    } 

    public Card dealCard() { 
      // Deals one card from the deck and returns it. 
     if (deck.size() == 52) { 
      shuffle(); 
     } 
     Card temp; 
     temp = deck.get(0); 
     remove(0); 
     return temp; 
    } 

    public Card getCard(int i) { 
     return deck.get(i); 
    } 

    public Card remove(int i) { 
     Card c = deck.get(i); 
     deck.remove(i); 
     return c; 
    } 

} 

import java.util.Vector; 

public class Hand { 
    private Vector<Card> hand; 

    public Hand() { 
     hand = new Vector<Card>(); 
    } 

    public void addCard(Card c) { 
     if (c != null) 
      hand.addElement(c); 
    } 

    public void showHand() { 
     for(int i = 0; i < hand.size(); i++){ 
      System.out.println(hand.elementAt(i)); 
     } 
    } 

    public int getHandSize() { 
     return hand.size(); 
    } 

    public Card getCard(int position) { 
     if(position >= 0 && position < hand.size()) 
      return (Card)hand.elementAt(position); 
     else 
      return null; 
    } 

    public int getBlackJackValue() { 
     int val = 0; 
     boolean ace = false; 

     for(int i = 0; i < hand.size(); i++) { 
      Card card; 
      card = getCard(i); 
      val += card.getValueCode(); 

      if(card.getValueCode() == 1) { 
       ace = true; 
      } 
     } 

     if(ace == true && val + 10 <= 21) { 
      val += 10; 
     } 

     return val; 
    } 
} 

public class Player { 
    private String name; 
    private Hand hand; 

    public Player() { 
     this.hand = null; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setHand(Hand h) { 
     this.hand = h; 
    } 

    public void getHand(){ 
     hand.showHand(); 
    } 
} 
+0

听起来好像一个银行类(经销商)将是有益的,谁共享与人力备受玩家的方法 - 无论是运动员。那么可能会有第三种玩家,一种根据规则行事的机器人。 – 2012-04-13 15:53:17

回答

1

你在你的模型类上有一个好的开始,我开始研究项目的视图和控制器部分。虽然你当然可以修改main()来包含多个玩家(只是实例化多个玩家对象,将它们存储在一个列表中,然后交易卡循环),但如果/当你决定移动时,你将不得不放弃很多玩家到非控制台视图和控制器。

您的控制器设计将与您如何接收和响应用户输入(即击中/站立)有很大关系。它的任务是将来自视图的输入(当前通过console.in)传递给模型。因此,您的视图会显示一个提示,询问用户他们想做什么,读取他们的回复并通知控制器。控制器会将此输入映射到模型类中的适当对象/方法。

希望有帮助!

史蒂夫

+0

大声笑,刚刚看到那是从去年。哦,我会让答案的立场,以防其他人绊倒这一点。 – 2013-05-31 06:00:04