/**
* Copyright (C) 2017 Jan Schäfer (jansch@users.sourceforge.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jskat.ai.nn;
import java.util.HashMap;
import java.util.Map;
import org.jskat.util.Card;
import org.jskat.util.CardDeck;
import org.jskat.util.CardList;
import org.jskat.util.Player;
/**
* Simulates possible card decks according to the player knowledge
*/
public class CardDeckSimulator {
/**
* Simulates a card distribution
*
* @param playerPosition
* Player position
* @param playerHand
* Cards on players hand
* @return Simulated card distribution
*/
public static CardDeck simulateUnknownCards(Player playerPosition,
CardList playerHand) {
return simulateUnknownCards(playerPosition, playerHand, new CardList());
}
/**
* Simulates a card distribution
*
* @param playerPosition
* Player position
* @param playerHand
* Cards on players hand
* @param knownSkat
* Cards in the skat
* @return Simulated card distribution
*/
public static CardDeck simulateUnknownCards(Player playerPosition,
CardList playerHand, CardList knownSkat) {
// prepare result
Map<Player, CardList> playerHands = new HashMap<Player, CardList>();
CardList skat = new CardList(knownSkat);
for (Player player : Player.values()) {
// set empty card list
playerHands.put(player, new CardList());
}
playerHands.get(playerPosition).addAll(playerHand);
// get unknown cards
CardDeck unknownCards = new CardDeck();
unknownCards.removeAll(playerHand);
unknownCards.removeAll(knownSkat);
unknownCards.shuffle();
// set unknown cards
for (Card card : unknownCards) {
Player player = null;
if (playerHands.get(Player.FOREHAND).size() < 10) {
player = Player.FOREHAND;
} else if (playerHands.get(Player.MIDDLEHAND).size() < 10) {
player = Player.MIDDLEHAND;
} else if (playerHands.get(Player.REARHAND).size() < 10) {
player = Player.REARHAND;
}
if (player != null) {
playerHands.get(player).add(card);
} else {
// player hands are filled -> put card into skat
skat.add(card);
}
}
return createCardDeck(playerHands, skat);
}
private static CardDeck createCardDeck(Map<Player, CardList> playerHands,
CardList skat) {
CardList cards = new CardList();
// Simulate card dealing
for (int i = 0; i < 3; i++) {
// FIXME (jan 17.01.2011) code duplication with
// SimpleSkatGame#dealCards()
// deal three rounds of cards
switch (i) {
case 0:
// deal three cards
dealCards(cards, playerHands, 3);
// and put two cards into the skat
cards.add(skat.get(0));
cards.add(skat.get(1));
break;
case 1:
// deal four cards
dealCards(cards, playerHands, 4);
break;
case 2:
// deal three cards
dealCards(cards, playerHands, 3);
break;
}
}
return new CardDeck(cards);
}
private static void dealCards(CardList result,
Map<Player, CardList> playerHands, int cardCount) {
for (Player player : Player.values()) {
for (int i = 0; i < cardCount; i++) {
result.add(playerHands.get(player).remove(0));
}
}
}
}