#include <iostream>
#include <iomanip>
using namespace std;

int positionValue(int pos);
pair<int, int> chooseMoveComputer(int pos);
pair<int, int> chooseMoveHuman(int pos);

int positionValue(int pos) {
    static const int value[16]={4,5,3,2,6,7,8,9,1,10,2,11,12,13,14,14};
    if (pos>=15 && pos<31)
        return value[pos-15];
    return -1;
}

pair<int, int> chooseMoveComputer(int pos) {
   	int value(positionValue(pos));
   	int bestNextPos(pos);
	if (value==-1) {
        value=0;
        for (int i(1); i<3; ++i) {
    	    pair<int, int> reply(chooseMoveHuman(2*pos+i));
    	    if (reply.first>value) {
                value=reply.first;
                bestNextPos=2*pos+i;
    	    }
	    }
    }
	return make_pair(value, bestNextPos);
}

pair<int, int> chooseMoveHuman(int pos) {
   	int value(positionValue(pos));
   	int bestNextPos(pos);
	if (value==-1) {
	    value=15;
    	for (int i(1); i<3; ++i) {
    	    pair<int, int> reply(chooseMoveComputer(2*pos+i));
    	    if (reply.first<value) {
                value=reply.first;
                bestNextPos=2*pos+i;
    	    }
        } 
	}
	return make_pair(value, bestNextPos);
}

// alles in 1 routine (is minder duidelijk en ook minder snel!
enum Side {HUMAN, COMPUTER};

pair<int, int> chooseMove(Side s, int pos) {
   	int value(positionValue(pos));
   	int bestNextPos(pos);
	if (value==-1) {
        value=(s==COMPUTER)?0:15;
        for (int i(1); i<3; ++i) {
    	    pair<int, int> reply(chooseMove((s==COMPUTER)?HUMAN:COMPUTER, 2*pos+i));
    	    if (s==COMPUTER&&reply.first>value || s==HUMAN&&reply.first<value) {
                value=reply.first;
                bestNextPos=2*pos+i;
    	    }
	    }
    }
	return make_pair(value, bestNextPos);
}

int main() {
    pair<int, int> res(chooseMoveComputer(0));    
    cout<<"Pos:  0"<<" Value: "<<setw(2)<<res.first<<" BestPos: "<<setw(2)<<res.second<<endl;
    for (int p(1); p<3; ++p) {
        res=chooseMoveHuman(p);    
        cout<<"Pos: "<<setw(2)<<p<<" Value: "<<setw(2)<<res.first<<" BestPos: "<<setw(2)<<res.second<<endl;
    }    
    for (int p(3); p<7; ++p) {
        res=chooseMoveComputer(p);    
        cout<<"Pos: "<<setw(2)<<p<<" Value: "<<setw(2)<<res.first<<" BestPos: "<<setw(2)<<res.second<<endl;
    }    
    for (int p(7); p<15; ++p) {
        res=chooseMoveHuman(p);    
        cout<<"Pos: "<<setw(2)<<p<<" Value: "<<setw(2)<<res.first<<" BestPos: "<<setw(2)<<res.second<<endl;
    }    
    cin.get();
    res=chooseMove(COMPUTER, 0);    
    cout<<"Pos:  0"<<" Value: "<<setw(2)<<res.first<<" BestPos: "<<setw(2)<<res.second<<endl;
    cin.get();
}


