2012-04-13 83 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