// Tests weather a games isLegalAction function will allow a player to // directly obtain IP or Paper. As well as moves during 'terra-nullis'. void testisLegalAction (void) { action testAction; // Create game: int disciplines[] = DEFAULT_DISCIPLINES; int dice[] = DEFAULT_DICE; Game g = newGame (disciplines, dice); int actionLoop = 0; while (actionLoop < NUM_ACTIONS){ testAction.actionCode = actionLoop; assert (isLegalAction(g, testAction.actionCode) == FALSE); } // Advance from 'terra-nullis' where normal actions are legal. throwDice(g, 3); throwDice(g, 3); // Test OBTAIN_IP_PATENT testAction.actionCode = OBTAIN_IP_PATENT; assert (isLegalAction(g, testAction.actionCode) == FALSE); // Test OBTAIN_PUBLICATION testAction.actionCode = OBTAIN_PUBLICATION; assert (isLegalAction(g, testAction.actionCode) == FALSE); // Test that PASS is allowed testAction.actionCode = PASS; assert (isLegalAction(g, testAction.actionCode) == TRUE); }
// some more isLegalAction testing void test10 (void) { action a; int disciplines[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; int dice[] = {6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6}; Game g = newGame(disciplines, dice); throwDice(g, 6); throwDice(g, 6); throwDice(g, 6); throwDice(g, 6); a.actionCode = OBTAIN_ARC; strncpy(a.destination, "R", PATH_LIMIT - 1); a.destination[PATH_LIMIT - 1] = 0; a.disciplineFrom = 4, a.disciplineTo = 3; makeAction(g, a); a.actionCode = OBTAIN_ARC; strncpy(a.destination, "RR", PATH_LIMIT - 1); a.destination[PATH_LIMIT - 1] = 0; a.disciplineFrom = 4, a.disciplineTo = 3; makeAction(g, a); a.actionCode = BUILD_CAMPUS; strncpy(a.destination, "RR", PATH_LIMIT - 1); a.destination[PATH_LIMIT - 1] = 0; a.disciplineFrom = 4, a.disciplineTo = 3; assert(isLegalAction(g, a) == 1); }
void makeAction (Game g, action a){ /*#define PASS 0 #define BUILD_CAMPUS 1 #define BUILD_GO8 2 #define OBTAIN_ARC 3 #define START_SPINOFF 4 #define OBTAIN_PUBLICATION 5 #define OBTAIN_IP_PATENT 6 #define RETRAIN_STUDENTS 7 typedef struct _action { int actionCode; // see #defines above path destination; // if the action operates on a vertex or ARC this // specifies *which* vertex or path. unused // otherwise int disciplineFrom; // used for the retrain students action int disciplineTo; // used for the retrain students action } action;*/ if(isLegalAction(g,a) == 1){ if(a == 1){ action camp; camp.destination = getPath(); } else if() } }
// test isLegalAction() building GO8 void test2(void) { printf("\n\n\n\n"); action a; int disciplines[] = {0,1,2,1,4,5,0,3,2,3,4,5,0,1,2,3,4,5,0}; int dice[] = {12,11,10,9,8,7,6,5,4,3,2,12,11,10,9,8,7,6,5}; Game g = newGame(disciplines, dice); throwDice(g, 5); throwDice(g, 5); throwDice(g, 12); throwDice(g, 12); a.actionCode = BUILD_GO8; strncpy(a.destination, "", PATH_LIMIT - 1); a.destination[PATH_LIMIT - 1] = 0; a.disciplineFrom = 3, a.disciplineTo = 2; isLegalAction(g, a); assert(isLegalAction (g, a) == 1); }
// test building ARC void test4(void) { printf("\n\n\n\n"); action a; int disciplines[] = {2,5,3,5,3,1,4,4,1,4,2,3,2,0,3,5,4,2,1}; int dice[] = {9,10,8,12,6,5,3,11,3,11,4,6,4,7,9,2,8,10,5}; Game g = newGame(disciplines, dice); throwDice(g, 5); a.actionCode = OBTAIN_ARC; strncpy(a.destination, "L", PATH_LIMIT - 1); a.destination[PATH_LIMIT - 1] = 0; a.disciplineFrom = 134528624, a.disciplineTo = -1081831912; assert(isLegalAction(g, a) == 1); makeAction(g, a); a.actionCode = OBTAIN_ARC; strncpy(a.destination, "LR", PATH_LIMIT - 1); a.destination[PATH_LIMIT - 1] = 0; a.disciplineFrom = 134528624, a.disciplineTo = -1081831912; assert(isLegalAction(g, a) == 1); }
void convertStudents(Game g, int studentFrom, int studentTo, int numToCreate){ action a; a.actionCode = RETRAIN_STUDENTS; a.disciplineFrom = studentFrom; a.disciplineTo = studentTo; int i = 0; while (i < numToCreate) { if (isLegalAction(g, a)){ makeAction(g, a); } i++; } }
action decideAction(Game g) { // int mj; // int mm; // int mtv; action nextAction; // mj = getStudents (g, UNI_A, STUDENT_MJ); // mm = getStudents (g, UNI_A, STUDENT_MMONEY); // mtv = getStudents (g, UNI_A, STUDENT_MTV); // if(mj >= 1 && mm >= 1 && mtv >= 1) { nextAction.actionCode = START_SPINOFF; // if we can't start a spinoff - just pass if (isLegalAction(g, nextAction) != TRUE) nextAction.actionCode = PASS; }
void runGame (void) { // create a dummy game int disciplines[] = DEFAULT_DISCIPLINES; int dice[] = DEFAULT_DICE; Game g = newGame (disciplines, dice); printf ("Running a test game...\n"); // roll the dice int diceScore; diceScore = rollDice (); // progress the game throwDice (g, diceScore); printf ("Deciding on the action...\n"); action newAction; newAction = decideAction (g); while (!getWinner (g)) { // if the player PASSES if (newAction.actionCode == PASS) { diceScore = rollDice (); // progress the game throwDice (g, diceScore); } else { if (isLegalAction (g, newAction)) { makeAction (g, newAction); } else { printf (">>> I'm sorry but you can't do that!\n"); } } // get the next turn newAction = decideAction (g); } // the game is over printf ("\nGame over. Player %d wins\n", getWinner (g)); disposeGame (g); }
int main(int argc, char * argv[]){ int disciplines[] = DEFAULT_DISCIPLINES; int dice[] = DEFAULT_DICE; int turnOver = FALSE; int winner = NO_ONE; int diceValue; action move; int whoseTurn = NO_ONE; srand(time(NULL)); //initialises a seed Game g = newGame(disciplines,dice); while (winner == NO_ONE) { diceValue = rollDice(2,6); throwDice(g,diceValue); printf("[Turn %d] The turn now belongs to University %d!\n", getTurnNumber(g), getWhoseTurn(g)); printf("The dice casted a %d!\n", diceValue); whoseTurn = getWhoseTurn(g); //loop until player action is PASS turnOver = FALSE; while (!turnOver) { move = getMove(g); //print info about move printf("Move %d \n",move.actionCode); assert(isLegalAction(g, move)); if (move.actionCode == START_SPINOFF) { //decide if outcome is patent or publication if (rand() % 3 <= 1) { move.actionCode = OBTAIN_PUBLICATION; } else { move.actionCode = OBTAIN_IP_PATENT; } } if(move.actionCode == PASS){ turnOver = TRUE; printf("Pass\n"); } makeAction(g, move); if(getKPIpoints(g, whoseTurn) >= WINNING_KPI){ winner = whoseTurn; turnOver = TRUE; printf("Winner %d\n",whoseTurn); } } } // TODO print statistics // TODO free memory return EXIT_SUCCESS; }
void testInitialisation (Game testGame){ action testAction; printf ("Testing initial conditions.\n"); printf ("Testing getDiscipline.\n"); assert (getDiscipline(testGame, 0) == STUDENT_BQN); assert (getDiscipline(testGame, 1) == STUDENT_MMONEY); assert (getDiscipline(testGame, 2) == STUDENT_MJ); assert (getDiscipline(testGame, 3) == STUDENT_MMONEY); assert (getDiscipline(testGame, 4) == STUDENT_MJ); assert (getDiscipline(testGame, 5) == STUDENT_BPS); assert (getDiscipline(testGame, 6) == STUDENT_MTV); assert (getDiscipline(testGame, 7) == STUDENT_MTV); assert (getDiscipline(testGame, 8) == STUDENT_BPS); assert (getDiscipline(testGame, 9) == STUDENT_MTV); assert (getDiscipline(testGame, 10) == STUDENT_BQN); assert (getDiscipline(testGame, 11) == STUDENT_MJ); assert (getDiscipline(testGame, 12) == STUDENT_BQN); assert (getDiscipline(testGame, 13) == STUDENT_THD); assert (getDiscipline(testGame, 14) == STUDENT_MJ); assert (getDiscipline(testGame, 15) == STUDENT_MMONEY); assert (getDiscipline(testGame, 16) == STUDENT_MTV); assert (getDiscipline(testGame, 17) == STUDENT_BQN); assert (getDiscipline(testGame, 18) == STUDENT_BPS); printf ("Testing getDiceValue\n"); assert (getDiceValue(testGame, 0) == 9); assert (getDiceValue(testGame, 1) == 10); assert (getDiceValue(testGame, 2) == 8); assert (getDiceValue(testGame, 3) == 12); assert (getDiceValue(testGame, 4) == 6); assert (getDiceValue(testGame, 5) == 5); assert (getDiceValue(testGame, 6) == 3); assert (getDiceValue(testGame, 7) == 11); assert (getDiceValue(testGame, 8) == 3); assert (getDiceValue(testGame, 9) == 11); assert (getDiceValue(testGame, 10) == 4); assert (getDiceValue(testGame, 11) == 6); assert (getDiceValue(testGame, 12) == 4); assert (getDiceValue(testGame, 13) == 7); assert (getDiceValue(testGame, 14) == 9); assert (getDiceValue(testGame, 15) == 2); assert (getDiceValue(testGame, 16) == 8); assert (getDiceValue(testGame, 17) == 10); assert (getDiceValue(testGame, 18) == 5); printf ("Testing Most ARC\n"); assert (getMostARCs(testGame) == NO_ONE); printf ("Testing most publications\n"); assert (getMostPublications (testGame) == NO_ONE); printf ("Testing turnNumber\n"); assert (getTurnNumber(testGame) == -1); printf ("Testing whoseTurn.\n"); assert (getWhoseTurn (testGame) == NO_ONE); printf("Testing getCampus (content of given vertex) \n"); assert (getCampus (testGame, "RLBLR") == VACANT_VERTEX); assert (getCampus (testGame, "RLBBR") == VACANT_VERTEX); assert (getCampus (testGame, "LRL") == VACANT_VERTEX); printf("Testing getARC (content of given edge) \n"); assert (getARC (testGame, "L") == VACANT_ARC); assert (getARC (testGame, "R") == VACANT_ARC); assert (getARC (testGame, "LR") == VACANT_ARC); assert (getARC (testGame, "RR") == VACANT_ARC); printf ("Testing isLegalAction\n"); assert (isLegalAction (testGame, testAction) == FALSE); printf ("Testing KPI points\n"); assert (getKPIpoints (testGame, UNI_A) == 0); assert (getKPIpoints (testGame, UNI_B) == 0); assert (getKPIpoints (testGame, UNI_C) == 0); printf ("Testing getARCs (number of ARC grants) \n"); assert (getARCs (testGame, UNI_A) == 0); assert (getARCs (testGame, UNI_B) == 0); assert (getARCs (testGame, UNI_C) == 0); printf ("Testing GO8 (number of G08 campus) \n"); assert (getGO8s (testGame, UNI_A) == 0); assert (getGO8s (testGame, UNI_B) == 0); assert (getGO8s (testGame, UNI_C) == 0); printf ("Testing getCampuses (number of normal campuses)\n"); assert (getCampuses (testGame, UNI_A) == 2); assert (getCampuses (testGame, UNI_B) == 2); assert (getCampuses (testGame, UNI_C) == 2); printf ("Testing IPs (number of IP patent) \n"); assert (getIPs(testGame, UNI_A) == 0); assert (getIPs(testGame, UNI_B) == 0); assert (getIPs(testGame, UNI_C) == 0); printf ("Testing publications\n"); assert (getPublications(testGame, UNI_A) == 0); assert (getPublications(testGame, UNI_B) == 0); assert (getPublications(testGame, UNI_C) == 0); printf ("Testing number of students of UNI_A\n"); assert (getStudents (testGame, UNI_A, STUDENT_THD) == 0); assert (getStudents (testGame, UNI_A, STUDENT_BPS) == 3); assert (getStudents (testGame, UNI_A, STUDENT_BQN) == 3); assert (getStudents (testGame, UNI_A, STUDENT_MJ) == 1); assert (getStudents (testGame, UNI_A, STUDENT_MTV) == 1); assert (getStudents (testGame, UNI_A, STUDENT_MMONEY) == 1); printf ("Testing number of students of UNI_B\n"); assert (getStudents (testGame, UNI_B, STUDENT_THD) == 0); assert (getStudents (testGame, UNI_B, STUDENT_BPS) == 3); assert (getStudents (testGame, UNI_B, STUDENT_BQN) == 3); assert (getStudents (testGame, UNI_B, STUDENT_MJ) == 1); assert (getStudents (testGame, UNI_B, STUDENT_MTV) == 1); assert (getStudents (testGame, UNI_B, STUDENT_MMONEY) == 1); printf ("Testing number of students of UNI_C\n"); assert (getStudents (testGame, UNI_C, STUDENT_THD) == 0); assert (getStudents (testGame, UNI_C, STUDENT_BPS) == 3); assert (getStudents (testGame, UNI_C, STUDENT_BQN) == 3); assert (getStudents (testGame, UNI_C, STUDENT_MJ) == 1); assert (getStudents (testGame, UNI_C, STUDENT_MTV) == 1); assert (getStudents (testGame, UNI_C, STUDENT_MMONEY) == 1); printf ("Testing getExchangeRate for UNI_A\n"); assert (getExchangeRate (testGame, UNI_A, STUDENT_BPS, STUDENT_BPS) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_BPS, STUDENT_BQN) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_BPS, STUDENT_MJ) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_BPS, STUDENT_MTV) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_BPS, STUDENT_MMONEY) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MMONEY, STUDENT_MMONEY) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MMONEY, STUDENT_BPS) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MMONEY, STUDENT_BQN) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MMONEY, STUDENT_MJ) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MMONEY, STUDENT_MTV) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MTV, STUDENT_MTV) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MTV, STUDENT_BPS) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MTV, STUDENT_BQN) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MTV, STUDENT_MJ) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MTV, STUDENT_MMONEY) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_BQN, STUDENT_BQN) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_BQN, STUDENT_BPS) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_BQN, STUDENT_MJ) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_BQN, STUDENT_MTV) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_BQN, STUDENT_MMONEY) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MJ, STUDENT_MJ) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MJ, STUDENT_BPS) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MJ, STUDENT_BQN) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MJ, STUDENT_MTV) == 3); assert (getExchangeRate (testGame, UNI_A, STUDENT_MJ, STUDENT_MMONEY) == 3); printf ("All tests passed\n\n"); }
int main(int argc, char *argv[]) { // miscellaneous /*int disciplines[NUM_REGIONS]; int dice[NUM_REGIONS];*/ Game g; // store the winner of each game int winner; // store game states within the game int keepPlaying; int turnFinished; int diceRollAmount; // random char *actions[] = ACTION_NAMES; int diceRoll; int passedTurns = 0; // seed rand! srand(time(NULL)); // while the game is wanting to be played, create new game, etc. keepPlaying = TRUE; while (keepPlaying == TRUE) { // create the game //randomDisciplines(disciplines); //randomDice(dice); // you can change this to randomiseDisciplines() and randomiseDice() later int disciplines[NUM_REGIONS] = {CYAN,PURP,YELL,PURP,YELL,RED ,GREE,GREE, RED ,GREE,CYAN,YELL,CYAN,BLUE,YELL,PURP,GREE,CYAN,RED }; int dice[NUM_REGIONS] = {9,10,8,12,6,5,3,7,3,11,4,6,4,9,9,2,8,10,5}; // rig board like the real game rigBoard(disciplines, dice); g = newGame(disciplines, dice); printf("Game created! Now playing...\n"); // start the game with noone as the winner winner = NO_ONE; while (winner == NO_ONE) { printLineBreak(); // start new turn by setting turnFinished to false then // rolling the dice diceRollAmount = 0; diceRoll = 0; while (diceRollAmount < DICE_AMOUNT) { diceRoll += rollDice(); diceRollAmount++; } throwDice(g, diceRoll); // new turn means new line break! printf("[Turn %d] The turn now belongs to University %c!\n", getTurnNumber(g), getWhoseTurn(g) + UNI_CHAR_NAME); // printf("The dice has casted a %d!\n", diceRoll); printf("\n"); // keep going through the player's turn until // he/she decided to pass and finish the turn turnFinished = FALSE; while (turnFinished == FALSE && passedTurns < MAX_PASS) { // processes requests and all subrequests for a move and // checks if they are legal. only gives a move within the // scope of the defined actionCodes that is legal int turnPerson = getWhoseTurn(g); /* printf("Stats for %c:\n", turnPerson + UNI_CHAR_NAME); printf("KPIs: %d\n", getKPIpoints(g, turnPerson)); printf("ARCs: %d\n", getARCs(g, turnPerson)); printf("Campuses: %d\n", getCampuses(g, turnPerson)); printf("GO8s: %d\n", getGO8s(g, turnPerson)); printf("Publications: %d\n", getPublications(g, turnPerson)); printf("Patents: %d\n", getIPs(g, turnPerson)); int discipleIndex = 0; char *discipleNames[] = DISCIPLE_NAMES; while (discipleIndex < NUM_DISCIPLINES) { printf("Type %s: %d\n", discipleNames[discipleIndex], getStudents(g, turnPerson, discipleIndex)); discipleIndex++; } */ printf("\n"); action a = decideAction(g); // if not passing, make the move; otherwise end the turn if (a.actionCode == PASS) { turnFinished = TRUE; printf("You have passed onto the next person.\n"); } else { // write what the player did, for a logs sake. /* printf("The action '%s' has being completed.\n", actions[a.actionCode]); if (a.actionCode == BUILD_CAMPUS || a.actionCode == OBTAIN_ARC || a.actionCode == BUILD_GO8) { printf(" -> Destination: %s\n", a.destination); } else if (a.actionCode == RETRAIN_STUDENTS) { printf(" -> DisciplineTo: %d\n", a.disciplineTo); printf(" -> DisciplineFrom: %d\n", a.disciplineFrom); } */ assert(isLegalAction(g, a)); // break this and the code dies. trololol! if (a.actionCode == START_SPINOFF) { if (rand() % 3 <= 1) { a.actionCode = OBTAIN_PUBLICATION; } else { a.actionCode = OBTAIN_IP_PATENT; } } makeAction(g, a); if (a.actionCode == PASS) { passedTurns++; } else { passedTurns = 0; } if (passedTurns >= MAX_PASS || getKPIpoints(g, turnPerson) >= WINNING_KPI) { turnFinished = TRUE; } } // if there is not a winner or pass, add a seperating line // to seperate actions being clumped together if (turnFinished == FALSE) { printf("\n"); } } // check if there is a winner winner = checkForWinner(g); } if (passedTurns >= MAX_PASS) { printf("AI passes too much.\n"); return EXIT_FAILURE; } printLineBreak(); printf("GAME OVER!\n"); printf("Vice Chanceller %c Won in %d Turns!!\n", winner + UNI_CHAR_NAME, getTurnNumber(g)); printf("\n"); int counter = UNI_A; while (counter < NUM_UNIS + UNI_A) { printf("Uni %c scored %d KPIs\n", counter + UNI_CHAR_NAME, getKPIpoints(g, counter)); counter++; } printLineBreak(); disposeGame(g); // ask to play again printf("Ctrl+C will exit the game.\nOtherwise, the game will " "recommence by hitting enter."); int a = scanf("%*c"); a++; } return EXIT_SUCCESS; }
action decideAction (Game g) { int turn = getWhoseTurn(g); path aiPathARC = {0}; if (turn == UNI_B) { strcpy(aiPathARC, "RRLRLL"); char prev = 'L'; char *next = 0; if (getARC(g, aiPathARC) != NO_ONE) { strcat(aiPathARC, "L"); } else { strcat(aiPathARC, "L"); int i = 0; while (i <= 30 && getARC(g, aiPathARC) != NO_ONE) { if (prev == 'R') { next = "L"; prev = 'L'; } else { next = "R"; prev = 'R'; } strcat(aiPathARC, next); i++; } } } else if (turn == UNI_C) { strcpy(aiPathARC, "LRLRLB"); char prev = 'B'; char *next = 0; int i = 0; while (i <= 30 && getARC(g, aiPathARC) != NO_ONE) { if (prev == 'R') { next = "L"; prev = 'L'; } else if (prev == 'L') { next = "R"; prev = 'R'; } else { next = "L"; prev = 'L'; } strcat(aiPathARC, next); i++; } } else { //for the first arc strcpy(aiPathARC, "R"); char prev = 'R'; char *next = 0; int i = 0; while (i <= 30 && getARC(g, aiPathARC) != NO_ONE) { if (prev == 'R'){ next = "L"; prev = 'L'; } else if (prev == 'L') { next = "R"; prev = 'R'; } else { next = "L"; prev = 'L'; } strcat(aiPathARC, next); i++; } } path aiPathCampus = {0}; //next part is simialer to arc pathing above //but since 2 campuses can't be made adjacent it //works slightly differently //needs to be checked if (turn == UNI_B) { strcpy(aiPathCampus, "RRLRLLL"); char *next = "RL"; int i = 0; while (i <= 30 && getCampus(g, aiPathCampus) != NO_ONE){ strcat(aiPathCampus, next); i++; } } else if (turn == UNI_C) { strcpy(aiPathCampus, "LRLRLB"); char *next = "LR"; int i = 0; while (i <= 30 && getCampus(g, aiPathCampus) != NO_ONE){ strcat(aiPathCampus, next); i++; } } else { strcpy(aiPathCampus, "R"); char *next = "LR"; int i = 0; while (i <= 30 && getCampus(g, aiPathCampus) != NO_ONE) { strcat(aiPathCampus, next); i++; } } action nextAction; int actionChosen = FALSE; if(turn != NO_ONE ) { //Build Campus nextAction.actionCode = BUILD_CAMPUS; strncpy(nextAction.destination, aiPathCampus, PATH_LIMIT); if (isLegalAction(g, nextAction)) { actionChosen = TRUE; } //Build Arc nextAction.actionCode = OBTAIN_ARC; strncpy(nextAction.destination, aiPathARC, PATH_LIMIT); if (!actionChosen && isLegalAction(g, nextAction) == TRUE) { actionChosen = TRUE; } //Spinoff nextAction.actionCode = START_SPINOFF; if (!actionChosen && isLegalAction(g, nextAction) == TRUE) { actionChosen = TRUE; } //before pass when we can we should add something that can //convert students so we can do more of the above actions //(maybe a while loop encompasing all actions) //Pass if (!actionChosen) { nextAction.actionCode = PASS; } } return nextAction; }
//Sample out testing simple things void testInitialState(Game g){ printf("Testing initialState!\n"); int disciplines[] = DEFAULT_DISCIPLINES; int dice[] = DEFAULT_DICE; //Check each region produces correct disciplines int regionID = 0; while (regionID < NUM_REGIONS) { assert(getDiscipline(g,regionID) == disciplines[regionID]); regionID ++; } //Check what dice value produces students in the specified region regionID = 0; while (regionID < NUM_REGIONS) { assert(getDiceValue(g,regionID) == dice[regionID]); regionID ++; } assert(getMostARCs(g) == NO_ONE); assert(getMostPublications(g) == NO_ONE); assert(getTurnNumber(g) == -1); assert(getWhoseTurn(g) == NO_ONE); //Check individual uni values int uni = UNI_A; while(uni <= UNI_C){ //Check Uni's exchange rates int testStudentFrom = STUDENT_BPS; int testStudentTo = STUDENT_BPS; while (testStudentFrom <= STUDENT_MMONEY) { while (testStudentTo <= STUDENT_MMONEY) { if (testStudentFrom != testStudentTo) { assert(getExchangeRate (g, uni, testStudentFrom, testStudentTo) == 3); } testStudentTo ++; } testStudentFrom ++; testStudentTo = STUDENT_BPS; } assert(getKPIpoints(g,uni) == 20); assert(getARCs(g,uni) == 0); assert(getGO8s(g,uni) == 0); assert(getCampuses(g,uni) == 2); assert(getPublications(g,uni) == 0); assert(getIPs(g,uni) == 0); //Check initial student values assert(getStudents(g,uni,STUDENT_THD)==0); assert(getStudents(g,uni,STUDENT_BPS)==3); assert(getStudents(g,uni,STUDENT_BQN)==3); assert(getStudents(g,uni,STUDENT_MJ)==1); assert(getStudents(g,uni,STUDENT_MTV)==1); assert(getStudents(g,uni,STUDENT_MMONEY)==1); uni++; } //Test isLegalAction at Terra Nullis action passAction; action CampusAction; action GO8Action; action ARCAction; action spinoffAction; action publicationAction; action patentAction; action retrainAction; passAction.actionCode = PASS; CampusAction.actionCode = BUILD_CAMPUS; GO8Action.actionCode = BUILD_GO8; ARCAction.actionCode = OBTAIN_ARC; spinoffAction.actionCode = START_SPINOFF; publicationAction.actionCode = OBTAIN_PUBLICATION; patentAction.actionCode = OBTAIN_IP_PATENT; retrainAction.actionCode = RETRAIN_STUDENTS; assert(isLegalAction(g, passAction) == FALSE); assert(isLegalAction(g, CampusAction) == FALSE); assert (isLegalAction(g, GO8Action) == FALSE); assert(isLegalAction(g, ARCAction) == FALSE); assert(isLegalAction(g, spinoffAction) == FALSE); assert(isLegalAction(g, publicationAction) == FALSE); assert(isLegalAction(g, patentAction) == FALSE); assert(isLegalAction(g, retrainAction) == FALSE); printf ("All initialState tests passed!\n"); }
//Tests each action to see if they are legal, int isLegalAction (Game g, action a); void testLegalAction(Game g, int player){ printf("Testing isLegalAction!\n"); action passAction; action CampusAction; action GO8Action; action ARCAction; action spinoffAction; action publicationAction; action patentAction; passAction.actionCode = PASS; CampusAction.actionCode = BUILD_CAMPUS; GO8Action.actionCode = BUILD_GO8; ARCAction.actionCode = OBTAIN_ARC; spinoffAction.actionCode = START_SPINOFF; publicationAction.actionCode = OBTAIN_PUBLICATION; patentAction.actionCode = OBTAIN_IP_PATENT; assert(isLegalAction(g, passAction) == TRUE); assert(isLegalAction(g, CampusAction) == TRUE && getStudents(g, player, STUDENT_BPS) >= 1 && getStudents(g, player, STUDENT_BQN) >= 1 && getStudents(g, player, STUDENT_MJ) >= 1 && getStudents(g, player, STUDENT_MTV) >= 1); assert((isLegalAction(g, CampusAction) == FALSE) && ((getStudents(g, player, STUDENT_BPS) < 1) || (getStudents(g, player, STUDENT_BQN) < 1) || (getStudents(g, player, STUDENT_MJ) < 1) || (getStudents(g, player, STUDENT_MTV) < 1))); assert (isLegalAction(g, GO8Action) == TRUE && getStudents(g, player, STUDENT_MJ) >= 2 && getStudents(g, player, STUDENT_MMONEY) >= 3); assert ((isLegalAction(g, GO8Action) == FALSE) && ((getStudents(g, player, STUDENT_MJ) < 2) || (getStudents(g, player, STUDENT_MMONEY) < 3))); assert(isLegalAction(g, ARCAction) == TRUE && getStudents(g, player, STUDENT_BQN) >= 1 && getStudents(g, player, STUDENT_BPS) >= 1); assert((isLegalAction(g, ARCAction) == FALSE) && ((getStudents(g, player, STUDENT_BQN) < 1) || (getStudents(g, player, STUDENT_BPS) < 1))); assert(isLegalAction(g, spinoffAction) == TRUE && getStudents(g, player, STUDENT_MJ) >= 1 && getStudents(g, player, STUDENT_MTV) >= 1 && getStudents(g, player, STUDENT_MMONEY) >= 1); assert((isLegalAction(g, spinoffAction) == FALSE) && ((getStudents(g, player, STUDENT_MJ) < 1) || (getStudents(g, player, STUDENT_MTV) < 1) || (getStudents(g, player, STUDENT_MMONEY) < 1))); assert(isLegalAction(g, publicationAction) == FALSE); assert(isLegalAction(g, patentAction) == FALSE); //Test Retrain_Students int testStudentFrom = STUDENT_BPS; int testStudentTo = STUDENT_BPS; action retrainAction; retrainAction.actionCode = RETRAIN_STUDENTS; retrainAction.disciplineFrom = testStudentFrom; retrainAction.disciplineTo = testStudentTo; while (testStudentFrom <= STUDENT_MMONEY) { while (testStudentTo <= STUDENT_MMONEY) { if (testStudentFrom != testStudentTo) { assert(isLegalAction(g, retrainAction) == TRUE && getStudents(g, player, testStudentFrom) - \ getExchangeRate (g, player, testStudentFrom, testStudentTo) >= 0); } testStudentTo ++; retrainAction.disciplineTo = testStudentTo; } testStudentFrom ++; retrainAction.disciplineFrom = testStudentFrom; retrainAction.disciplineTo = STUDENT_BPS; } printf ("All isLegalAction() tests passed!\n"); }
action decideAction(Game g) { vertex vertices[NUM_INT_VERTICES]; arc arcs[NUM_INT_ARCS]; int currentPlayer = getWhoseTurn(g); int myCampus = 0; int myGO8 = 0; int myARC = 0; if (currentPlayer == UNI_A) { myCampus = CAMPUS_A; myGO8 = GO8_A; myARC = ARC_A; } else if (currentPlayer == UNI_B) { myCampus = CAMPUS_B; myGO8 = GO8_B; myARC = ARC_B; } else if (currentPlayer == UNI_C) { myCampus = CAMPUS_C; myGO8 = GO8_C; myARC = ARC_C; } char allPaths[NUM_INT_VERTICES][PATH_LIMIT] = ALL_PATHS; char arcPaths[NUM_INT_ARCS - NUM_INT_VERTICES][PATH_LIMIT] = ARC_PATHS; // Populate database int i = 0; while (i < NUM_INT_VERTICES) { vertex newVertex; arc newArc; strcpy(newVertex.path, allPaths[i]); strcpy(newArc.path, allPaths[i]); newVertex.object = getCampus(g, allPaths[i]); newArc.object = getARC(g, allPaths[i]); vertices[i] = newVertex; arcs[i] = newArc; i++; } while (i < NUM_INT_ARCS) { arc newArc; strcpy(newArc.path, arcPaths[i - NUM_INT_VERTICES]); newArc.object = getARC(g, newArc.path); arcs[i] = newArc; i++; } // printf("Populated database\n"); // If we have more than 5 campuses, plan for building GO8s // If we have enough resources to build a GO8... // Upgrade the most valued campus to a GO8 // Note that this AI will only build ARCs and campuses together at the same time // If we have enough resources to build an ARC and campus... // Get a list of all the "edge" vertices // Iterate through each connecting edge vertices, and give them a value // based off the hexes they are connected to. // For every campus of already existing resource, a point is subtracted // Their values is summed of the vertices they're connected to, too. // Cumalative values are halved for every vertex travelled to a maximum of 4 jumps // Then pick the highest scoring sub-vertex. // If there are multiple highest scoring sub-vertices, pick the one with the lowest index // Find vertices we own int myVertices[NUM_INT_VERTICES]; // Array of vertices that we own i = 0; int numMyVertices = 0; while (i < NUM_INT_VERTICES) { myVertices[i] = -1; if (vertices[i].object == myCampus || vertices[i].object == myGO8) { myVertices[numMyVertices] = i; numMyVertices++; // printf("%d\n", i); } i++; } // printf("Found our vertices\n"); // Now scan through each vertex and store neighbours // Array of vertices that are accessible and aren't owned fromToArc considerations[NUM_INT_VERTICES][2]; i = 0; int numConsiderations = 0; while (i < numMyVertices) { trio neighbouring = getNeighbouringVertices(myVertices[i]); if (neighbouring.a >= 0 && vertices[neighbouring.a].object == VACANT_VERTEX) { int arcId = getArcIdFromVertices(myVertices[i], neighbouring.a); if (arcs[arcId].object == VACANT_ARC || arcs[arcId].object == myARC) { considerations[numConsiderations][0].from = myVertices[i]; considerations[numConsiderations][0].to = neighbouring.a; if (arcs[arcId].object == myARC) { considerations[numConsiderations][0].alreadyOwned = TRUE; } else { considerations[numConsiderations][0].alreadyOwned = FALSE; } numConsiderations++; } } if (neighbouring.b >= 0 && vertices[neighbouring.b].object == VACANT_VERTEX) { int arcId = getArcIdFromVertices(myVertices[i], neighbouring.b); if (arcs[arcId].object == VACANT_ARC || arcs[arcId].object == myARC) { considerations[numConsiderations][0].from = myVertices[i]; considerations[numConsiderations][0].to = neighbouring.b; if (arcs[arcId].object == myARC) { considerations[numConsiderations][0].alreadyOwned = TRUE; } else { considerations[numConsiderations][0].alreadyOwned = FALSE; } numConsiderations++; } } if (neighbouring.c >= 0 && vertices[neighbouring.c].object == VACANT_VERTEX) { int arcId = getArcIdFromVertices(myVertices[i], neighbouring.c); if (arcs[arcId].object == VACANT_ARC || arcs[arcId].object == myARC) { considerations[numConsiderations][0].from = myVertices[i]; considerations[numConsiderations][0].to = neighbouring.c; if (arcs[arcId].object == myARC) { considerations[numConsiderations][0].alreadyOwned = TRUE; } else { considerations[numConsiderations][0].alreadyOwned = FALSE; } numConsiderations++; } } i++; } fromToArc subConsiderations[NUM_INT_VERTICES][2]; i = 0; int numSubConsiderations = 0; while (i < numConsiderations) { trio neighbouring = getNeighbouringVertices(considerations[i][0].to); if (neighbouring.a >= 0 && vertices[neighbouring.a].object == VACANT_VERTEX) { // Check that it's not within any other verticie if (canBuildCampusOn(vertices, neighbouring.a)) { int arcId = getArcIdFromVertices(considerations[i][0].to, neighbouring.a); if (arcs[arcId].object == VACANT_ARC || arcs[arcId].object == myARC) { subConsiderations[numSubConsiderations][0] = considerations[i][0]; subConsiderations[numSubConsiderations][1] = considerations[i][1]; subConsiderations[numSubConsiderations][1].from = considerations[i][0].to; subConsiderations[numSubConsiderations][1].to = neighbouring.a; if (arcs[arcId].object == myARC) { subConsiderations[numSubConsiderations][1].alreadyOwned = TRUE; } else { subConsiderations[numSubConsiderations][1].alreadyOwned = FALSE; } numSubConsiderations++; } } } if (neighbouring.b >= 0 && vertices[neighbouring.b].object == VACANT_VERTEX) { // Check that it's not within any other verticie if (canBuildCampusOn(vertices, neighbouring.b)) { int arcId = getArcIdFromVertices(considerations[i][0].to, neighbouring.b); if (arcs[arcId].object == VACANT_ARC || arcs[arcId].object == myARC) { subConsiderations[numSubConsiderations][0] = considerations[i][0]; subConsiderations[numSubConsiderations][1] = considerations[i][1]; subConsiderations[numSubConsiderations][1].from = considerations[i][0].to; subConsiderations[numSubConsiderations][1].to = neighbouring.b; if (arcs[arcId].object == myARC) { subConsiderations[numSubConsiderations][1].alreadyOwned = TRUE; } else { subConsiderations[numSubConsiderations][1].alreadyOwned = FALSE; } numSubConsiderations++; } } } if (neighbouring.c >= 0 && vertices[neighbouring.c].object == VACANT_VERTEX) { // Check that it's not within any other verticie if (canBuildCampusOn(vertices, neighbouring.c)) { int arcId = getArcIdFromVertices(considerations[i][0].to, neighbouring.c); if (arcs[arcId].object == VACANT_ARC || arcs[arcId].object == myARC) { subConsiderations[numSubConsiderations][0] = considerations[i][0]; subConsiderations[numSubConsiderations][1] = considerations[i][1]; subConsiderations[numSubConsiderations][1].from = considerations[i][0].to; subConsiderations[numSubConsiderations][1].to = neighbouring.c; if (arcs[arcId].object == myARC) { subConsiderations[numSubConsiderations][1].alreadyOwned = TRUE; } else { subConsiderations[numSubConsiderations][1].alreadyOwned = FALSE; } numSubConsiderations++; } } } i++; } // printf("Determined considerations\n"); // Remove duplicate paths to the same vertex i = 0; int numPossibilities = 0; fromToArc possibilities[NUM_INT_VERTICES][2]; while (i < numSubConsiderations) { // First result dominates others, unless it has an alreadyOwned flag // printf("%d: %d\n", i, considerations[i][1].to); int search = subConsiderations[i][1].to; int removeAll = FALSE; if (search >= 0) { possibilities[numPossibilities][0] = subConsiderations[i][0]; possibilities[numPossibilities][1] = subConsiderations[i][1]; int j = 0; while (j < numSubConsiderations) { if (subConsiderations[j][1].to == search) { // Same if (!removeAll && (subConsiderations[j][0].alreadyOwned || subConsiderations[j][1].alreadyOwned)) { // Better option removeAll = TRUE; fromToArc pos1 = subConsiderations[j][0]; fromToArc pos2 = subConsiderations[j][1]; possibilities[numPossibilities][0] = pos1; possibilities[numPossibilities][1] = pos2; subConsiderations[j][1].to = -1; numPossibilities++; } subConsiderations[j][1].to = -1; } j++; } if (!removeAll) { numPossibilities++; } } i++; } // Now get the weight values of each consideration weightedVertex sortedWeights[numPossibilities]; i = 0; while (i < numPossibilities) { int weight = getRecursiveVertexWeight(g, vertices, myVertices, numMyVertices, possibilities[i][1].to); weightedVertex newVertex; newVertex.weight = weight; newVertex.arcPath[0] = possibilities[i][0]; newVertex.arcPath[1] = possibilities[i][1]; sortedWeights[i] = newVertex; i++; } sortWeights(sortedWeights, numPossibilities); // printf("Weighted considerations\n"); // Buy in order of weighting // i = 0; // while (i < numPossibilities) { // printf("%d\n", sortedWeights[i].arcPath[1].to); // i++; // } int attempt = 0; int domination = FALSE; if (numPossibilities == 0) { printf("Reached campus domination\n"); domination = TRUE; } int GO8domination = FALSE; if (domination) { // Build GO8s weightedVertex sortedMyCampuses[numMyVertices]; int numMyCampuses = 0; i = 0; while (i < numMyVertices) { if (vertices[myVertices[i]].object == myCampus) { int weight = getSingleVertexWeight(g, vertices, myVertices, numMyVertices, myVertices[i]); weightedVertex newVertex; newVertex.weight = weight; fromToArc newDestination = {0}; newDestination.to = myVertices[i]; newVertex.arcPath[0] = newDestination; sortedMyCampuses[numMyCampuses] = newVertex; numMyCampuses++; } i++; } sortWeights(sortedMyCampuses, numMyCampuses); int totalGO8s = getGO8s(g, UNI_A) + getGO8s(g, UNI_B) + getGO8s(g, UNI_C); if (numMyCampuses == 0 || totalGO8s >= 8) { printf("Reached GO8 Domiation\n"); GO8domination = TRUE; numMyCampuses = 0; } i = 0; while (i < numMyCampuses) { if (enoughToBuildGO8(g, currentPlayer)) { action go8Action; go8Action.actionCode = BUILD_GO8; strcpy(go8Action.destination, vertices[sortedMyCampuses[i].arcPath[0].to].path); if (isLegalAction(g, go8Action)) { return go8Action; printf("Built GO8 at %d\n", sortedMyCampuses[i].arcPath[0].to); } else { printf("Could not build GO8 at %d\n", sortedMyCampuses[i].arcPath[0].to); } } i++; } } if (GO8domination) { // Wow pls, make spinoffs while (enoughToStartSpinoff(g, currentPlayer)) { action spinoffAction; spinoffAction.actionCode = START_SPINOFF; return spinoffAction; } } while (attempt < numPossibilities && enoughToBuildCampus(g, currentPlayer, sortedWeights[attempt].arcPath)) { int firstArc = getArcIdFromVertices(sortedWeights[attempt].arcPath[0].from, sortedWeights[attempt].arcPath[0].to); if (firstArc < 0) { printf("Could not find path between %d and %d!\n", sortedWeights[attempt].arcPath[0].from, sortedWeights[attempt].arcPath[0].to); } else { if (!sortedWeights[attempt].arcPath[0].alreadyOwned) { action pathAction; pathAction.actionCode = OBTAIN_ARC; strcpy(pathAction.destination, arcs[firstArc].path); if (!isLegalAction(g, pathAction)) { printf("ARC between %d and %d is not legal?\n", sortedWeights[attempt].arcPath[0].from, sortedWeights[attempt].arcPath[0].to); } else { printf("Bought ARC between %d and %d\n", sortedWeights[attempt].arcPath[0].from, sortedWeights[attempt].arcPath[0].to); return pathAction; } } int secondArc = getArcIdFromVertices(sortedWeights[attempt].arcPath[1].from, sortedWeights[attempt].arcPath[1].to); if (secondArc < 0) { printf("Could not find path between %d and %d!\n", sortedWeights[attempt].arcPath[1].from, sortedWeights[attempt].arcPath[1].to); } else { if (!sortedWeights[attempt].arcPath[1].alreadyOwned) { action pathAction; pathAction.actionCode = OBTAIN_ARC; strcpy(pathAction.destination, arcs[secondArc].path); if (!isLegalAction(g, pathAction)) { printf("ARC between %d and %d is not legal?\n", sortedWeights[attempt].arcPath[1].from, sortedWeights[attempt].arcPath[1].to); } else { printf("Bought ARC between %d and %d\n", sortedWeights[attempt].arcPath[1].from, sortedWeights[attempt].arcPath[1].to); return pathAction; } } int vertexId = sortedWeights[attempt].arcPath[1].to; action campusAction; strcpy(campusAction.destination, vertices[vertexId].path); campusAction.actionCode = BUILD_CAMPUS; if (!isLegalAction(g, campusAction)) { printf("Campus at %d is not legal?\n", vertexId); } else { printf("Built campus at %d\n", vertexId); return campusAction; } } } attempt++; } action passAction; passAction.actionCode = PASS; return passAction; }
int main (int argc, char * argv[]) { int disciplines[19] = {STUDENT_BQN, STUDENT_MMONEY, STUDENT_MJ, \ STUDENT_MMONEY, STUDENT_MJ, STUDENT_BPS, STUDENT_MTV, \ STUDENT_MTV, STUDENT_BPS,STUDENT_MTV, STUDENT_BQN, \ STUDENT_MJ, STUDENT_BQN, STUDENT_THD, STUDENT_MJ, \ STUDENT_MMONEY, STUDENT_MTV, STUDENT_BQN, STUDENT_BPS}; int dice[19] = {9,10,8,12,6,5,3,11,3,11,4,6,4,7,9,2,8,10,5}; Game g = newGame (disciplines, dice); action a; // int score = 0; //This stores the KPI points of current player int curPlayer = NO_ONE; int curTurn = 0; int playerKPI = 0; int numStudents[MAX_STU_TYPES]; int legal = 0; int diceScore = 0; int spinoffDice = 0; //int discipline = 0; int counter = 0; char *degrees[] = \ {"THDs", "BPSs", "BQNs", "MJs", "MTVs", "MMONEYs"}; printf ("New game created, variables are initialized.\n"); printf ("Let the game begin!\n\n"); while (playerKPI < MAX_KPIPTS) { //To simulate an actual real life dice, we throw two dice diceScore = rollDice(); throwDice (g, diceScore); curTurn = getTurnNumber (g); curPlayer = getWhoseTurn (g); printf ("Turn number: %d\n", curTurn); printf ("Player %d's turn. Rolling dice.\n", curPlayer); printf ("The two dice rolled a %d! \n", diceScore); printf ("You currently have: \n"); counter = 0; while (counter < MAX_STU_TYPES) { numStudents[counter] = getStudents (g, curPlayer, counter); printf (" %d: %s\n", numStudents[counter],\ degrees[counter]); counter ++; } actionOptions (); a = actionPrompt (g); legal = isLegalAction (g, a); while (a.actionCode != PASS) { while (legal == FALSE) { printf ("The chosen action is illegal, try again.\n"); actionPrompt (g); legal = isLegalAction (g, a); } if (a.actionCode == START_SPINOFF) { //Ensures dice returns 1, 2 or 3. spinoffDice = (rand()%3 + 1); if (spinoffDice == 1) { a.actionCode = OBTAIN_IP_PATENT; } else { a.actionCode = OBTAIN_PUBLICATION; } } makeAction (g, a); printf("Action made!"); printf ("Your current stats:\n"); printf (" ARC Grants: %d\n", getARCs (g, curPlayer)); printf (" No of Campuses: %d\n", getCampuses (g, curPlayer)); printf (" No of G08s: %d\n", getGO8s (g, curPlayer)); printf (" No of Pubs: %d\n", getPublications (g, curPlayer)); printf (" No of IP Patents: %d\n", getIPs (g, curPlayer)); playerKPI = getKPIpoints (g, curPlayer); printf ("Player %d KPI Score: %d\n\n", curPlayer, playerKPI); } printf ("Next player's turn.\n\n"); } printf ("Congratulations, player %d won.\n", curPlayer); printf ("Game completed. Disposing game.\n"); disposeGame (g); return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { int disciplines[] = DEFAULT_DISCIPLINES; disciplines[2] = STUDENT_BPS; disciplines[7] = STUDENT_BPS; disciplines[11] = STUDENT_BQN; disciplines[16] = STUDENT_BQN; int dice[] = DEFAULT_DICE; int i = 0; int automation = TRUE; int diceRoll = 1; char *vertices[54]; char *sides[72]; //nanosecond seeding struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); populatePaths(vertices); populateSides(sides); printf("Automatic(1) or Human(0): "); scanf("%d", &automation); //seeding starts now srand((time_t)ts.tv_nsec); Game g = newGame(disciplines, dice); action a; while(getKPILeader(g) < 150 && getTurnNumber(g) < 9003) { if(automation == FALSE) { printf("Enter dice roll: "); scanf("%d", &diceRoll); } else { diceRoll = rand() % 10 + 2; } throwDice(g, diceRoll); printf("diceRoll = %d\n", diceRoll); printf("\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("Turn: %d\n", getTurnNumber(g)); printf("Player %d's turn\n", getWhoseTurn(g)); printf("\n"); printf("You have %d ARCs\n", getARCs(g, getWhoseTurn(g))); i = 0; while(i < 72) { if(getARC(g, sides[i]) == getWhoseTurn(g)) { printf("You have an ARC on %s\\0\n", sides[i]); } i++; } printf("You have %d Campuses\n", getCampuses(g, getWhoseTurn(g))); printf("You have %d GO8s\n", getGO8s(g, getWhoseTurn(g))); i = 0; while(i < 54) { if(getCampus(g, vertices[i]) == getWhoseTurn(g)) { printf("You have a campus on %s\\0\n", vertices[i]); } if(getCampus(g, vertices[i]) == getWhoseTurn(g) + 3) { printf("You have a GO8 on %s\\0\n", vertices[i]); } i++; } printf("You have %d Publications\n", getPublications(g, getWhoseTurn(g))); printf("You have %d IP Patents\n", getIPs(g, getWhoseTurn(g))); printf("\n"); printf("Students:\n"); printf("You have %d THD Students\n", getStudents(g, getWhoseTurn(g), STUDENT_THD)); printf("You have %d BPS Students\n", getStudents(g, getWhoseTurn(g), STUDENT_BPS)); printf("You have %d BQN Students\n", getStudents(g, getWhoseTurn(g), STUDENT_BQN)); printf("You have %d MJ Students\n", getStudents(g, getWhoseTurn(g), STUDENT_MJ)); printf("You have %d MTV Students\n", getStudents(g, getWhoseTurn(g), STUDENT_MTV)); printf("You have %d MMONEY Students\n", getStudents(g, getWhoseTurn(g), STUDENT_MMONEY)); printf("\n"); if(automation == FALSE) { a = getHumanAction(); } else { a = getAIAction(g); } while(a.actionCode != PASS) { if(isLegalAction(g, a)) { if(a.actionCode == START_SPINOFF) { if(rand() % 3 > 1) { a.actionCode = OBTAIN_IP_PATENT; } else { a.actionCode = OBTAIN_PUBLICATION; } } makeAction(g, a); } else { printf("Illegal Action"); } printf("\n"); printf("Player %d's turn\n", getWhoseTurn(g)); printf("You have %d ARCs\n", getARCs(g, getWhoseTurn(g))); printf("You have %d Campuses\n", getCampuses(g, getWhoseTurn(g))); printf("You have %d GO8s\n", getGO8s(g, getWhoseTurn(g))); printf("You have %d Publications\n", getPublications(g, getWhoseTurn(g))); printf("You have %d IP Patents\n", getIPs(g, getWhoseTurn(g))); printf("\n"); printf("Students:\n"); printf("You have %d THD Students\n", getStudents(g, getWhoseTurn(g), STUDENT_THD)); printf("You have %d BPS Students\n", getStudents(g, getWhoseTurn(g), STUDENT_BPS)); printf("You have %d BQN Students\n", getStudents(g, getWhoseTurn(g), STUDENT_BQN)); printf("You have %d MJ Students\n", getStudents(g, getWhoseTurn(g), STUDENT_MJ)); printf("You have %d MTV Students\n", getStudents(g, getWhoseTurn(g), STUDENT_MTV)); printf("You have %d MMONEY Students\n", getStudents(g, getWhoseTurn(g), STUDENT_MMONEY)); printf("\n"); if(automation == FALSE) { a = getHumanAction(); } else { a = getAIAction(g); } } printf("Player 1 KPI points : %d\n", getKPIpoints(g, UNI_A)); printf("Player 2 KPI points : %d\n", getKPIpoints(g, UNI_B)); printf("Player 3 KPI points : %d\n", getKPIpoints(g, UNI_C)); } printf("Winner: Player %d\n", getWinner(g)); disposeGame(g); return EXIT_SUCCESS; }