/**
* 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.mjl;
import org.jskat.ai.AbstractAIPlayer;
import org.jskat.data.GameAnnouncement;
import org.jskat.data.GameAnnouncement.GameAnnouncementFactory;
import org.jskat.util.Card;
import org.jskat.util.CardList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A JSkat AI Player
*
* @author Markus J. Luzius (markus@luzius.de)
*/
public class AIPlayerMJL extends AbstractAIPlayer {
private static Logger log = LoggerFactory.getLogger(AIPlayerMJL.class);
private CardPlayer aiPlayer;
int maxBidValue = -1;
public AIPlayerMJL() {
log.debug(".new()");
}
/*
* (non-Javadoc)
*
* @see org.jskat.ai.JSkatPlayer#preparateForNewGame()
*/
@Override
public void preparateForNewGame() {
// reset implementation of aiPlayer
aiPlayer = null;
maxBidValue = -1;
// nothing else to do right now...
}
/*
* (non-Javadoc)
*
* @see org.jskat.ai.JSkatPlayer#bidMore(int)
*/
@Override
public Integer bidMore(final int nextBidValue) {
if (maxBidValue < 0) {
maxBidValue = new Bidding(knowledge.getOwnCards()).getMaxBid();
}
if (maxBidValue < nextBidValue) {
aiPlayer = new OpponentPlayer(knowledge.getOwnCards(), playerName);
return -1;
}
return nextBidValue;
}
/*
* (non-Javadoc)
*
* @see org.jskat.ai.JSkatPlayer#holdBid(int)
*/
@Override
public Boolean holdBid(final int currBidValue) {
if (maxBidValue < 0) {
maxBidValue = new Bidding(knowledge.getOwnCards()).getMaxBid();
}
boolean result = !(maxBidValue < 18) && maxBidValue >= currBidValue;
if (!result) {
aiPlayer = new OpponentPlayer(knowledge.getOwnCards(), playerName);
}
return result;
}
/*
* (non-Javadoc)
*
* @see org.jskat.ai.JSkatPlayer#lookIntoSkat()
*/
@Override
public Boolean pickUpSkat() {
// TODO really look into skat?
// aiPlayer = new SinglePlayer(cards, rules);
return true;
}
/*
* (non-Javadoc)
*
* @see org.jskat.ai.JSkatPlayer#announceGame()
*/
@Override
public GameAnnouncement announceGame() {
GameAnnouncementFactory factory = GameAnnouncement.getFactory();
factory.setGameType(new Bidding(knowledge.getOwnCards())
.getSuggestedGameType());
return factory.getAnnouncement();
}
/*
* (non-Javadoc)
*
* @see org.jskat.ai.JSkatPlayer#discardSkat()
*/
@Override
public CardList getCardsToDiscard() {
// should be done: check which cards should best be discarded
if (aiPlayer == null || aiPlayer instanceof OpponentPlayer) {
knowledge.getOwnCards().remove(knowledge.getSkat().get(0));
knowledge.getOwnCards().remove(knowledge.getSkat().get(1));
log.debug("aiplayer is not SinglePlayer, discarding original skat of ["
+ knowledge.getSkat()
+ "], cards.size="
+ knowledge.getOwnCards().size());
return knowledge.getSkat();
}
return ((SinglePlayer) aiPlayer).discardSkat(knowledge.getSkat());
}
/*
* (non-Javadoc)
*
* @see org.jskat.ai.AbstractJSkatPlayer#startGame()
*/
@Override
public void startGame() {
log.debug("Starting game for player (" + getPlayerName() + ")");
if (knowledge.getDeclarer() != knowledge.getPlayerPosition()) {
log.debug("ok? AIPlayerMJL should be OpponentPlayer - actually is: "
+ (aiPlayer == null ? "null" : aiPlayer.getClass()
.getName()));
} else {
log.debug("ok? setting AIPlayerMJL to be SinglePlayer - actually is: "
+ (aiPlayer == null ? "null" : aiPlayer.getClass()
.getName()));
aiPlayer = new SinglePlayer(knowledge.getOwnCards(), rules);
}
aiPlayer.startGame(knowledge);
}
/*
* (non-Javadoc)
*
* @see org.jskat.ai.JSkatPlayer#playCard()
*/
@Override
public Card playCard() {
log.debug("--------------------- start (" + playerName
+ ") ----------------------------------");
log.debug(".playCard(): my position: " + knowledge.getPlayerPosition()
+ ", single player: " + knowledge.getDeclarer());
Card toPlay = aiPlayer.playNextCard(knowledge);
// make sure, that there is a card
if (toPlay != null) {
return toPlay;
}
// if there is none, just play the first valid card
log.debug("no card returned from AIPlayer - just taking the first valid card");
CardList result = getPlayableCards(this.knowledge.getTrickCards());
if (result.size() < 1) {
log.warn("no playable cards - shouldn't be possible!");
log.debug("my cards: " + knowledge.getOwnCards() + ", trick: "
+ this.knowledge.getTrickCards());
log.debug("--------------------- done (" + playerName
+ ") -----------------------------------");
return null;
}
log.debug("--------------------- done -----------------------------------");
return result.get(0);
}
@Override
public void finalizeGame() {
// don't know what to do here (yet)...
log.debug("finalizing game...");
}
@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;
}
}