私は、javaを使用して、基本的なカードゲーム(実験)を作成しようとしています。カードのデッキをシャッフルした後、私はゲームに参加しかかったプレイヤーの数に基づいて、各プレイヤーに6枚のシャッフルカードを渡す必要があります。(最大6人の選手)
「プレーヤー」クラスにsetHand()メソッドを使用することにより、私は6枚のカードをdislayすることができましたが、これまでに2人の選手があれば選手をループすることにより、メイン方法でゲームを、開始した後、私は2枚のカードを示されました。
public static void main (String[] args) {
//Create players between 2-6
Game newGame = new Game();
List<Player> players = newGame.createPlayers();
//Let user decide the number of cards set either 24 or 36 or 52 and create deck
if(players != null){
newGame.createDeck(players);
for (Player player: players){
player.showHand();
}
}
}
public class Game {
private Dealer dealer;
private List<Player> players = new ArrayList<>();
private int numberOfPlayers;
public List<Player> createPlayers(){
Scanner scanner = new Scanner(System.in);
System.out.println("Number of players(up to 6)");
numberOfPlayers = scanner.nextInt();
if(numberOfPlayers <= 6) {
int count = 0;
while (count < numberOfPlayers) {
System.out.println("Please enter the names");
String playerName = scanner.next();
players.add(new Player(playerName));
count++;
}
return players;
}else{
System.out.println("More than 6 players are not allowed");
return null;
}
}
public void createDeck(List<Player> players){
System.out.println("Number of Cards (24/36/52)");
Scanner scanner = new Scanner(System.in);
int numberOfCards = scanner.nextInt();
Dealer newDeck = new Dealer(numberOfCards, numberOfPlayers);
newDeck.shuffleDeck();
newDeck.dealShuffledCardsToPlayers(players);
}
}
public class Dealer {
private Deck deck;
private List<Player> players;
private final int NUMBER_OF_CARDS;
public Dealer(int numberOfCards, int numberOfPlayers) {
this.deck = new Deck(numberOfCards);
this.players = new ArrayList<>(numberOfPlayers);
this.NUMBER_OF_CARDS = numberOfCards;
}
public void shuffleDeck(){
Collections.shuffle(deck.getDeck());
}
public void dealShuffledCardsToPlayers(List<Player> players){
for(Player player: players){
for(int i= 0; i<6; i++) {
player.setHand(deck.deal(6));
}
}
}
}
public class Player {
private String name;
private int points;
private List<Card> hand;
public Player(String name) {
this.name = name;
this.points = 0;
this.hand = new ArrayList<>();
}
public List<Card> getHand(){
return hand;
}
public void setHand(List<Card> hand) {
this.hand = hand;
// System.out.println(hand);
}
public void showHand(){
for(int i=0; i<this.hand.size(); i++){
System.out.println(this.hand.get(i));
}
}
}
public class Deck{
private List<Card> deck;
// private static final Random GENERATOR = new Random();
public Deck (int numberOfCards) {
deck = new ArrayList<>(numberOfCards);
int count = 0;
for (final Card.Suit suit : Card.Suit.values()) {
for (final Card.Rank rank : Card.Rank.values()) {
deck.add(new Card(rank, suit));
count++;
}
}
}
public List<Card> getDeck(){
return deck;
}
public List<Card> deal(int size){
List<Card> hand = new ArrayList<>(size);
hand.add(deck.remove(size));
return hand;
}
}
期待される結果は、プレイヤーに6枚のシャッフルカードを対処することです。また、改善する必要があると私は間違ってやっているかについて自分の考えを共有してください。
コメントで述べたように、それは問題を示して短いコード例にあなたの問題を統合するために一般的に良いことです。また、デバッガは、変数の値は、アプリケーションの異なるポイントでそれらを期待しているものと一致するかどうかを決定するためにあなたの友人、セットブレークポイントと通じステップです。
あなたが欲しいの結果を見ていない理由は、内のロジックであるdealShuffledCardsToPlayers(...)
とdeck.deal(...)
する方法。
deck.deal(int型のサイズ)メソッドの内部でみましょうスタート。
public List<Card> deal(int size){
List<Card> hand = new ArrayList<>(size);
hand.add(deck.remove(size));
return hand;
}
このメソッド内で、毎回それはあなたが渡されたサイズの新しい手のArrayListを作成しているが、その後、あなたはそれだけに一つのオブジェクト(インデックスのカード追加されていると呼ばれていますsize
デッキのを)。あなたはList.removeのヘッダを見れば、あなたはそれだけで(あなたのケース1カードで)リストから削除された要素を返すことがわかります。
このリスト(オプション)で指定された位置にある要素を削除します。左にシフト後続要素(減算そのインデックスからの1つ)。リストから削除された要素を返します。
それでは内でdealer.dealShuffledCardsToPlayers(List<Player> players)
、このループ内の各プレイヤーの手を6回に設定
for(Player player: players){
for(int i= 0; i<6; i++) {
player.setHand(deck.deal(6));
}
}
しかし、あなたがそれを設定しているたびに、それはあなたが唯一のプレーヤーごとに一枚のカードで終わる理由ですdeck.deal(...)メソッド内のデッキから削除することを唯一の(最後の)カードです。
私は何をintededが持つことだったと思うdeck.deal(...)
方法は6枚のランダムなカードを対処し、これらの線に沿って、手が配ら何かを返します。
public List<Card> deal(int size){
List<Card> hand = new ArrayList<>(size);
Random rand = new Random();
for (int dealtCount = 0; dealtCount < size; dealtCount++) {
hand.add(deck.remove(rand.nextInt(deck.size())));
}
return hand;
}
それとも、おそらくランダムを省略し、すでにシャッフルので、ちょうど(これはシャッフルした後デッキの上をオフに扱うのと同等になります)最初/最後の6枚のカードを取ることができます。
そして、代わりにその調整で、あなたの内、外部ループを削除することができますdealer.dealShuffledCardsToPlayers(List<Player> players)
だけになるように:
for(Player player: players){
player.setHand(deck.deal(6));
}
3人のランダムプレイヤーを設定する場合(デバッグログで明確にするため)カードプリントアウトの上に印刷された選手名を追加した後、あなたはこれで終わります:
Number of players(up to 6)
3
Please enter the names
George
Please enter the names
Maria
Please enter the names
Joe
Number of Cards (24/36/52)
52
Player: George
FOUR of DIAMONDS
TEN of DIAMONDS
THREE of CLUBS
TWO of CLUBS
NINE of SPADES
EIGHT of SPADES
Player: Maria
TWO of DIAMONDS
KING of CLUBS
FOUR of SPADES
FIVE of HEARTS
JACK of SPADES
SEVEN of DIAMONDS
Player: Joe
NINE of HEARTS
JACK of HEARTS
FIVE of DIAMONDS
ACE of CLUBS
ACE of SPADES
JACK of CLUBS
つまり、あなたのカード数はわずか24である場合には、各プレイヤーに6枚のカードを扱う6人用のゲームを持つことができない - もうひとつは、あなたが最も可能性の高いプレーヤー/カード数のincorect組み合わせを防ぐために必要です。
編集 - 挿入された私の例で変更されたクラス:
Dealer.java
public class Dealer {
private Deck deck;
private List<Player> players;
private final int NUMBER_OF_CARDS;
public Dealer(int numberOfCards, int numberOfPlayers) {
this.deck = new Deck(numberOfCards);
this.players = new ArrayList<>(numberOfPlayers);
this.NUMBER_OF_CARDS = numberOfCards;
}
public void shuffleDeck(){
Collections.shuffle(deck.getDeck());
}
public void dealShuffledCardsToPlayers(List<Player> players){
// List<Card> tempCard = deck.getDeck();
// for(int i=0; i < players.size(); i++){
// for(int j=0; j < 6; j++){
// players.add(tempCard.remove(i+j*6));
// }
// }
for(Player player: players){
player.setHand(deck.deal(6));
}
}
}
Deck.java
public class Deck{
private List<Card> deck;
// private static final Random GENERATOR = new Random();
public Deck (int numberOfCards) {
deck = new ArrayList<>(numberOfCards);
int count = 0;
for (final Card.Suit suit : Card.Suit.values()) {
for (final Card.Rank rank : Card.Rank.values()) {
deck.add(new Card(rank, suit));
count++;
}
}
}
public List<Card> getDeck(){
return deck;
}
public List<Card> deal(int size){
List<Card> hand = new ArrayList<>(size);
Random rand = new Random();
for (int dealtCount = 0; dealtCount < size; dealtCount++) {
hand.add(deck.remove(rand.nextInt(deck.size())));
}
return hand;
}
@Override
public String toString(){
StringBuilder builder = new StringBuilder();
for(int i = 0; i < deck.size(); i++){
builder.append(i + " ");
builder.append(deck.get(i));
builder.append(System.getProperty("line.separator"));
}
return builder.toString();
}
}