All pastes #409789 Raw Edit

Miscellany

public text v1 · immutable
#409789 ·published 2007-03-25 22:18 UTC
rendered paste body
package ex15;

import java.io.IOException;

public class MiniMaxPlayer extends Player {

	int playerTurn;

	public int pickMove(Board b) throws NoMoveAvailableException,
			IllegalMoveException, CloneNotSupportedException, IOException,
			ClassNotFoundException {
		
		KalahBoard kb = (KalahBoard) b.makeCopy();
		playerTurn = kb.getTurn();
		return calcMove(kb);
	}
	
	
	
	
	
	public int calcMove(KalahBoard kb){
		int[] scoreArr = new int[6];
		int count = 0;
		KalahBoard[] kalahTemp = new KalahBoard[6];
		KalahBoard kalahb = kb.makeCopy();
		int temp = (int) (java.lang.Math.random()*2)+3;
	//	temp = java.lang.Math.round(temp);
		int currKalah = kalahb.getTurn();
		int score = 0;
		int[] stoneNumArr = {1,2,3,4,5,6};
		
		for(int j = 1;j<7;j++){
			int temp2 = kalahb.getTurn();
			try{
			kalahb.makeMove(temp2, j);
			score = score+(kalahb.getKalah(kalahb.getTurn()) - currKalah);
			kalahTemp[j-1] = kalahb;
			scoreArr[j-1] = scoreArr[j-1] + score;
			score = 0;
			if(temp2 == kalahb.getTurn()){
				score=score+5;
			}
			kalahb = kb.makeCopy();
			}catch(IllegalMoveException ime){ score = 0;}
		}
		
		for(int i = 0;i<6;i++){
		scoreArr[i] = calcBestMove(count, kalahTemp[i]);}
		sort(scoreArr, kalahTemp, stoneNumArr);
		
		if(temp == 3)
			return  stoneNumArr[3];
		else
			if(temp == 4)
				return stoneNumArr[4];
			else
				return stoneNumArr[5];
		
	//	return scoreArr[temp];
}

		
	public int calcBestMove(int count, KalahBoard kb){
		KalahBoard kalahb = kb.makeCopy();
		KalahBoard maxkb = null;
		int currKalah = kalahb.getTurn();
		int score = 0;
		int scoreMax = -100;
		if(count <5){
		
		for(int j = 1;j<7;j++){
			int temp2 = kalahb.getTurn();
			try{
			if(kalahb.getStones(temp2, j) >0){
			kalahb.makeMove(temp2, j);
			if(temp2 != playerTurn){
				score = score-(kalahb.getKalah(kalahb.getTurn()) - currKalah);
				if(temp2 == kalahb.getTurn()){
					score=score-5;
				}
				if(score > scoreMax){
					scoreMax = score;
					maxkb = kalahb;
				}
			}
			else{
				score = score+(kalahb.getKalah(kalahb.getTurn()) - currKalah);
				if(temp2 == kalahb.getTurn()){
					score=score+5;
				}
				if(score > scoreMax){
					scoreMax = score;
					maxkb = kalahb;
				}
			}
			score = 0;
			kalahb = kb.makeCopy();
			}else{
			//	System.out.println("Test");
			}
			}catch(IllegalMoveException ime){}
		}
		
	//	sort(scoreArr, kalahTemp);
		count++;
		return calcBestMove(count, maxkb);
		}
		else{
			return scoreMax;
		}
}
	
	public int findIndexOfNextSmallest(int[] unsorted, int startIndex) {
		int smallestIndex = startIndex;
		
		int i = startIndex;
		while(i<unsorted.length) {
			if(unsorted[i]<unsorted[smallestIndex]) {
				smallestIndex = i;
			}
			i++;
		}
		return smallestIndex;
	}

	public void sort(int[] toBeSorted, KalahBoard[] kalahTemp, int[] stoneNumArr) {
		int i=0;

		while(i<toBeSorted.length) {
			
			// select the smallest value occurring after this index
			int smallest = findIndexOfNextSmallest(toBeSorted, i);
			
			// swap the current value with the smallest value
			int temp = toBeSorted[i];
			KalahBoard kbtemp = kalahTemp[i];
			int temp2 = stoneNumArr[i];
			toBeSorted[i] = toBeSorted[smallest];
			kalahTemp[i] = kalahTemp[smallest];
			stoneNumArr[i] = stoneNumArr[smallest];
			toBeSorted[smallest] = temp;
			kalahTemp[i]= kbtemp;
			stoneNumArr[i] = temp2;
			
			i++;
		}
	}
	
}