/** * 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.newalgorithm; // //import org.apache.log4j.Logger; //import org.jskat.player.PlayerKnowledge; //import org.jskat.util.Card; //import org.jskat.util.CardList; //import org.jskat.util.GameType; //import org.jskat.util.Rank; //import org.jskat.util.Suit; // //public class AlgorithmNull extends AbstractAlgorithmAI { // private static final Logger log = Logger.getLogger(AlgorithmNull.class); // // private final AlgorithmAI myPlayer; // private final PlayerKnowledge knowledge; // // /** // * // */ // AlgorithmNull(final AlgorithmAI p, GameType pGameType) { // super(p, pGameType); // myPlayer = p; // knowledge = p.getKnowledge(); // log.debug("Defining player <" + myPlayer.getPlayerName() + "> as " + this.getClass().getName()); // } // // @Override // public Card playCard() { // if (knowledge.getOwnCards().size() == 1) { // return knowledge.getOwnCards().get(0); // } // if (knowledge.getTrickCards() == null || knowledge.getTrickCards().isEmpty()) { // if (knowledge.getNoOfTricks() < 1) { // return openGame(); // } // return openTrick(); // } // if (knowledge.getTrickCards().size() == 1) { // return playMiddlehandCard(); // } // return playRearhandCard(); // } // // // private Card openGame() { // CardList cards = knowledge.getOwnCards(); // if (cards.get(0).getRank() == Rank.JACK && cards.get(0).getSuit().ordinal() > 2 // && cards.get(1).getRank() != Rank.JACK) { // return cards.get(0); // } // int resultIndex = -1; // for (Suit s : Suit.values()) { // if (cards.getSuitCount(s, false) == 1) { // if (resultIndex < 0 // || cards.get(resultIndex).getRamschOrder() > cards.get(cards.getFirstIndexOfSuit(s)) // .getRamschOrder()) { // resultIndex = cards.getFirstIndexOfSuit(s); // } // } else if (cards.getSuitCount(s, false) == 2 // && cards.get(cards.getLastIndexOfSuit(s)).getRank() == Rank.SEVEN) { // resultIndex = cards.getFirstIndexOfSuit(s); // } // } // if (resultIndex >= 0) { // return cards.get(resultIndex); // } // return cards.get(cards.size() - 1); // } // // private Card openTrick() { // CardList cards = knowledge.getOwnCards(); // int[] playedCards = knowledge.getPlayedCardsBinary(); // int resultIndex = -1; // // see if I want to get rid of any single cards // for (Suit s : Suit.values()) { // if ((knowledge.getPlayedCardsBinary()[s.ordinal()] & 127) > 0) { // continue; // } // Card c = cards.get(cards.getFirstIndexOfSuit(s, false)); // // // if (cards.getSuitCount(s, false) == 1 && c.getRank().getNullOrder() < 6 // && c.getRank().getNullOrder() > 2) { // if (resultIndex < 0) { // resultIndex = cards.getIndexOf(c); // } else { // if (c.getNullOrder() > cards.get(resultIndex).getNullOrder()) { // resultIndex = cards.getIndexOf(c); // } // } // } // Card lowCard = cards.get(cards.getLastIndexOfSuit(s, false)); // if (cards.getSuitCount(s, false) == 2 && c.getRank().getNullOrder() < 6 // && lowCard.getRank().getNullOrder() < 2) { // resultIndex = cards.getIndexOf(c); // } // } // if (resultIndex >= 0) { // Card result = cards.get(resultIndex); // log.debug("Playing single (or high double) suit card: " + result + " of " + cards); // return result; // } // // int jack = Rank.JACK.toBinaryFlag(); // if ((playedCards[0] & jack) + (playedCards[1] & jack) + (playedCards[2] & jack) + (playedCards[3] & jack) == 0) { // log.debug("no jack played yet - trying it myself"); // if (cards.get(0).getRank() == Rank.JACK && cards.get(0).getSuit().ordinal() > 1 // && cards.get(1).getRank() != Rank.JACK) { // return cards.get(0); // } // } // // // check best card, if there are no "easy" suits // for (Card c : cards) { // if (c.getNullOrder() == 1) { // resultIndex = cards.getIndexOf(c); // } else if (c.getNullOrder() == 0 && resultIndex < 0) { // resultIndex = cards.getIndexOf(c); // } // } // if (resultIndex >= 0) { // return cards.get(resultIndex); // } // return cards.get(cards.size() - 1); // } // // private Card playMiddlehandCard() { // log.debug("I (" + myPlayer.getPlayerName() + ") am in middlehand (OpponentPlayer)"); // CardList cards = knowledge.getOwnCards(); // Card initialCard = knowledge.getTrickCards().get(0); // GameType gameType = knowledge.getGameType(); // // Card result = null; // // fallback: get last valid card // return getDefaultCard(cards, initialCard, gameType); // } // // private Card playRearhandCard() { // log.debug("I (" + myPlayer.getPlayerName() + ") am in rearhand (OpponentPlayer)"); // CardList cards = knowledge.getOwnCards(); // Card initialCard = knowledge.getTrickCards().get(0); // Card middlehandCard = knowledge.getTrickCards().get(1); // GameType gameType = knowledge.getGameType(); // Card result = null; // CardList allowed = new CardList(); // for (Card c : cards) { // if (c.isAllowed(gameType, initialCard, cards)) { // allowed.add(c); // } // } // if (allowed.size() == 1) { // return allowed.get(0); // } // // if possible, take the highest card // result = allowed.get(0); // for (Card c : allowed) { // boolean beatsCheck = c.beats(gameType, initialCard) && c.beats(gameType, middlehandCard); // boolean beatsResult = result.beats(gameType, initialCard) && result.beats(gameType, middlehandCard); // if (beatsResult && !beatsCheck) { // result = c; // } // } // // // fallback: take the first valid card // return result == null ? getDefaultCard(cards, initialCard, gameType) : result; // } // // @Override // public CardList discardSkat(BidEvaluator bidEvaluator) { // CardList result = new CardList(); // CardList cards = new CardList(knowledge.getOwnCards()); // cards.sort(GameType.NULL); // log.debug("cards left before discarding(noJacks): " + cards.size() + " - " + cards); // for (Card c : cards) { // if (result.size() < 2 && c.getRank() == Rank.ACE) { // result.add(c); // } else if (result.size() == 2 && c.getRank() == Rank.ACE) { // int len = knowledge.getOwnCards().getSuitCount(c.getSuit(), false); // int len0 = knowledge.getOwnCards().getSuitCount(result.get(0).getSuit(), false); // int len1 = knowledge.getOwnCards().getSuitCount(result.get(1).getSuit(), false); // if (len < len0) { // result.remove(0); // result.add(c); // } else if (len < len1) { // result.remove(1); // result.add(c); // } // } // } // for (Card c : cards) { // if (result.size() < 2 && c.getRank() == Rank.TEN) { // result.add(c); // } else if (result.size() == 2 && c.getRank() == Rank.TEN) { // int len = knowledge.getOwnCards().getSuitCount(c.getSuit(), false); // int len0 = knowledge.getOwnCards().getSuitCount(result.get(0).getSuit(), false); // int len1 = knowledge.getOwnCards().getSuitCount(result.get(1).getSuit(), false); // if (len < len0) { // result.remove(0); // result.add(c); // } else if (len < len1) { // result.remove(1); // result.add(c); // } // } // } // for (Card c : cards) { // if (result.size() < 2 && c.getRank() == Rank.KING) { // result.add(c); // } // } // for (Card c : cards) { // if (result.size() < 2 && c.getRank() != Rank.JACK) { // result.add(c); // } // } // log.debug("cards left after discarding(Null): " + cards.size() + " - " + cards); // return result; // } //}