Player.java :  » Game » androidyaniv » com » andro » yaniv » game » Android Open Source

Android Open Source » Game » androidyaniv 
androidyaniv » com » andro » yaniv » game » Player.java
package com.andro.yaniv.game;
import java.util.ArrayList;
import java.util.Arrays;

import com.andro.yaniv.ai.AIController;
import com.andro.yaniv.game.PlayingCard.Face;
import com.andro.yaniv.game.PlayingCard.SortMethod;

import android.widget.ImageView;

public class Player{
  public static final int HUMAN = 1;
  public static final int COMPUTER = 2;
  
  public static final int DECK =1;
  public static final int DISCARD = 2;
  
  public static final int DROPSINGLE = 0;
  public static final int DROPPAIR = 1;
  public static final int DROPSAME = 2;
  public static final int DROPRUN = 3;
  public static final int DROPINVALID = -1;
  
  private PlayerHand hand = null;
  private String playerName = null;
  public int pickupLocation = 0;
  
  public Player(ImageView[] cardViews,String pName, int playerType){
    hand = new PlayerHand(cardViews, playerType);
    playerName = pName;
  }
  
  
  public PlayerHand getHand(){
    return hand;
  }
  
  public int canDrop(){
    PlayingCard [] selectedCards = hand.getSelectedCards();
    if (selectedCards.length == 0){
      return DROPINVALID;
    }else{
      return validateDrop(selectedCards);
    }
  }

  public int validateDrop(PlayingCard[] selectedCards) {
    int retVal = DROPINVALID;
    //check for single card
    if (selectedCards.length == 1){
      retVal =DROPSINGLE;
    }else{
      //dealing with more than one card
      if (selectedCards.length == 2){
        //dealing with a pair both must have same face
        Face card1Face = selectedCards[0].getFace();
        Face card2Face = selectedCards[1].getFace(); 
        if ( (card1Face.equals(card2Face)) || (card1Face.equals(Face.JOKER) || card2Face.equals(Face.JOKER))){
          retVal =DROPPAIR;
        }
      }  
      if (retVal == DROPINVALID){
        if (selectedCards.length > 2){
          //dealing with multiple could be a Run or all same face
          //selectedCards[0] = new PlayingCard(Suit.HEART,Face.JOKER);
          //selectedCards[1] = new PlayingCard(Suit.DIAMOND,Face.THREE);
          //selectedCards[2] = new PlayingCard(Suit.DIAMOND,Face.FIVE);
          //check for a run
          PlayingCard.sortType = SortMethod.FACE;
          Arrays.sort(selectedCards);
          int jokerCount = 0;
          while (selectedCards[jokerCount].getFace() == Face.JOKER){
            jokerCount++;
          }
          if (jokerCount + 1 == selectedCards.length){
            retVal =DROPSAME;
          }
          if (retVal == DROPINVALID){
            int runStart = jokerCount;
            while (runStart < selectedCards.length -1){
              int card1Value = selectedCards[runStart].getFace().getFaceValue();
              int card2Value = selectedCards[runStart+1].getFace().getFaceValue();
              if (card1Value + 1 == card2Value){
                runStart++;
              }else{
                int difference = (card2Value - card1Value) -1;
                if (difference < 0) {
                  break;
                }
                if (difference > jokerCount){
                  retVal =DROPINVALID;
                  break;
                }else{
                  jokerCount -= difference;
                  runStart++;
                }
              }
            }
            if (runStart == selectedCards.length-1){
              PlayingCard.sortType = SortMethod.SUIT;
              Arrays.sort(selectedCards);
              
              if (selectedCards[0].getSuit().compareTo(selectedCards[selectedCards.length -1].getSuit())==0){
                retVal =DROPRUN;
              }else{
                ArrayList <PlayingCard> temp = new ArrayList<PlayingCard>(Arrays.asList(selectedCards));
                for (Object cur: temp.toArray()){
                  if ( ((PlayingCard)cur).getFace().equals(Face.JOKER) ){
                    temp.remove(cur);
                  }
                }
                PlayingCard[] filtered = new PlayingCard[temp.size()];
                temp.toArray(filtered);
                Arrays.sort(filtered);
                if (filtered[0].getSuit().compareTo(filtered[filtered.length -1].getSuit())==0){
                  retVal =DROPRUN;
                }else{
                  retVal =DROPINVALID;
                }
              }
            }
            //check for multiple same-face
            if (retVal == DROPINVALID){
              retVal = DROPSAME;
              int startVal = selectedCards[selectedCards.length-1].getFace().getFaceValue();
              for (int x = selectedCards.length-2; x >= 0; x--){
                int cardValue = selectedCards[x].getFace().getFaceValue();
                if (cardValue != startVal && cardValue != Face.JOKER.getFaceValue()){
                  retVal =DROPINVALID;
                }
              }
            }

          }
        }
      }
    }
    return retVal;
  }
  
  public void selectDropCards(Game game){
    if (hand.getPlayerType() == COMPUTER){
      //TODO do AI SHIT HERE
      PlayingCard[] bestDrop = AIController.getBestDrop(game,this);
      for (int x = 0; x < bestDrop.length; x++){
        bestDrop[x].toggleSelected();
      }
      
    }
    
  }
  public int getCurrentScore(){
    return hand.getHandSum();
  }
  
  public String toString(){
    return playerName;
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.