/** * 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.ai.AbstractAIPlayer; import org.jskat.data.GameAnnouncement; import org.jskat.data.GameAnnouncement.GameAnnouncementFactory; import org.jskat.player.ImmutablePlayerKnowledge; import org.jskat.util.Card; import org.jskat.util.CardList; import org.jskat.util.GameType; /** * @author Daniel Loreck * */ public class AlgorithmAI extends AbstractAIPlayer { private static final Logger log = Logger.getLogger(AlgorithmAI.class); private AbstractAlgorithmAI aiPlayer = null; BidEvaluator bidEvaluator = null; /* * (non-Javadoc) * * @see org.jskat.ai.IJSkatPlayer#preparateForNewGame() */ @Override public void preparateForNewGame() { log.debug("New game preparation for player <" + playerName + ">"); aiPlayer = null; } /* * (non-Javadoc) * * @see org.jskat.ai.IJSkatPlayer#finalizeGame() */ @Override public void finalizeGame() { bidEvaluator = null; // not necessry any more } /* * (non-Javadoc) * * @see org.jskat.ai.IJSkatPlayer#bidMore(int) */ @Override public Integer bidMore(final int nextBidValue) { if (bidEvaluator == null) { bidEvaluator = new BidEvaluator(knowledge.getOwnCards(), knowledge.getPlayerPosition()); } if (bidEvaluator.getMaxBid() >= nextBidValue) { return nextBidValue; } return -1; } /* * (non-Javadoc) * * @see org.jskat.ai.IJSkatPlayer#holdBid(int) */ @Override public Boolean holdBid(final int currBidValue) { if (bidEvaluator == null) { bidEvaluator = new BidEvaluator(knowledge.getOwnCards(), knowledge.getPlayerPosition()); } return bidEvaluator.getMaxBid() >= currBidValue; } /* * (non-Javadoc) * * @see org.jskat.ai.IJSkatPlayer#pickUpSkat() */ @Override public Boolean pickUpSkat() { if (bidEvaluator == null) { bidEvaluator = new BidEvaluator(knowledge.getOwnCards(), knowledge.getPlayerPosition()); } return !bidEvaluator.canPlayHandGame(); } /* * (non-Javadoc) * * @see org.jskat.ai.IJSkatPlayer#discardSkat() */ @Override public CardList getCardsToDiscard() { // Wenn Ramschspiel if (knowledge.getGameType() == GameType.RAMSCH) { aiPlayer = new AlgorithmRamsch(this, GameType.RAMSCH); } else { // Ermitteln was gespielt werden soll // normalerweise muss der BidEvaluator gesetzt sein, sonst kann er // eigentlich garnicht hier reinlaufen if (bidEvaluator == null) { bidEvaluator = new BidEvaluator(knowledge.getOwnCards(), knowledge.getPlayerPosition()); } bidEvaluator.eval(knowledge.getOwnCards()); // Wenn Null-Spiel if (bidEvaluator.getSuggestedGameType() == GameType.NULL) { // aiPlayer = new AlgorithmNull(this, // bidEvaluator.getSuggestedGameType()); log.debug(this.playerName + " ist AlgorithmNull-Spieler / getCardsToDiscard"); } // Wenn Grand else if (bidEvaluator.getSuggestedGameType() == GameType.GRAND) { aiPlayer = new AlgorithmGrand(this, bidEvaluator.getSuggestedGameType()); log.debug(this.playerName + " ist AlgorithmGrand-Spieler / getCardsToDiscard"); } // Wenn Farb-Spiel else if (bidEvaluator.getSuggestedGameType() == GameType.CLUBS || bidEvaluator.getSuggestedGameType() == GameType.SPADES || bidEvaluator.getSuggestedGameType() == GameType.HEARTS || bidEvaluator.getSuggestedGameType() == GameType.DIAMONDS) { aiPlayer = new AlgorithmSuit(this, bidEvaluator.getSuggestedGameType()); log.debug(this.playerName + " ist AlgorithmSuit-Spieler / getCardsToDiscard"); } } return aiPlayer.discardSkat(bidEvaluator); } /* * (non-Javadoc) * * @see org.jskat.ai.IJSkatPlayer#announceGame() */ @Override public GameAnnouncement announceGame() { if (bidEvaluator == null) { bidEvaluator = new BidEvaluator(knowledge.getOwnCards(), knowledge.getPlayerPosition()); } else { bidEvaluator.eval(knowledge.getOwnCards()); } // Wenn Null-Spiel if (bidEvaluator.getSuggestedGameType() == GameType.NULL) { // aiPlayer = new AlgorithmNull(this, // bidEvaluator.getSuggestedGameType()); log.debug(this.playerName + " ist AlgorithmNull-Spieler / announceGame"); } // Wenn Grand else if (bidEvaluator.getSuggestedGameType() == GameType.GRAND) { aiPlayer = new AlgorithmGrand(this, bidEvaluator.getSuggestedGameType()); log.debug(this.playerName + " ist AlgorithmGrand-Spieler / announceGame"); } // Wenn Farb-Spiel else if (bidEvaluator.getSuggestedGameType() == GameType.CLUBS || bidEvaluator.getSuggestedGameType() == GameType.SPADES || bidEvaluator.getSuggestedGameType() == GameType.HEARTS || bidEvaluator.getSuggestedGameType() == GameType.DIAMONDS) { aiPlayer = new AlgorithmSuit(this, bidEvaluator.getSuggestedGameType()); log.debug(this.playerName + " ist AlgorithmSuit-Spieler / announceGame"); } GameAnnouncementFactory factory = GameAnnouncement.getFactory(); factory.setGameType(bidEvaluator.getSuggestedGameType()); return factory.getAnnouncement(); } /* * (non-Javadoc) * * @see org.jskat.ai.IJSkatPlayer#playCard() */ @Override public Card playCard() { // Wenn Ramsch-Spiel abgeloest wurde // if(aiPlayer instanceof AlgorithmRamsch // && knowledge.getGameType() != GameType.RAMSCH) { // aiPlayer = new AlgorithmOpponentGrand(this, GameType.GRAND); // log.debug(this.playerName+ // " ist AlgorithmOpponentGrand-Spieler / playCard"); // } Card c = aiPlayer.playCard(); if (c != null) { return c; } log.warn("no card returned from AI player!"); if (knowledge.getTrickCards().size() < 1) { return knowledge.getOwnCards().get(0); } for (Card c2 : knowledge.getOwnCards()) { if (c2.isAllowed(knowledge.getGameType(), knowledge.getTrickCards() .get(0), knowledge.getOwnCards())) { return c2; } } log.warn("no valid card found!"); return knowledge.getOwnCards().get(0); } @Override public void startGame() { if (aiPlayer == null) { // Wenn RAMSCH-Spiel if (knowledge.getGameType() == GameType.RAMSCH) { aiPlayer = new AlgorithmRamsch(this, knowledge.getGameType()); log.debug(this.playerName + " ist AlgorithmRamsch-Spieler / startGame"); } // Wenn Null-Spiel if (knowledge.getGameType() == GameType.NULL) { aiPlayer = new AlgorithmOpponentNull(this, knowledge.getGameType()); log.debug(this.playerName + " ist AlgorithmOpponentNull-Spieler / startGame"); } // Wenn Grand else if (knowledge.getGameType() == GameType.GRAND) { aiPlayer = new AlgorithmOpponentGrand(this, knowledge.getGameType()); log.debug(this.playerName + " ist AlgorithmOpponentGrand-Spieler / startGame"); } // Wenn Farb-Spiel else if (knowledge.getGameType() == GameType.CLUBS || knowledge.getGameType() == GameType.SPADES || knowledge.getGameType() == GameType.HEARTS || knowledge.getGameType() == GameType.DIAMONDS) { aiPlayer = new AlgorithmOpponentSuit(this, knowledge.getGameType()); log.debug(this.playerName + " ist AlgorithmOpponentSuit-Spieler / startGame"); } } } protected ImmutablePlayerKnowledge getKnowledge() { return knowledge; } @Override public Boolean callContra() { // TODO Auto-generated method stub return false; } @Override public Boolean callRe() { // TODO Auto-generated method stub return false; } @Override public Boolean playGrandHand() { // TODO Auto-generated method stub return false; } }