void decideDraculaMove(DracView gameState) { char* nextPos = NULL; if (giveMeTheRound(gameState) == 0){ nextPos = "MR"; } else { int numLocations; LocationID* possibleDest = whereCanIgo(gameState, &numLocations, 1, 0); srand((unsigned int)time(NULL)); //seed random nextPos = idToName(possibleDest[rand()%numLocations]); } PlayerMessage msg = "Dracula MSG"; registerBestPlay(nextPos,msg); }
// What are the specified player's next possible moves // FREE THIS ARRAY IN THE AI LocationID *whereCanTheyGo(DracView currentView, int *numLocations, PlayerID player, int road, int rail, int sea) { LocationID *locations; // Remember to free the array retured from connectedLocations // if you use it in the AI if (player == PLAYER_DRACULA) { locations = whereCanIgo(currentView, numLocations, road, sea); } else { locations = connectedLocations(currentView->gv, numLocations, \ whereIs(currentView, player), \ player, (giveMeTheRound(currentView)+1), \ road, rail, sea); } return locations; }
int main() { int i; DracView dv; //NEW SET printf("Test for basic functions, just before Dracula's first move\n"); PlayerMessage messages1[] = {"Hello","Rubbish","Stuff",""}; dv = newDracView("GST.... SAO.... HZU.... MBB....", messages1); assert(giveMeTheRound(dv) == 0); assert(whereIs(dv,PLAYER_LORD_GODALMING) == STRASBOURG); assert(whereIs(dv,PLAYER_DR_SEWARD) == ATLANTIC_OCEAN); assert(whereIs(dv,PLAYER_VAN_HELSING) == ZURICH); assert(whereIs(dv,PLAYER_MINA_HARKER) == BAY_OF_BISCAY); assert(whereIs(dv,PLAYER_DRACULA) == UNKNOWN_LOCATION); assert(howHealthyIs(dv,PLAYER_DRACULA) == GAME_START_BLOOD_POINTS); printf("passed\n"); disposeDracView(dv); //NEW SET printf("Test for encountering Dracula and hunter history\n"); PlayerMessage messages2[] = {"Hello","Rubbish","Stuff","","Mwahahah","Aha!","","",""}; dv = newDracView("GST.... SAO.... HCD.... MAO.... DGE.... " "GGED... SAO.... HCD.... MAO....", messages2); assert(giveMeTheRound(dv) == 1); assert(whereIs(dv,PLAYER_DRACULA) == GENEVA); assert(howHealthyIs(dv,PLAYER_LORD_GODALMING) == 5); assert(howHealthyIs(dv,PLAYER_DRACULA) == 30); assert(whereIs(dv,PLAYER_LORD_GODALMING) == GENEVA); LocationID history[TRAIL_SIZE]; giveMeTheTrail(dv,PLAYER_DRACULA,history); assert(history[0] == GENEVA); assert(history[2] == UNKNOWN_LOCATION); giveMeTheTrail(dv,PLAYER_LORD_GODALMING,history); assert(history[0] == GENEVA); assert(history[1] == STRASBOURG); assert(history[2] == UNKNOWN_LOCATION); giveMeTheTrail(dv,PLAYER_DR_SEWARD,history); assert(history[0] == ATLANTIC_OCEAN); assert(history[1] == ATLANTIC_OCEAN); assert(history[2] == UNKNOWN_LOCATION); printf("passed\n"); disposeDracView(dv); //NEW SET printf("Test for Dracula leaving minions\n"); PlayerMessage messages3[] = {"Hello","Rubbish","Stuff","","Mwahahah","Aha!","","","","Drop a V","Party in Strasbourg","Party","Party","Party"}; dv = newDracView("GGE.... SGE.... HGE.... MGE.... DED.V.. " "GST.... SST.... HST.... MST.... DMNT... " "GST.... SST.... HST.... MST....", messages3); int nT, nV; whatsThere(dv,EDINBURGH,&nT,&nV); assert(nT == 0 && nV == 1); whatsThere(dv,MANCHESTER,&nT,&nV); assert(nT == 1 && nV == 0); assert(whereIs(dv,PLAYER_DRACULA) == MANCHESTER); giveMeTheTrail(dv,PLAYER_DRACULA,history); assert(history[0] == MANCHESTER); assert(history[1] == EDINBURGH); assert(history[2] == UNKNOWN_LOCATION); giveMeTheTrail(dv,PLAYER_MINA_HARKER,history); assert(history[0] == STRASBOURG); assert(history[1] == STRASBOURG); assert(history[2] == GENEVA); assert(history[3] == UNKNOWN_LOCATION); printf("passed\n"); disposeDracView(dv); //NEW SET printf("Test for connections\n"); int size, seen[NUM_MAP_LOCATIONS], *edges; printf("Checking Galatz road connections\n"); PlayerMessage messages5[] = {"Gone to Galatz"}; dv = newDracView("GGA....", messages5); edges = whereCanTheyGo(dv,&size,PLAYER_LORD_GODALMING,1,0,0); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i< size ; i++) seen[edges[i]] = 1; assert(size == 5); assert(seen[GALATZ]); assert(seen[CONSTANTA]); assert(seen[BUCHAREST]); assert(seen[KLAUSENBURG]); assert(seen[CASTLE_DRACULA]); free(edges); disposeDracView(dv); printf("Checking Ionian Sea sea connections\n"); PlayerMessage messages6[] = {"Sailing the Ionian"}; dv = newDracView("GIO....", messages6); edges = whereCanTheyGo(dv,&size,PLAYER_LORD_GODALMING,0,0,1); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i < size; i++) seen[edges[i]] = 1; assert(size == 7); assert(seen[IONIAN_SEA]); assert(seen[BLACK_SEA]); assert(seen[ADRIATIC_SEA]); assert(seen[TYRRHENIAN_SEA]); assert(seen[ATHENS]); assert(seen[VALONA]); assert(seen[SALONICA]); free(edges); disposeDracView(dv); printf("Checking Athens rail connections (none)\n"); PlayerMessage messages7[] = {"Leaving Athens by train"}; dv = newDracView("GAT....", messages7); edges = whereCanTheyGo(dv,&size,PLAYER_LORD_GODALMING,0,1,0); assert(size == 1); assert(edges[0] == ATHENS); free(edges); disposeDracView(dv); printf("passed\n"); //NEW SET printf("test for mature vampire (drac view)\n"); PlayerMessage messages8[] = {"im sorry i'm lazy", "copy paste is a great thing"}; dv= newDracView("GST.... SAO.... HCD.... MBO.... DLET... " //0 "GST.... SAO.... HCD.... MNA.... DPAT... " //1 "GST.... SAO.... HCD.... MCF.... DSTT... " //2 "GSTT... SAO.... HCD.... MGE.... DZUT... " //3 -2 LG "GST.... SAO.... HCD.... MZUTD.. DCDT... " //4 trap at castle dracula??? -10hp drac, -6hp mina harker, +2LG, + 10hp drac "GST.... SAO.... HCDTD.. MZU.... DGAT... " //5 + 3hp mina harker -6hp van helsing, -10 hp drac "GST.... SAO.... HGATD.. MZU.... DCNT.M. " //6 -6hp vh (van helsing dies), -10hp drac, +3 mina marker "GST.... SAO.... HSZ.... MMU.... DBS..M. " //7 -2hp dracula, helsing been in hospital "GST.... SAO.... HKL.... MZA.... DCDT.M. " //8 +10hp drac "GST.... SAO.... HKL.... MZA.... DCDT.M. " //9 +10hp drac "GST.... SAO.... HCDTTD. MZA.... DCDT.M. " //10 -8hp vn, drac is constant "GST.... SAO.... HGA.... MZA.... DKLT.M. " //11 +3hp vh "GST.... SAO.... HGA.... MZA.... DBE.VM. " //12 +3hp vh "GST.... SAO.... HGA.... MZA.... DSOT... " //13 +2hp vh "GST.... SAO.... HCDTTT. MZA.... DSJT.M. " //14 -6hp vh "GST.... SAO.... HCD.... MZA.... DVET.M. " //15 +3hp vh "GST.... SAO.... HCD.... MZA.... DZAT.M. " //16 +3hp vh "GMU.... SAO.... HCD.... MZA.... DVIT.M. " //17 "GVITD.. SAO.... HCD.... MZA.... DPRT... " //18 -6LG, -10 drac "GVI.... SAO.... HCD.... MZA.... DCDT.V.", messages8); //19 +3 LG //basically copied from testGameView... //making sure the basics of drac view works assert(giveMeTheRound(dv)==20); assert(giveMeTheScore(dv)==GAME_START_SCORE -20 -6 -13); assert(howHealthyIs(dv, PLAYER_LORD_GODALMING)==GAME_START_HUNTER_LIFE_POINTS-3); assert(howHealthyIs(dv, PLAYER_DR_SEWARD)==GAME_START_HUNTER_LIFE_POINTS); assert(howHealthyIs(dv, PLAYER_VAN_HELSING)==GAME_START_HUNTER_LIFE_POINTS); assert(howHealthyIs(dv, PLAYER_MINA_HARKER)==GAME_START_HUNTER_LIFE_POINTS); assert(whereIs(dv, PLAYER_LORD_GODALMING)==VIENNA); assert(whereIs(dv, PLAYER_DR_SEWARD)==ATLANTIC_OCEAN); assert(whereIs(dv, PLAYER_VAN_HELSING)==CASTLE_DRACULA); assert(whereIs(dv, PLAYER_MINA_HARKER)==ZAGREB); giveMeTheTrail(dv,PLAYER_DRACULA,history); assert(history[0] == CASTLE_DRACULA); assert(history[1] == PRAGUE); assert(history[2] == VIENNA); assert(history[3] == ZAGREB); assert(history[4] == VENICE); assert(history[5] == SARAJEVO); giveMeTheTrail(dv,PLAYER_LORD_GODALMING,history); assert(history[0] == VIENNA); assert(history[1] == VIENNA); assert(history[2] == MUNICH); assert(history[3] == STRASBOURG); giveMeTheTrail(dv,PLAYER_DR_SEWARD,history); assert(history[0] == ATLANTIC_OCEAN); assert(history[1] == ATLANTIC_OCEAN); assert(history[2] == ATLANTIC_OCEAN); assert(history[3] == ATLANTIC_OCEAN); assert(history[4] == ATLANTIC_OCEAN); assert(history[5] == ATLANTIC_OCEAN); //start and end are the same for all int start, end; lastMove(dv, PLAYER_LORD_GODALMING, &start, &end); assert(start==VIENNA && end==VIENNA); lastMove(dv, PLAYER_DR_SEWARD, &start, &end); assert(start==ATLANTIC_OCEAN && end==ATLANTIC_OCEAN); lastMove(dv, PLAYER_VAN_HELSING, &start, &end); assert(start==CASTLE_DRACULA && end==CASTLE_DRACULA); lastMove(dv, PLAYER_MINA_HARKER, &start, &end); assert(start==ZAGREB && end==ZAGREB); disposeDracView(dv); printf("passed\n"); //NEW SET printf("test more many traps\n"); PlayerMessage messages9[] = {"hey look!, something new..."}; dv= newDracView("GST.... SAO.... HCD.... MBO.... DLET... " "GCO.... SIR.... HGA.... MNA.... DD1T...",messages9 ); int nnT, nnV; whatsThere(dv,LE_HAVRE,&nnT,&nnV); assert(nnT == 2 && nnV == 0); assert(giveMeTheRound(dv)==2); assert(giveMeTheScore(dv)==GAME_START_SCORE -2); lastMove(dv, PLAYER_LORD_GODALMING, &start, &end); assert(start==STRASBOURG && end==COLOGNE); lastMove(dv, PLAYER_DR_SEWARD, &start, &end); assert(start==ATLANTIC_OCEAN && end==IRISH_SEA); lastMove(dv, PLAYER_VAN_HELSING, &start, &end); assert(start==CASTLE_DRACULA && end==GALATZ); lastMove(dv, PLAYER_MINA_HARKER, &start, &end); assert(start==BORDEAUX && end==NANTES); //more basics giveMeTheTrail(dv,PLAYER_LORD_GODALMING,history); assert(history[0] == COLOGNE); assert(history[1] == STRASBOURG); assert(history[2] == UNKNOWN_LOCATION); giveMeTheTrail(dv,PLAYER_DR_SEWARD,history); assert(history[0] == IRISH_SEA); assert(history[1] == ATLANTIC_OCEAN); assert(history[2] == UNKNOWN_LOCATION); giveMeTheTrail(dv,PLAYER_VAN_HELSING,history); assert(history[0] == GALATZ); assert(history[1] == CASTLE_DRACULA); assert(history[2] == UNKNOWN_LOCATION); giveMeTheTrail(dv,PLAYER_MINA_HARKER,history); assert(history[0] == NANTES); assert(history[1] == BORDEAUX); assert(history[2] == UNKNOWN_LOCATION); assert(history[3] == UNKNOWN_LOCATION); assert(history[4] == UNKNOWN_LOCATION); assert(history[5] == UNKNOWN_LOCATION); disposeDracView(dv); printf("passed\n"); //NEW SET printf("test for dracula paths (where can i go)\n"); //int size, seen[NUM_MAP_LOCATIONS], *edges; -->declared at top PlayerMessage messages10[] = {"going from le havre"}; dv= newDracView("GST.... SAO.... HCD.... MBO.... DLET...", messages10); printf("Checking Le Havre Road connections\n"); edges = whereCanIgo(dv, &size, 1,0); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i< size ; i++) seen[edges[i]] = 1; assert(size==4); assert(seen[LE_HAVRE]); assert(seen[NANTES]); assert(seen[PARIS]); assert(seen[BRUSSELS]); free(edges); printf("Checking Le Havre boat connections\n"); edges = whereCanIgo(dv, &size, 0,1); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i< size ; i++) seen[edges[i]] = 1; assert(size==2); //only one boat assert(seen[LE_HAVRE]); assert(seen[ENGLISH_CHANNEL]); free(edges); disposeDracView(dv); PlayerMessage messages11[] = {"going from bucharest"}; dv= newDracView("GST.... SAO.... HCD.... MBO.... DBCT...", messages11); printf("Checking bucharest road connections\n"); edges = whereCanIgo(dv, &size, 1,0); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i< size ; i++) seen[edges[i]] = 1; assert(size==6); assert(seen[BUCHAREST]); assert(seen[BELGRADE]); assert(seen[CONSTANTA]); assert(seen[GALATZ]); assert(seen[KLAUSENBURG]); assert(seen[SOFIA]); free(edges); disposeDracView(dv); PlayerMessage messages12[] = {"going from galway"}; dv= newDracView("GST.... SAO.... HCD.... MBO.... DGWT...", messages12); printf("Checking galway road AND boat connections\n"); edges = whereCanIgo(dv, &size, 1,1); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i< size ; i++) seen[edges[i]] = 1; assert(size==3); assert(seen[GALWAY]); assert(seen[DUBLIN]); assert(seen[ATLANTIC_OCEAN]); free(edges); disposeDracView(dv); PlayerMessage messages13[] = {"going from cologne"}; dv= newDracView("GST.... SAO.... HCD.... MBO.... DCOT...", messages13); printf("Checking cologne boat connections (none)\n"); edges = whereCanIgo(dv, &size, 0,1); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i< size ; i++) seen[edges[i]] = 1; assert(size==1); assert(seen[COLOGNE]); free(edges); disposeDracView(dv); printf("passed\n"); //NEW SET printf("test for double back in train when seeing where dracula goes \n"); PlayerMessage messages14[] = {"going from cologne","to cologne lol"}; dv= newDracView("GST.... SAO.... HCD.... MBO.... DCOT... " "GST.... SAO.... HCD.... MBO.... DD1T...", messages14); edges = whereCanIgo(dv, &size, 0,1); //cannot have another double back so cannot stay in cologne via boat assert(size==1); //cant hide at sea free(edges); edges = whereCanIgo(dv, &size, 1,0); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i< size ; i++) seen[edges[i]] = 1; assert(size==7); assert(seen[COLOGNE]); //can hide in city again assert(seen[AMSTERDAM]); assert(seen[BRUSSELS]); assert(seen[FRANKFURT]); assert(seen[HAMBURG]); assert(seen[LEIPZIG]); assert(seen[STRASBOURG]); free(edges); disposeDracView(dv); printf("passed\n"); //NEW SET printf("check for hide AND double back\n"); dv= newDracView("GST.... SAO.... HCD.... MBO.... DCOT... " "GST.... SAO.... HCD.... MBO.... DD1T... " "GST.... SAO.... HCD.... MBO.... DHI....", messages14); edges = whereCanIgo(dv, &size, 0,1); //cannot have another double back so cannot stay in cologne via boat assert(size==0); //cant hide at sea free(edges); edges = whereCanIgo(dv, &size, 1,0); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i< size ; i++) seen[edges[i]] = 1; assert(size==6); assert(seen[AMSTERDAM]); assert(seen[BRUSSELS]); assert(seen[FRANKFURT]); assert(seen[HAMBURG]); assert(seen[LEIPZIG]); assert(seen[STRASBOURG]); free(edges); disposeDracView(dv); printf("passed\n"); return 0; }
LocationID goToDrac(HunterView gameState, int myLocation, Round roundNum, PlayerID hunter){ int size, *goToArr; goToArr = whereCanIgo(gameState, &size, 1, 0, 0); printf("Size is %d\n", size); LocationID dracTrail[TRAIL_SIZE]; giveMeTheTrail(gameState, PLAYER_DRACULA, dracTrail); LocationID myTrail[TRAIL_SIZE]; giveMeTheTrail(gameState, hunter, myTrail); int i = 0; LocationID trailValue = NOWHERE; while(trailValue == NOWHERE && i < TRAIL_SIZE){ if(dracTrail[i] == HIDE && dracTrail[i+1] != CITY_UNKNOWN && dracTrail[i+1] != SEA_UNKNOWN){ if((i+1) < TRAIL_SIZE) trailValue = dracTrail[i+1]; }else if(dracTrail[i] >= DOUBLE_BACK_1 && dracTrail[i] <= DOUBLE_BACK_5){ int k = dracTrail[i] - DOUBLE_BACK_1 + 1 + i; if(dracTrail[k]!= CITY_UNKNOWN && dracTrail[k] != SEA_UNKNOWN && k < TRAIL_SIZE) trailValue = dracTrail[k]; }else if(dracTrail[i] != CITY_UNKNOWN && dracTrail[i] != SEA_UNKNOWN){ trailValue = dracTrail[i]; } i++; } while(i > 0 && trailValue != NOWHERE){ if(trailValue == myTrail[i] && trailValue != dracTrail[0]) trailValue = NOWHERE; i--; } LocationID goToID = NOWHERE; if(trailValue == dracTrail[0] && trailValue == myLocation){ goToID = myLocation; printf("Drac is here, I'm staying here"); } else if(trailValue != NOWHERE && trailValue != myLocation){ printf("Looking For Drac near me, drac is near %s\n", idToAbbrev(trailValue)); treeBase *B = newTree(gameState, whoAmI(gameState),goToArr,size); goToID = searchTree(B, trailValue); freeTree(B); if(goToID != NOWHERE) printf("Heading Towards Drac. Move: %s -> %s\n", idToAbbrev(myLocation), idToAbbrev(goToID)); }else if(trailValue == NOWHERE && (roundNum+1)%RESEARCH_ROUND == 0 && hunter != PLAYER_LORD_GODALMING){ goToID = myLocation; printf("Lets do research"); } int loopCount = 0; int choice = -1; while(goToID == NOWHERE){ choice = rand() % size; goToID = goToArr[choice]; printf("-- random choice is: %d. Move: %s -> %s\n", choice, idToAbbrev(myLocation), idToAbbrev(goToID)); i = 0; while(i<TRAIL_SIZE){ if((goToID == myTrail[i] && loopCount < (size*2)) || goToID == CASTLE_DRACULA) goToID = NOWHERE; i++; } loopCount++; } free(goToArr); return goToID; }
LocationID bruteForce(DracView currentView, Map g){ int distance[4]; int connections[50]; int *numLocations; int k = 50; int *array; int trail[6]; dracViewPrint (currentView); giveMeTheTrail(currentView, PLAYER_LORD_GODALMING, trail); numLocations = &k; int i = 0; int j = 0; int l = 0; int tempDistance = 0; int compareDistance = 0; LocationID nextMove = -1; int isLegalMove = 1; //Required for brute force int path[20]; int trans[20]; //Finds where Dracula is LocationID dracula = whereIs(currentView, PLAYER_DRACULA); LocationID hunter1 = whereIs(currentView, PLAYER_LORD_GODALMING); //Sets all of the values in connections to -1 for (i = 0; i <= 50; i++) connections[i] = -1; //Finds the distance between Dracula and all of the other hunters //proximity(distance, currentView, dracula); We'll use this later not for now compareDistance = 50; //Set an arbitarily big enough number for compareDistance //Where can Dracula travel by road array = whereCanIgo(currentView, numLocations, 1, 0); for (l = 0; l < 50; l++) { connections [l] = array[l]; } i = 0; if(connections[0] != -1){ while(connections[i] != -1){ //Finds the shortest distance and then puts it on. tempDistance = shortestPath(g, connections[i], hunter1, path, trans); if(compareDistance > tempDistance){ for(j = 0; j <= 5; j++){ if (trail[j] == connections[i]) { isLegalMove = 0; } } if(isLegalMove == 1){//If its a legal move change the following. compareDistance = tempDistance; nextMove = connections[i]; } else { isLegalMove = 1; // Resets the isLegalMove flag } } i++; } } return nextMove; }
int main() { int i; DracView dv; printf("Test for basic functions, just before Dracula's first move\n"); PlayerMessage messages1[] = {"Hello","Rubbish","Stuff",""}; dv = newDracView("GST.... SAO.... HZU.... MBB....", messages1); assert(giveMeTheRound(dv) == 0); assert(whereIs(dv,PLAYER_LORD_GODALMING) == STRASBOURG); assert(whereIs(dv,PLAYER_DR_SEWARD) == ATLANTIC_OCEAN); assert(whereIs(dv,PLAYER_VAN_HELSING) == ZURICH); assert(whereIs(dv,PLAYER_MINA_HARKER) == BAY_OF_BISCAY); assert(whereIs(dv,PLAYER_DRACULA) == UNKNOWN_LOCATION); assert(howHealthyIs(dv,PLAYER_DRACULA) == GAME_START_BLOOD_POINTS); printf("passed\n"); disposeDracView(dv); printf("Test for encountering Dracula and hunter history\n"); PlayerMessage messages2[] = {"Hello","Rubbish","Stuff","","Mwahahah","Aha!","","",""}; dv = newDracView("GST.... SAO.... HCD.... MAO.... DGE.... " "GGED... SAO.... HCD.... MAO....", messages2); assert(giveMeTheRound(dv) == 1); assert(whereIs(dv,PLAYER_DRACULA) == GENEVA); assert(howHealthyIs(dv,PLAYER_LORD_GODALMING) == 5); assert(howHealthyIs(dv,PLAYER_DRACULA) == 30); assert(whereIs(dv,PLAYER_LORD_GODALMING) == GENEVA); LocationID history[TRAIL_SIZE]; giveMeTheTrail(dv,PLAYER_DRACULA,history); assert(history[0] == GENEVA); assert(history[2] == UNKNOWN_LOCATION); giveMeTheTrail(dv,PLAYER_LORD_GODALMING,history); assert(history[0] == GENEVA); assert(history[1] == STRASBOURG); assert(history[2] == UNKNOWN_LOCATION); giveMeTheTrail(dv,PLAYER_DR_SEWARD,history); assert(history[0] == ATLANTIC_OCEAN); assert(history[1] == ATLANTIC_OCEAN); assert(history[2] == UNKNOWN_LOCATION); printf("passed\n"); disposeDracView(dv); printf("Test for Dracula leaving minions\n"); PlayerMessage messages3[] = {"Hello","Rubbish","Stuff","","Mwahahah","Aha!","","","","Drop a V","Party in Strasbourg","Party","Party","Party"}; dv = newDracView("GGE.... SGE.... HGE.... MGE.... DED.V.. " "GST.... SST.... HST.... MST.... DMNT... " "GST.... SST.... HST.... MST....", messages3); int nT, nV; whatsThere(dv,EDINBURGH,&nT,&nV); assert(nT == 0 && nV == 1); whatsThere(dv,MANCHESTER,&nT,&nV); assert(nT == 1 && nV == 0); assert(whereIs(dv,PLAYER_DRACULA) == MANCHESTER); giveMeTheTrail(dv,PLAYER_DRACULA,history); assert(history[0] == MANCHESTER); assert(history[1] == EDINBURGH); assert(history[2] == UNKNOWN_LOCATION); giveMeTheTrail(dv,PLAYER_MINA_HARKER,history); assert(history[0] == STRASBOURG); assert(history[1] == STRASBOURG); assert(history[2] == GENEVA); assert(history[3] == UNKNOWN_LOCATION); printf("passed\n"); disposeDracView(dv); // needs further work - double back 2 not working dv = newDracView("GGE.... SGE.... HGE.... MGE.... DED.V.. " "GST.... SST.... HST.... MST.... DHIT... " "GST.... SST.... HST.... MST.... DMNT... " "GST.... SST.... HST.... MST.... DD2T...", messages3); whatsThere(dv,EDINBURGH,&nT,&nV); assert(nV == 1); whatsThere(dv, MANCHESTER, &nT, &nV); assert(nT == 1 && nV == 0); whatsThere(dv,EDINBURGH,&nT,&nV); assert(nT == 2 && nV == 1); dv = newDracView("GGE.... SGE.... HGE.... MGE.... DED.V.. " "GST.... SST.... HST.... MST.... DHIT... " "GST.... SST.... HST.... MST.... DMNT... " "GST.... SST.... HST.... MST.... DD1T...", messages3); whatsThere(dv,EDINBURGH,&nT,&nV); assert(nV == 1); whatsThere(dv, MANCHESTER, &nT, &nV); assert(nT == 2 && nV == 0); whatsThere(dv,EDINBURGH,&nT,&nV); assert(nT == 1 && nV == 1); dv = newDracView("GGE.... SGE.... HGE.... MGE.... DED.V.. " "GST.... SST.... HST.... MST.... DHIT... " "GST.... SST.... HST.... MST.... DMNT... " "GST.... SST.... HST.... MST.... DD3T...", messages3); whatsThere(dv,EDINBURGH,&nT,&nV); assert(nV == 1); whatsThere(dv, MANCHESTER, &nT, &nV); assert(nT == 1 && nV == 0); whatsThere(dv,EDINBURGH,&nT,&nV); assert(nT == 2 && nV == 1); printf("Our test right here\n"); dv = newDracView("GGE.... SGE.... HGE.... MGE.... DED.V.. " "GST.... SST.... HST.... MST.... DHIT... " "GST.... SST.... HST.... MST.... DMNT... " "GGE.... SGE.... HGE.... MGE.... DLVT... " "GST.... SST.... HST.... MST.... DD3T...", messages3); printf("called the funciton\n"); whatsThere(dv,EDINBURGH,&nT,&nV); assert(nV == 1); printf("up to first ed\n"); whatsThere(dv, MANCHESTER, &nT, &nV); assert(nT == 1 && nV == 0); whatsThere(dv, LIVERPOOL, &nT, &nV); assert(nT == 1 && nV == 0); whatsThere(dv,EDINBURGH,&nT,&nV); assert(nT == 2 && nV == 1); printf("passed our tests\n"); //------------------------- // Visual inspection required! printf("\nConn. locs. tests. Eyeball for authenticity:\n"); dv = newDracView("GGE.... SGE.... HGE.... MGE.... DED.V.. " "GST.... SST.... HST.... MST.... DMNT... " "GST.... SST.... HST.... MST.... DLOT...", messages3); int numlocations; LocationID *locations = whereCanIgo(dv, &numlocations, TRUE, FALSE); for (int i = numlocations-1; i >= 0; i--) { printf("Location is %d, aka %s\n", locations[i], idToName(locations[i])); } dv = newDracView("GGE.... SGE.... HGE.... MGE.... DED.V.. " "GST.... SST.... HST.... MST.... DMNT... " "GST.... SST.... HST.... MST.... DD2T...", messages3); locations = whereCanIgo(dv, &numlocations, TRUE, FALSE); for (int i = numlocations-1; i >= 0; i--) { printf("Location is %d, aka %s\n", locations[i], idToName(locations[i])); } dv = newDracView("GST.... SST.... HST.... MST.... DMNT... " "GST.... SST.... HST.... MST.... DLOT... " "GST.... SST.... HST.... MST.... DD2T... " "GST.... SST.... HST.... MST.... DHIT... " "GST.... SST.... HST.... MST....", messages3); locations = whereCanIgo(dv, &numlocations, TRUE, FALSE); for (int i = numlocations-1; i >= 0; i--) { printf("Location is %d, aka %s\n", locations[i], idToName(locations[i])); } printf("last devious test\n"); dv = newDracView("GST.... SST.... HST.... MST.... DPRT... " "GST.... SST.... HST.... MST.... DBRT... " "GST.... SST.... HST.... MST.... DHAT... " "GST.... SST.... HST.... MST.... DCOT... " "GST.... SST.... HST.... MST.... DAMT... " "GST.... SST.... HST.... MST.... DD3T... " "GST.... SST.... HST.... MST.... DHIT... " "GST.... SST.... HST.... MST....", messages3); locations = whereCanIgo(dv, &numlocations, TRUE, FALSE); for (int i = numlocations-1; i >= 0; i--) { printf("Location is %d, aka %s\n", locations[i], idToName(locations[i])); } printf("passed tricky conn. locs. tests\n"); //------------------------- printf("Test for connections\n"); int size, seen[NUM_MAP_LOCATIONS], *edges; printf("Checking Galatz road connections\n"); PlayerMessage messages5[] = {"Gone to Galatz"}; dv = newDracView("GGA....", messages5); edges = whereCanTheyGo(dv,&size,PLAYER_LORD_GODALMING,1,0,0); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i< size ; i++) seen[edges[i]] = 1; assert(size == 5); assert(seen[GALATZ]); assert(seen[CONSTANTA]); assert(seen[BUCHAREST]); assert(seen[KLAUSENBURG]); assert(seen[CASTLE_DRACULA]); free(edges); disposeDracView(dv); printf("Checking Ionian Sea sea connections\n"); PlayerMessage messages6[] = {"Sailing the Ionian"}; dv = newDracView("GIO....", messages6); edges = whereCanTheyGo(dv,&size,PLAYER_LORD_GODALMING,0,0,1); memset(seen, 0, NUM_MAP_LOCATIONS*sizeof(int)); for (i = 0; i < size; i++) seen[edges[i]] = 1; assert(size == 7); assert(seen[IONIAN_SEA]); assert(seen[BLACK_SEA]); assert(seen[ADRIATIC_SEA]); assert(seen[TYRRHENIAN_SEA]); assert(seen[ATHENS]); assert(seen[VALONA]); assert(seen[SALONICA]); free(edges); disposeDracView(dv); printf("Checking Athens rail connections (none)\n"); PlayerMessage messages7[] = {"Leaving Athens by train"}; dv = newDracView("GAT....", messages7); edges = whereCanTheyGo(dv,&size,PLAYER_LORD_GODALMING,0,1,0); assert(size == 1); assert(edges[0] == ATHENS); free(edges); disposeDracView(dv); printf("passed\n"); // Test whatsThere () printf("Test whatsThere ()\n"); PlayerMessage messages685[] = {"Hello","Rubbish","Stuff",""}; dv = newDracView("GST.... SAO.... HZU.... MBB....", messages685); assert(giveMeTheRound(dv) == 0); assert(whereIs(dv,PLAYER_LORD_GODALMING) == STRASBOURG); assert(whereIs(dv,PLAYER_DR_SEWARD) == ATLANTIC_OCEAN); assert(whereIs(dv,PLAYER_VAN_HELSING) == ZURICH); assert(whereIs(dv,PLAYER_MINA_HARKER) == BAY_OF_BISCAY); assert(whereIs(dv,PLAYER_DRACULA) == UNKNOWN_LOCATION); assert(howHealthyIs(dv,PLAYER_DRACULA) == GAME_START_BLOOD_POINTS); printf("passed\n"); disposeDracView(dv); // EXTRA TEST 1 printf("extra test 1\n"); PlayerMessage messages9[] = {"Hello","Rubbish","Stuff",""}; dv = newDracView("GVI.... SZU.... HBB.... MSO....", messages9); assert(whereIs(dv, PLAYER_LORD_GODALMING) == VIENNA); assert(whereIs(dv, PLAYER_DR_SEWARD) == ZURICH); assert(whereIs(dv, PLAYER_VAN_HELSING) == BAY_OF_BISCAY); assert(whereIs(dv, PLAYER_MINA_HARKER) == SOFIA); assert(whereIs(dv, PLAYER_DRACULA) == UNKNOWN_LOCATION); assert(howHealthyIs(dv,PLAYER_DRACULA) == GAME_START_BLOOD_POINTS); disposeDracView(dv); printf("passed extra1!\n"); // EXTRA TEST 2 - test putting traps twice printf("extra test 2\n"); PlayerMessage messages10[] = {"Drop","party","at","Varrock"}; dv = newDracView("GHA.... SMA.... HVR.... MBI.... DSZ.V.. " "GCO.... SSR.... HSO.... MNP.... DZAT... " "GFR.... STO.... HBE.... MRO....", messages10); assert(giveMeTheRound(dv) == 2); assert((giveMeTheScore(dv)) == (GAME_START_SCORE - (SCORE_LOSS_DRACULA_TURN*giveMeTheRound(dv)))); assert(whereIs(dv, PLAYER_LORD_GODALMING) == FRANKFURT); assert(whereIs(dv, PLAYER_DR_SEWARD) == TOULOUSE); assert(whereIs(dv, PLAYER_VAN_HELSING) == BELGRADE); assert(whereIs(dv, PLAYER_MINA_HARKER) == ROME); assert(whereIs(dv, PLAYER_DRACULA) == ZAGREB); int numOfTraps, numOfVamps; whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); assert(numOfTraps == 0 && numOfVamps == 1); whatsThere(dv,ZAGREB,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); // whatsThere(dv,VIENNA,&numOfTraps,&numOfVamps); // assert(numOfTraps == 1 && numOfVamps == 0); assert(howHealthyIs(dv,PLAYER_DRACULA) == GAME_START_BLOOD_POINTS); disposeDracView(dv); printf("passed extra2!\n"); // EXTRA TEST 3 - deleting traps once trail has passed printf("extra test 3!\n"); PlayerMessage messages11[] = {"Drop","party","at","Varrock"}; dv = newDracView("GHA.... SMA.... HVR.... MBI.... DSZT... " "GCO.... SSR.... HSO.... MNP.... DZAT... " "GFR.... STO.... HBE.... MRO.... DVIT... " "GCO.... SSR.... HSO.... MNP.... DPRT... " "GHA.... SMA.... HVR.... MBI.... DNUT... " "GFR.... STO.... HBE.... MRO.... DSTT... " "GHA.... SMA.... HVR.... MBI.... DPAT.M. " "GHA.... SMA.... HVR.... MBI.... ", messages11); assert(giveMeTheRound(dv) == 7); assert((giveMeTheScore(dv)) == (GAME_START_SCORE - (SCORE_LOSS_DRACULA_TURN*giveMeTheRound(dv)))); assert(whereIs(dv, PLAYER_LORD_GODALMING) == HAMBURG); assert(whereIs(dv, PLAYER_DR_SEWARD) == MADRID); assert(whereIs(dv, PLAYER_VAN_HELSING) == VARNA); assert(whereIs(dv, PLAYER_MINA_HARKER) == BARI); assert(whereIs(dv, PLAYER_DRACULA) == PARIS); LocationID dracTrail[6] = {0}; giveMeTheTrail(dv, PLAYER_DRACULA, dracTrail); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); // since traps are destroyed after every 6 moves in the trail assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,VIENNA,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PRAGUE,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,NUREMBURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,STRASBOURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PARIS,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); disposeDracView(dv); printf("passed extra3!\n"); printf("extra test 3!\n"); dv = newDracView("GHA.... SMA.... HVR.... MBI.... DSZT... " "GCO.... SSR.... HSO.... MNP.... DZAT... " "GFR.... STO.... HBE.... MRO.... DVIT... " "GCO.... SSR.... HSO.... MNP.... DPRT... " "GHA.... SMA.... HVR.... MBI.... DNUT... " "GFR.... STO.... HBE.... MRO.... DSTT... " "GHA.... SMA.... HVR.... MBI.... DPAT.M. " "GHA.... SMA.... HVR.... MBI.... ", messages11); assert(giveMeTheRound(dv) == 7); assert((giveMeTheScore(dv)) == (GAME_START_SCORE - (SCORE_LOSS_DRACULA_TURN*giveMeTheRound(dv)))); assert(whereIs(dv, PLAYER_LORD_GODALMING) == HAMBURG); assert(whereIs(dv, PLAYER_DR_SEWARD) == MADRID); assert(whereIs(dv, PLAYER_VAN_HELSING) == VARNA); assert(whereIs(dv, PLAYER_MINA_HARKER) == BARI); assert(whereIs(dv, PLAYER_DRACULA) == PARIS); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); // since traps are destroyed after every 6 moves in the trail assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,VIENNA,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PRAGUE,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,NUREMBURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,STRASBOURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PARIS,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); disposeDracView(dv); printf("passed extra3!\n"); printf("extra test 4!\n"); dv = newDracView("GHA.... SMA.... HVR.... MBI.... DSZ.V.. " "GCO.... SSR.... HSO.... MNP.... DZAT... " "GFR.... STO.... HBE.... MRO.... DVIT... " "GCO.... SSR.... HSO.... MNP.... DPRT... " "GHA.... SMA.... HVR.... MBI.... DNUT... " "GFR.... STO.... HBE.... MRO.... DSTT... " "GHA.... SMA.... HVR.... MBI.... DPAT.V. " "GHA.... SMA.... HVR.... MBI.... ", messages11); assert(giveMeTheRound(dv) == 7); assert((giveMeTheScore(dv)) == (GAME_START_SCORE - (SCORE_LOSS_DRACULA_TURN*giveMeTheRound(dv)) - SCORE_LOSS_VAMPIRE_MATURES)); assert(whereIs(dv, PLAYER_LORD_GODALMING) == HAMBURG); assert(whereIs(dv, PLAYER_DR_SEWARD) == MADRID); assert(whereIs(dv, PLAYER_VAN_HELSING) == VARNA); assert(whereIs(dv, PLAYER_MINA_HARKER) == BARI); assert(whereIs(dv, PLAYER_DRACULA) == PARIS); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); // since traps are destroyed after every 6 moves in the trail assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,VIENNA,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PRAGUE,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,NUREMBURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,STRASBOURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PARIS,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); disposeDracView(dv); printf("passed extra4!\n"); printf("extra test 5!\n"); dv = newDracView("GHA.... SMA.... HVR.... MBI.... DSZ.V.. " "GCO.... SSR.... HSO.... MNP.... DZAT... " "GFR.... STO.... HBE.... MRO.... DVIT... " "GCO.... SSR.... HSO.... MNP.... DPRT... " "GHA.... SMA.... HVR.... MBI.... DNU.V.. " "GFR.... STO.... HBE.... MRO.... DSTT... " "GHA.... SMA.... HVR.... MBI.... DPAT.V. " "GHA.... SMA.... HVR.... MBI.... ", messages11); assert(giveMeTheRound(dv) == 7); assert((giveMeTheScore(dv)) == (GAME_START_SCORE - (SCORE_LOSS_DRACULA_TURN*giveMeTheRound(dv)) - SCORE_LOSS_VAMPIRE_MATURES)); assert(whereIs(dv, PLAYER_LORD_GODALMING) == HAMBURG); assert(whereIs(dv, PLAYER_DR_SEWARD) == MADRID); assert(whereIs(dv, PLAYER_VAN_HELSING) == VARNA); assert(whereIs(dv, PLAYER_MINA_HARKER) == BARI); assert(whereIs(dv, PLAYER_DRACULA) == PARIS); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); // since traps are destroyed after every 6 moves in the trail assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,VIENNA,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PRAGUE,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,NUREMBURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 0 && numOfVamps == 1); whatsThere(dv,STRASBOURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PARIS,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); disposeDracView(dv); printf("passed extra5!\n"); printf("extra test 6!\n"); dv = newDracView("GHA.... SMA.... HVR.... MBI.... DSZ.V.. " "GCO.... SSR.... HSO.... MNP.... DZAT... " "GFR.... STO.... HBE.... MRO.... DVIT... " "GCO.... SSR.... HSO.... MNP.... DPRT... " "GHA.... SMA.... HVR.... MBI.... DNU.V.. " "GFR.... SNUV... HBE.... MRO.... DSTT... " "GHA.... SMA.... HVR.... MBI.... DPAT.V. " "GHA.... SMA.... HVR.... MBI.... ", messages11); assert(giveMeTheRound(dv) == 7); assert((giveMeTheScore(dv)) == (GAME_START_SCORE - (SCORE_LOSS_DRACULA_TURN*giveMeTheRound(dv)) - SCORE_LOSS_VAMPIRE_MATURES)); assert(whereIs(dv, PLAYER_LORD_GODALMING) == HAMBURG); assert(whereIs(dv, PLAYER_DR_SEWARD) == MADRID); assert(whereIs(dv, PLAYER_VAN_HELSING) == VARNA); assert(whereIs(dv, PLAYER_MINA_HARKER) == BARI); assert(whereIs(dv, PLAYER_DRACULA) == PARIS); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); // since traps are destroyed after every 6 moves in the trail assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,VIENNA,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PRAGUE,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,NUREMBURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,STRASBOURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PARIS,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); disposeDracView(dv); printf("passed extra6!\n"); printf("extra test 7!\n"); dv = newDracView("GHA.... SMA.... HVR.... MBI.... DSZ.V.. " "GCO.... SSR.... HSO.... MNP.... DZAT... " "GFR.... STO.... HBE.... MRO.... DVIT... " "GCO.... SSR.... HSO.... MNP.... DPRT... " "GHA.... SMA.... HVR.... MBI.... DNU.V.. " "GFR.... SNUV... HSZV... MRO.... DSTT... " "GHA.... SMA.... HVR.... MBI.... DPAT... " "GHA.... SMA.... HVR.... MBI.... ", messages11); assert(giveMeTheRound(dv) == 7); assert((giveMeTheScore(dv)) == (GAME_START_SCORE - (SCORE_LOSS_DRACULA_TURN*giveMeTheRound(dv)))); assert(whereIs(dv, PLAYER_LORD_GODALMING) == HAMBURG); assert(whereIs(dv, PLAYER_DR_SEWARD) == MADRID); assert(whereIs(dv, PLAYER_VAN_HELSING) == VARNA); assert(whereIs(dv, PLAYER_MINA_HARKER) == BARI); assert(whereIs(dv, PLAYER_DRACULA) == PARIS); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,SZEGED,&numOfTraps,&numOfVamps); // since traps are destroyed after every 6 moves in the trail assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,VIENNA,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PRAGUE,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,NUREMBURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 0 && numOfVamps == 0); whatsThere(dv,STRASBOURG,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); whatsThere(dv,PARIS,&numOfTraps,&numOfVamps); assert(numOfTraps == 1 && numOfVamps == 0); disposeDracView(dv); printf("passed extra7!\n"); return 0; }
void decideHunterMove(HunterView gameState) { //printf("------------------------------------------"); int playerID = whoAmI(gameState); if(howHealthyIs(gameState,playerID)==0){ registerBestPlay("JM","Dead"); }else if(playerID == 0){ int round = giveMeTheRound(gameState); LocationID trail[TRAIL_SIZE]; giveMeTheTrail(gameState, whoAmI(gameState), trail); int dead = 0; int i; for(i=0; i<3; i++){ if(trail[i] == nameToID("JM")) dead = i; fprintf(stderr, "Dead%d\n",dead); } if(dead){ if(round%2==0){ registerBestPlay("KL","Camping 1"); }else if(round%2==1){ registerBestPlay("BC","Camping 2"); } }else{ if(dead == 0){ registerBestPlay("SZ","Recovery 1"); }else if(dead == 1){ registerBestPlay("KL","Recovery 2"); }else{ registerBestPlay("KL","Recovery 3"); } } }else{ fprintf(stderr, "\n\nHunters\n"); srand((unsigned) time(NULL)); if(giveMeTheRound(gameState) == 0){ registerBestPlay("MU","Let the games Begin"); }else{ int numLocations = 0; int *places; char message[15]; int i; fprintf(stderr,"huntFrom:%s\n",idToName(whereIs(gameState, playerID))); fprintf(stderr, "\n\n\n"); places = whereCanIgo(gameState, &numLocations, 1, 1, 0); fprintf(stderr, "Free\nnumLoc:%d\n", numLocations); for(i=0; i<numLocations; i++){ fprintf(stderr, "%s,",idToName(places[i])); } srand(time(NULL)); registerBestPlay(idToAbbrev(places[rand()%numLocations]),message); //if(places[0]) // printf("a"); sprintf(message, "\n\n"); //registerBestPlay("MU",""); } } //printf("\n\n\n\n"); //egisterBestPlay("GE","I'm on holiday in Geneva"); }
void decideDraculaMove(DracView gameState) { int round = giveMeTheRound(gameState); if (round == 0) { registerBestPlay("GA",""); } else if (round == 1){ registerBestPlay("CD",""); } else if (round == 2){ registerBestPlay("KL",""); } else if (round == 3){ registerBestPlay("D1",""); } else if (round == 4){ registerBestPlay("HI",""); } else if (round == 5){ registerBestPlay("TP",""); } else if (round == 6){ registerBestPlay("TP",""); } else { // Populate dracTrail with last 6 moves made int *dracTrail = calloc(sizeof(int),6); giveMeTheTrail(gameState, 4, dracTrail); // === PREDETERMINE HIDE AND DOUBLE BACK === // Determine if hide has been used in trail. // Returns HIDING = 0 if you can't hide, and 1 if you can. int hideCount = 0; int HIDING = 0; int reference0 = 0; while(hideCount < 6){ if(dracTrail[hideCount] == 102){ hideCount++; reference0++; } else hideCount++; } if (reference0 == 0) HIDING = 1; // Can't hide at sea if (idToType(whereIs(gameState,4)) == SEA) { printf("At sea\n"); HIDING = 0; } // Determine if double back has been used in trail. // Returns BACK = 0 if you can't hide, and 1 if you can. int backCount = 0; int BACK = 0; int reference1 = 0; while(backCount < 6){ if(dracTrail[backCount] == 103){ backCount++; reference1++; } else backCount++; } if (reference1 == 0) BACK = 1; // === FIND LEGAL CONNECTED LAND AND WATER CONNECTIONS === // // == BASIC MOVES == // // = LAND = // // Populate landArray with possible connected LAND // locations from current location int numLocations; int *landArray = whereCanIgo(gameState,&numLocations,1, 0); int landLength = numLocations; // Works out if we have already gone through a location in our // trail. // Each location in dracTrail is compared to every // location in landArray. // If they're the same, that entry in landArray is changed // to -1, meaning we cannot move there, and landLength shortened. int count = 0; int x = 0; while(x < numLocations){ while(count < 6){ if(dracTrail[count] == landArray[x]){ landArray[x] = -1; count = 8; landLength--; }else count++; } x++; count = 0; } // Make array as big as possible LAND moves for us is. int *landMoves = calloc(sizeof(int),landLength); // Little loop to transfer possible LAND moves into the new array int a = 0; int b = 0; while(a < numLocations){ if(landArray[a] != -1){ landMoves[b] = landArray[a]; a++; b++; } else a++; } printf("%d land length\n", landLength); // Register first available move (just for safety) registerBestPlay(idToAbbrev(landMoves[0]),"1"); // = WATER = // // Populate waterArray with possible connected WATER // locations from current location int waterLocations; int *waterArray = whereCanIgo(gameState,&waterLocations,0,1); int waterLength = waterLocations; // Works out if we have already gone through a location in our // trail. // Each location in dracTrail is compared to every // location in waterArray. // If they're the same, that entry in waterArray is changed // to -1, meaning we cannot move there, and waterLength shortened. count = 0; x = 0; while(x < waterLocations){ while(count < 6){ if(dracTrail[count] == waterArray[x]){ waterArray[x] = -1; count = 8; waterLength--; } else count++; } x++; count = 0; } // Make array as big as possible WATER moves for us is. int *waterMoves = calloc(sizeof(int),waterLength); // Little loop to transfer possible WATER moves into the new array a = 0; b = 0; while(a < waterLocations){ if(waterArray[a] != -1){ waterMoves[b] = waterArray[a]; a++; b++; } else a++; } // = REGISTER BASIC MOVE = // // Register first available move (just for safety) registerBestPlay(idToAbbrev(landMoves[0]),"1"); // Check if no LAND move has been registered. If it hasn't, register // basic water move. if (landLength == 0) registerBestPlay(idToAbbrev(waterMoves[0]),"2"); // Check if no basic LAND or WATER move has been registered. If not, // hide OR double back. if ((landLength == 0) && (waterLength == 0)) { if (HIDING == 1) { registerBestPlay("HI","3"); } else if ((HIDING == 0) && (BACK == 1)) { registerBestPlay("D1","4"); } else registerBestPlay("TP", "5"); } // == COMPLEX MOVES == // // Populate the hunter arrays with the possible moves that they can make // - both LAND and WATER int *hunter0Moves; int *hunter1Moves; int *hunter2Moves; int *hunter3Moves; int hunter0Locations; int hunter1Locations; int hunter2Locations; int hunter3Locations; hunter0Moves = whereCanTheyGo(gameState,&hunter0Locations,0,TRUE,TRUE,TRUE); hunter1Moves = whereCanTheyGo(gameState,&hunter1Locations,1,TRUE,TRUE,TRUE); hunter2Moves = whereCanTheyGo(gameState,&hunter2Locations,2,TRUE,TRUE,TRUE); hunter3Moves = whereCanTheyGo(gameState,&hunter3Locations,3,TRUE,TRUE,TRUE); // Attempting to determine the next move by working out // where we have been, where we can go, and if the hunters // can also go there in their next move, makes us safer! int hunter0Count = 0; int hunter1Count = 0; int hunter2Count = 0; int hunter3Count = 0; int dracCount = 0; int safeLength = landLength; int ref = 0; // Checking whether the possible LAND moves for Dracula // are possible LAND moves for the hunters // Note: we do not follow this check for water moves because... // WE DON'T CARE ABOUT MATCHING WATER MOVES! // This works by changing entries in the landMoves to -1 // when there is a risk their move will be the same as our move while(dracCount < landLength){ while(hunter0Count < hunter0Locations){ if(hunter0Moves[hunter0Count] == landMoves[dracCount]){ landMoves[dracCount] = -1; dracCount++; hunter0Count = hunter0Locations; hunter1Count = hunter1Locations; hunter2Count = hunter2Locations; hunter3Count = hunter3Locations; safeLength--; }else hunter0Count++; } while(hunter1Count < hunter1Locations){ if(hunter1Moves[hunter1Count] == landMoves[dracCount]){ landMoves[dracCount] = -1; dracCount++; hunter1Count = hunter1Locations; hunter2Count = hunter2Locations; hunter3Count = hunter3Locations; safeLength--; }else hunter1Count++; } while(hunter2Count < hunter2Locations){ if(hunter2Moves[hunter2Count] == landMoves[dracCount]){ landMoves[dracCount] = -1; dracCount++; hunter2Count = hunter2Locations; hunter3Count = hunter3Locations; safeLength--; }else hunter2Count++; } while(hunter3Count < hunter3Locations){ if(hunter3Moves[hunter3Count] == landMoves[dracCount]){ landMoves[dracCount] = -1; dracCount++; hunter3Count = hunter3Locations; safeLength--; }else hunter3Count++; } //reset the counters, and if the dracCount hasn't already been incremented during the movement, hunter0Count = 0; hunter1Count = 0; hunter2Count = 0; hunter3Count = 0; if(dracCount == ref){ dracCount++; } ref++; } // After changing the move list to the -1s, we must create a new array // of possible safe moves we can make. // Make array as big as possible SAFE LAND moves for us is. int *safeMoves = calloc(sizeof(int), safeLength); // Little loop to transfer possible SAFE LAND moves into the new array a = 0; b = 0; while(a < landLength){ if(landMoves[a] != -1){ safeMoves[b] = landMoves[a]; a++; b++; } else a++; } printf("Number of Safe Moves: %d\n",safeLength); printf("Number of Water Moves: %d\n",waterLength); // == REGISTER A SAFE MOVE == // if (safeLength > 0) registerBestPlay(idToAbbrev(safeMoves[0]),"7"); // == SMART MOVES == // if (safeLength == 0){ // If greater than 20 health, move towards them anyway // (make a safe move next round if available) if((howHealthyIs(gameState,4) > 20) && (waterLength > 0)) { registerBestPlay(idToAbbrev(waterMoves[0]),"8"); // If less than 20, try hiding or double backing. } else { if(HIDING == 1) { registerBestPlay("HI","9"); } else if ((HIDING == 0) && (BACK == 1)) { registerBestPlay("D1","10"); } } } // == LAST RESORT MOVES == // // No moves available, TP if ((landLength == 0) && (waterLength == 0)) { if (HIDING == 1) { registerBestPlay("HI","11"); } else if ((HIDING == 0) && (BACK == 1)) { registerBestPlay("D1","12"); } else registerBestPlay("TP", "13"); } } }