void testGetTurnNumber(void) { int disciplines[] = DEFAULT_DISCIPLINES; int dice[] = DEFAULT_DICE; Game * myGame = newGame(disciplines, dice); assert(getTurnNumber(myGame) == -1); throwDice(myGame, 3); assert(getTurnNumber(myGame) == 0); }
void testNewGame (void) { printf ("Now testing 'newGame':\n"); printf ("1) First turn number == -1\n"); prinft ("2) Regions initialised correctly (displine and dice values correct)\n"); // check makes a game without crashing int disciplines[NUM_REGIONS]; int dice [NUM_REGIONS]; int testCase = 0; while (testCase < TEST_NEW_GAME_CASES) { int regionID = 0; while (regionID < NUM_REGIONS) { int studentVal = randomValue(0, NUM_STUDENT_TYPES); int student = 0; if (studentVal == VAL_BQN) { student = BQN; } else if (studentVal == VAL_MMON) { student = MMON; } else if (studentVal == VAL_MJ) { student = MJ; } else if (studentVal == VAL_BPS) { student = BPS; } else if (studentVal == VAL_MTV) { student = MTV; } else { student = THD; } disciplines[regionID] = student; dice[regionID] = randomValue(MIN_DICE_VAL, MAX_DICE_VAL); regionID++; } Game g = newGame (disciplines, dice); assert (getTurnNumber(g) == -1); regionID = 0; while (regionID < NUM_REGIONS) { assert (getDiscipline(g, regionID) == disciplines[regionID]); assert (getDiceValue(g, regionID) == dice[regionID]); regionID++; } disposeGame (g); testCase++; } printf ("Passed\n"); }
static int getWinner(Game g) { int i = 1; int winner = 0; int kpileader = 0; while(i <= 3) { if(getKPIpoints(g, i) > kpileader) { kpileader = getKPIpoints(g, i); winner = i; } i++; } if(getTurnNumber(g) > 9002) { winner = 0; } printf("\nTurn: %d\n", getTurnNumber(g)); return winner; }
//DONE static int isLegalData(Game g, action a) { int isLegal = TRUE; //if not a defined action code if(getTurnNumber(g) == -1) { isLegal = FALSE; } if(a.actionCode < 0 || a.actionCode > 7) { isLegal = FALSE; } return isLegal; }
action decideAction (Game g) { action nextAction; nextAction.actionCode = PASS; int player = getWhoseTurn(g); int turnNumber = getTurnNumber(g); printf("TURN NUMBER %d, PLAYER %d IS SPIN2WIN\n", turnNumber, player); if (canAffordCampus(g, player) && determineCampusPath(g, player) != NULL) { nextAction.actionCode = BUILD_CAMPUS; strncpy(nextAction.destination, determineCampusPath(g, player), PATH_LIMIT); printf("SPIN2WIN IS BUILDING CAMPUS\n"); } else if (canAffordARC(g, player) && determineARCPath(g, player) != NULL) { nextAction.actionCode = OBTAIN_ARC; strncpy(nextAction.destination, determineARCPath(g, player), PATH_LIMIT); printf("SPIN2WIN IS BUILDING ARC at %s\n", nextAction.destination); } else if (canAffordSpinOff(g, player)) { nextAction.actionCode = START_SPINOFF; printf("SPIN2WIN IS BUILDING SPIN\n"); } else { nextAction.actionCode = RETRAIN_STUDENTS; if (determineCampusPath(g, player) != NULL && tradeForCampus(g, player, &nextAction.disciplineFrom, &nextAction.disciplineTo)) { // } else if (determineARCPath(g, player) != NULL && // tradeForARC(g, player, // &nextAction.disciplineFrom, &nextAction.disciplineTo)) { } else if (tradeForSpinOff(g, player, &nextAction.disciplineFrom, &nextAction.disciplineTo)) { } else if (canTradeJunkResources(g, player)) { nextAction.disciplineFrom = canTradeJunkResources(g,player); nextAction.disciplineTo = resourcesWeNeed(g, player, nextAction.disciplineFrom); } else { nextAction.actionCode = PASS; } } return nextAction; }
bool AI::runZombie() { std::map<int, std::deque<int> >::iterator iter; eaten = 0; updateWallMap(); for (int i = 0; i < zombies.size(); i++) { if (getTurnNumber()<5 || humans.size() == 0) blindZombie(i); else { smartZombie(i); } } placeZombies(); return true; }
void testGetTurnNumber (void) { printf ("Now testing getTurnNumber... "); // Create game: int disciplines[] = DEFAULT_DISCIPLINES; int dice[] = DEFAULT_DICE; Game g = newGame (disciplines, dice); // Check turns: int turnNum = -1; while (turnNum < TEST_GET_TURN_NUMBER_TURNS) { assert (getTurnNumber(g) == turnNum); throwDice(g, randomValue(2,12)) turnNum++; } disposeGame (g); printf ("Passed\n"); }
//Returns TRUE/FALSE on whether action is legal or not int isLegalAction (Game g, action a) { int output = TRUE; int player = getWhoseTurn (g); //Ensures game has already started if (getTurnNumber (g) == -1) { output = FALSE; } //Ensure action codes are legal if ((a.actionCode < 0) || (a.actionCode >= 8)) { output = FALSE; } //Tests the conditions for building things if it's not already false if (output != FALSE) { if (a.actionCode == PASS) { output = TRUE; } else if (a.actionCode == BUILD_CAMPUS) { output = cmpsConditions (g, a, player); } else if (a.actionCode == BUILD_GO8) { output = G08Conditions (g, a, player); } else if (a.actionCode == OBTAIN_ARC) { output = arcConditions (g, a, player); } else if (a.actionCode == START_SPINOFF) { output = spinoffConditions (g, a, player); } else if (a.actionCode == OBTAIN_PUBLICATION) { //no player should be able to obtain publication freely output = FALSE; } else if (a.actionCode == OBTAIN_IP_PATENT) { //no player should be able to obtain IP patent freely output = FALSE; } else if (a.actionCode == RETRAIN_STUDENTS) { output = retrainConditions (g, a, player); } } return output; }
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; }
// returns TRUE if it is legal for the current // player to make the specified action, FALSE otherwise-> // // "legal" means everything is legal: // * that the action code is a valid action code which is legal to // be made at this time // * that any path is well formed and legal ie consisting only of // the legal direction characters and of a legal length, // and which does not leave the island into the sea at any stage-> // * that disciplines mentioned in any retraining actions are valid // discipline numbers, and that the university has sufficient // students of the correct type to perform the retraining // // eg when placing a campus consider such things as: // * is the path a well formed legal path // * does it lead to a vacent vertex? // * under the rules of the game are they allowed to place a // campus at that vertex? (eg is it adjacent to one of their ARCs?) // * does the player have the 4 specific students required to pay for // that campus? // It is not legal to make any action during Terra Nullis ie // before the game has started-> // It is not legal for a player to make the moves OBTAIN_PUBLICATION // or OBTAIN_IP_PATENT (they can make the move START_SPINOFF) // you can assume that any pths passed in are NULL terminated strings-> int isLegalAction(Game g, action a) { int isLegal = TRUE; printf("Checking if an action is legal\n"); int player = getWhoseTurn(g); int flag = 1; // Protect from stupid shit if ((a.actionCode < PASS) || (a.actionCode > RETRAIN_STUDENTS)) { printf("Invalid Action Code\n"); flag = 0; } else if (a.actionCode == RETRAIN_STUDENTS) { printf("You've Called a retrain, checking if discipline"); printf("within the bounds\n"); // If it's a retrain action make sure the to // and from are in a nice range. if ((a.disciplineTo < STUDENT_THD) || (a.disciplineTo > STUDENT_MMONEY)) { printf("Invalid Discpline Code\n"); flag = 0; } if ((a.disciplineFrom < STUDENT_THD) || (a.disciplineFrom > STUDENT_MMONEY)) { printf("Invalid Discpline Code\n"); flag = 0; } } printf("The Flag when testing is %d\n", flag); if (flag == 1) { // Check all the basic stuff if (getTurnNumber(g) == TERRA_NULLIS) { isLegal = FALSE; } else if ((a.actionCode < 0) || (a.actionCode > MAX_ACTION)) { isLegal = FALSE; } else if ((getWhoseTurn(g) < 0) || (getWhoseTurn(g) > NUM_UNIS)) { isLegal = FALSE; } else if (a.actionCode == OBTAIN_IP_PATENT || a.actionCode == OBTAIN_PUBLICATION) { isLegal = FALSE; } if (a.actionCode <= 3 && a.actionCode > 0 && isLegal) { if (validString(a.destination) == FALSE) { isLegal = FALSE; } else if (validPoint(pathToPoint(a.destination).x, pathToPoint(a.destination).y) == FALSE) { isLegal = FALSE; } } // edge actionEdge = pathToEdgeF (a.destination); // Check that someone can get an arc if (a.actionCode == OBTAIN_ARC && isLegal) { printf("Checking if the arc is legal. Arc:%s\n", a.destination); if (validNewEdge(g, pathToEdgeF(a.destination), player) == FALSE) { printf("Geographically Valid Edge\n"); isLegal = FALSE; } else if (getStudents(g, player, STUDENT_BQN) < 1) { isLegal = FALSE; } else if (getStudents(g, player, STUDENT_BPS) < 1) { isLegal = FALSE; } } // Check that someone can get a Campus if (a.actionCode == BUILD_CAMPUS && isLegal) { if (validNewContents(g, a.destination, player) == FALSE) { isLegal = FALSE; } else if (getStudents(g, player, STUDENT_BQN) < 1) { isLegal = FALSE; } else if (getStudents(g, player, STUDENT_BPS) < 1) { isLegal = FALSE; } else if (getStudents(g, player, STUDENT_MJ) < 1) { isLegal = FALSE; } else if (getStudents(g, player, STUDENT_MTV) < 1) { isLegal = FALSE; } } if (a.actionCode == BUILD_GO8 && isLegal) { point actionPoint = pathToPoint(a.destination); if (g->gameBoard->points[actionPoint.x][actionPoint.y]->contents != player) { isLegal = FALSE; } else if (getStudents(g, player, STUDENT_MJ) < 2) { isLegal = FALSE; } else if (getStudents(g, player, STUDENT_MMONEY) < 3) { isLegal = FALSE; } else if (getTotalGO8s(g) == 8) { isLegal = FALSE; } } if (a.actionCode == START_SPINOFF && isLegal) { if (getStudents(g, player, STUDENT_MJ) < 1) { isLegal = FALSE; } else if (getStudents(g, player, STUDENT_MTV) < 1) { isLegal = FALSE; } else if (getStudents(g, player, STUDENT_MMONEY) < 1) { isLegal = FALSE; } } if (a.actionCode == RETRAIN_STUDENTS && isLegal) { int exchange = getExchangeRate(g, player, a.disciplineFrom, a.disciplineTo); if (getStudents(g, player, a.disciplineFrom) < exchange) { isLegal = FALSE; } else if (a.disciplineFrom == STUDENT_THD) { isLegal = FALSE; } } } else if (flag == 0) { isLegal = FALSE; } return isLegal; }
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; }
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; }
int BaseAI::turnNumber() { return getTurnNumber(); }
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; }
// NOTE: IS MAKEACTION(g, PASS_ACTION) required to end turn? or just THROWDICE? // Unsure on this, might ahve to ask a tutor. void testStudentAllocationAndMakeAction (void) { printf ("Now testing updating of students after dice throws and actions.\n"); // Create game: int disciplines[] = DEFAULT_DISCIPLINES; int dice[] = DEFAULT_DICE; Game g = newGame (disciplines, dice); // Throw the dice once, not giving any players students, to move the // current turn to '0' rather than '-1': throwDice(g, 3); // Allocate 300 students to each player through numerous dice throws! int throws = 0; while (throws < 150) { // Trigger each hexagon with an adjoined campus: throwDice(g, 11); // 1 MTV to player 1 throwDice(g, 6); // 1 MJ to player 1 throwDice(g, 9); // 1 BQN to player 2 throwDice(g, 9); // 1 BQN to player 2 throwDice(g, 9); // 1 BQN to player 2 throwDice(g, 5); // 1 BPS to player 2 throwDice(g, 5); // 1 BPS to player 2 throwDice(g, 5); // 1 BPS to player 2 throwDice(g, 8); // 1 MJ and 1 MTV to player 3 } /* At this point: * - Turn number is [150 * 9 = ] 1350 * - Number of turns mod 3 is 0, therefore player 1's (UNI_A) turn to roll. * - Player 1 has 150 MJs and 150 MTVs * - Player 2 has 450 BQNs and 450 BPSs * - Player 3 has 150 MJs and 150 MTVs */ // Ensure game state has been updated correctly: printf ("Ensuring 'getTurnNumber' and 'getWhoseTurn' return correct values.\n"); assert (getTurnNumber(g) == 750); assert (getWhoseTurn(g) == UNI_A); printf ("Ensuring UNI_A has been allocated the correct number of players.\n"); assert (getStudents(g, UNI_A, STUDENT_BPS) == 0); assert (getStudents(g, UNI_A, STUDENT_BQN) == 0); assert (getStudents(g, UNI_A, STUDENT_MJ) == 150); assert (getStudents(g, UNI_A, STUDENT_MTV) == 150); assert (getStudents(g, UNI_A, STUDENT_MMONEY) == 0); assert (getStudents(g, UNI_A, STUDENT_THD) == 0); printf ("Ensuring UNI_B has been allocated the correct number of players.\n"); assert (getStudents(g, UNI_B, STUDENT_BPS) == 450); assert (getStudents(g, UNI_B, STUDENT_BQN) == 450); assert (getStudents(g, UNI_B, STUDENT_MJ) == 0); assert (getStudents(g, UNI_B, STUDENT_MTV) == 0); assert (getStudents(g, UNI_B, STUDENT_MMONEY) == 0); assert (getStudents(g, UNI_B, STUDENT_THD) == 0); printf ("Ensuring UNI_C has been allocated the correct number of players.\n"); assert (getStudents(g, UNI_C, STUDENT_BPS) == 0); assert (getStudents(g, UNI_C, STUDENT_BQN) == 0); assert (getStudents(g, UNI_C, STUDENT_MJ) == 150); assert (getStudents(g, UNI_C, STUDENT_MTV) == 150); assert (getStudents(g, UNI_C, STUDENT_MMONEY) == 0); assert (getStudents(g, UNI_C, STUDENT_THD) == 0); // Convert UNI_B's BQNs and BPSs into MJs and MTVs, so that each // UNI has the same numbers of students: printf ("Testing basic student conversion.\n"); // Move turn to UNI_B from UNI_A (without giving the UNIs students): throwDice(g, 3); action convertStudents; convertStudents.actionCode = RETRAIN_STUDENTS; // Convert BPSs into MJs: convertStudents.disciplineFrom = STUDENT_BPS; convertStudents.disciplineTo = STUDENT_MJ; int numConversions = 0; while (numConversions < 150) { makeAction(g, convertStudents); } // Ensure the counts have been updated correctly: assert (getStudents(g, UNI_B, STUDENT_BPS) == 0); assert (getStudents(g, UNI_B, STUDENT_MJ) == 150); // Convert BQNs into MTVs: convertStudents.disciplineFrom = STUDENT_BQN; convertStudents.disciplineTo = STUDENT_MTV; int numConversions = 0; while (numConversions < 150) { makeAction(g, convertStudents); } // Ensure the counts have been updated correctly: assert (getStudents(g, UNI_B, STUDENT_BQN) == 0); assert (getStudents(g, UNI_B, STUDENT_MTV) == 150); // Now each UNI has 150 MTVs and 150 MJs. // Set turn to UNI_A: throwDice(g, 3); // Now UNI_C's turn throwDice(g, 3); // Now UNI_A's turn // Get each UNI to perform path-based and path-less actions: int activeUNI = UNI_A; while (activeUNI != NO_ONE) { action testAction; testAction.actionCode = PASS // Set activeUNI to the next UNI // Note: incrementing not used because the values of the // constants are not guaranteed. throwDice(g, 3); if (activeUNI == UNI_A) { activeUNI = UNI_B; } else if (activeUNI == UNI_B) { activeUNI = UNI_C; } else { activeUNI = NO_ONE; } } disposeGame (g); printf ("Passed\n"); }
int CMD_check( int argc, char **argv, int kind ) { char *logName; int result = FALSE; logName = createString( "%s/log/orders_processed.txt", galaxynghome ); openLog( logName, "a" ); free( logName ); plogtime( LBRIEF ); if ( argc < 2 ) { result = TRUE; } else { envelope *anEnvelope = createEnvelope( ); char* returnAddress = getReturnAddress( stdin ); int theTurnNumber = getTurnNumber( stdin ); char* raceName = NULL; char* password = NULL; char* final_orders = NULL; game *aGame = NULL; int resNumber = areValidOrders( stdin, &aGame, &raceName, &password, &final_orders, &theTurnNumber ); plog( LBRIEF, "game %s\n", aGame->name ); setHeader(anEnvelope, MAILHEADER_FROM, "%s", aGame->serverOptions.SERVERemail); setHeader( anEnvelope, MAILHEADER_TO, "%s", returnAddress ); setHeader(anEnvelope, MAILHEADER_REPLYTO, aGame->serverOptions.ReplyTo); anEnvelope->from_address = strdup(aGame->serverOptions.SERVERemail); anEnvelope->from_name = strdup(aGame->serverOptions.SERVERname); if ( resNumber == RES_OK ) { player *aPlayer = findElement( player, aGame->players, raceName ); assert( aPlayer); aPlayer->orders = NULL; plog( LBRIEF, "Orders from %s\n", returnAddress ); if ( ( theTurnNumber == LG_CURRENT_TURN ) || ( theTurnNumber == ( aGame->turn ) + 1 ) ) { /* They are orders for the coming turn, copy them. */ copyOrders( aGame, stdin, raceName, password, aGame->turn + 1 ); /* Check them */ checkOrders( aGame, raceName ); /* Now mail the result */ if ( aPlayer->flags & F_XMLREPORT ) { result = mail_Forecast( aGame, aPlayer, anEnvelope, raceName, kind, REP_XML ); } if ( aPlayer->flags & F_TXTREPORT ) { result = mail_Forecast( aGame, aPlayer, anEnvelope, raceName, kind, REP_TXT ); } } else if ( theTurnNumber > ( aGame->turn ) + 1 ) { /* They are advance orders */ copyOrders( aGame, stdin, raceName, password, theTurnNumber ); setHeader( anEnvelope, MAILHEADER_SUBJECT, "[GNG] %s turn %d advance orders received for %s.", aGame->name, theTurnNumber, raceName ); plog( LBRIEF, "%s turn %d advance orders received for %s.\n", aGame->name, theTurnNumber, raceName ); if ( aPlayer->flags & F_XMLREPORT ) { result = mail_AdvanceReport( aGame, aPlayer, anEnvelope, raceName, kind, REP_XML ); } if ( aPlayer->flags & F_TXTREPORT ) { result = mail_AdvanceReport( aGame, aPlayer, anEnvelope, raceName, kind, REP_TXT ); } } else { /* Orders for a turn that already ran. * Should be handled by areValidOrders() */ assert( 0 ); } } else { /* Some major error */ result |= mail_TXT_Error( aGame, anEnvelope, raceName, kind, resNumber, theTurnNumber ); } } result = ( result ) ? EXIT_FAILURE : EXIT_SUCCESS; return result; }
//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"); }
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[]) { int discipline[6] = {STUDENT_THD, STUDENT_BPS, STUDENT_BQN, STUDENT_MJ, STUDENT_MTV, STUDENT_MMONEY} int dice[6] = {1, 2, 3, 4, 5, 6} newGame(*discipline[], dice[]); //Tests void makeAction action a; a.actionCode = BUILD_CAMPUS; a.destination = L; a.disciplineFrom = STUDENT_BPS; a.disciplineTo = STUDENT_MTV; assert(a.actionCode == BUILD_CAMPUS); assert(a.destination == L); assert(a.disciplineFrom == STUDENT_BPS); assert(a.discplineTo == STUDENT_MTV); //Tests void throwDice assert(diceScore >= 2 && diceScore <= 12); //Tests int getDiscipline assert (getDiscipline(Game g, 0) == STUDENT_BGN); assert (getDiscipline(Game g, 1) == STUDENT_MMONEY); assert (getDiscipline(Game g, 2) == STUDENT_MJ); assert (getDiscipline(Game g, 3) == STUDENT_MMONEY); assert (getDiscipline(Game g, 4) == STUDENT_MJ); assert (getDiscipline(Game g, 5) == STUDENT_BPS); assert (getDiscipline(Game g, 6) == STUDENT_MTV); assert (getDiscipline(Game g, 7) == STUDENT_MTV); assert (getDiscipline(Game g, 8) == STUDENT_BPS); assert (getDiscipline(Game g, 9) == STUDENT_MTV); assert (getDiscipline(Game g, 10) == STUDENT_BQN); assert (getDiscipline(Game g, 11) == STUDENT_MJ); assert (getDiscipline(Game g, 12) == STUDENT_BQN); assert (getDiscipline(Game g, 13) == STUDENT_THD); assert (getDiscipline(Game g, 14) == STUDENT_MJ); assert (getDiscipline(Game g, 15) == STUDENT_MMONEY); assert (getDiscipline(Game g, 16) == STUDENT_MTV); assert (getDiscipline(Game g, 17) == STUDENT_BQN); assert (getDiscipline(Game g, 18) == STUDENT_BPS); //Tests int getDiceValue assert (getDiceValue(Game g, 0) == 9); assert (getDiceVale(Game g, 1) == 10); assert (getDicevalue(Game g, 2) == 8); assert (getDiceValue(Game g, 3) == 12); assert (getDiceValue(Game g, 4) == 6); assert (getDiceValue(Game g, 5) == 5); assert (getDiceValue(Game g, 6) == 3); assert (getDiceValue(Game g, 7) == 11); assert (getDiceValue(Game g, 8) == 3); assert (getDiceValue(Game g, 9) == 11); assert (getDiceValue(Game g, 10) == 4); assert (getDiceValue(Game g, 11) == 6); assert (getDiceValue(Game g, 12) == 4); assert (getDiceValue(Game g, 13) == 7); assert (getDiceValue(Game g, 14) == 9); assert (getDiceValue(Game g, 15) == 2); assert (getDiceValue(Game g, 16) == 8); assert (getDiceValue(Game g, 17) == 10); assert (getDiceValue(Game g, 18) == 5); //Tests int getMostARCs (Game g) assert(getMostARCs(newGame) == NO_ONE); //Tests int getMostPublications (Game g) assert(getMostPublications(newGame) == No_ONE); //Tests int getTurnNumber (Game g) assert(getTurnNumber(newGame) == -1); //Tests int getWhoseTurn (Game g) assert(getWhoseTurn(newGame) == NO_ONE); //Tests int getCampus(Game g, path pathToVertex) assert (getCampus(Game g, path {\0}) == CAMPUS_A); assert (getCampus(Game g, path {‘R’, ‘R’, ‘L’, ‘R’, ‘L’,\0}) == CAMPUS_B); assert (getCampus(Game g, path {‘L’, ‘R’, ‘L’, ‘R’, ‘L’, ‘R’,\0}) == CAMPUS_C); //Tests int getARC(Game g, path pathToEdge) assert (getARC(Game g, path {\0}) == VACANT_ARC); assert (getARC(Game g, path {‘R’,\0}) == ARC A); assert (getARC(Game g, path {‘R’, ‘R’, ‘L’, ‘R’, ‘L’, ‘L’,\0}) == ARC B); assert (getARC(Game g, path {‘L’, ‘R’, ‘L’, ‘R’, ‘L’, ‘R’, ‘B’,\0}) == ARC C); //Tests int isLegalAction (Game g, action a) if (actionCode != PASS) { assert (actionCode >= 0 && actionCode <= 7); if (actionCode == BUILD_CAMPUS) { assert ((sizeof(destination)-1)/4 >= 0 && (sizeof(destination) - 1)/4 <= PATH_LIMIT); assert (getCampus(Game g, path destination) == VACANT_VERTEX); assert (getArc(Game g, (destination + 'B')) == ARC_A && getCampus(Game g, (destination + 'L')) == VACANT_VERTEX && getCampus(Game g, (destination + 'R')) == VACANT_VERTEX); assert (students[STUDENT_BPS] >= 1); assert (students[STUDENTS_BQN] >= 1); assert (students[STUDENTS_MJ] >= 1); assert (students[STUDENTS_MTV] >= 1); } if (actionCode == BUILD_GO8) { assert ((sizeof(destination)-1)/4 >= 0 && (sizeof(destination) - 1)/4 <= PATH_LIMIT); assert (getCampus(Game g, path destination) == CAMPUS_A); assert (students[STUDENTS_MJ] >= 2); assert (students[STUDENTS_MMONEY] >= 3); } if (actionCode == OBTAIN_ARC) { assert ((sizeof(destination)-1)/4 >= 0 && (sizeof(destination) - 1)/4 <= PATH_LIMIT); assert (getArc(Game g, (destination + 'B')) == ARC_A); } if (actionCode == START_SPINNOFF) { assert (students[STUDENT_MJ] >= 1); assert (students[STUDENT_MTV] >= 1); assert (students[STUDENT_MMONEY] >= 1); } if (actionCode == RETRAIN_STUDENTS) { assert (students[disciplineFrom] >= getExchangeRate(Game g, int player, int disciplineFrom, int disciplineTo)); assert (disciplineFrom != STUDENT_THD); assert (disciplineTo != STUDENT_THD); }