- 13th Oct 2021
- 02:41 am
- Admin
This C program is a simple racing game simulation that allows the user to choose between two game modes: Auto Race (1 Player) or Manual Race (2 Player). The game reads car information from a database file, simulates a race, and then displays the race results. The user can exit the program at any time by selecting the "Quit" option.
#include
#include
#include
#include
#include
#include
#define DATABABSE "car.txt"
#define OUTPUTFILE "raceresults.txt"
#define TRACKLENGTH 90
#define MAXMOVE 10
#define MINMOVE 0
#define MAXCHAR 100
#define AUTO_MODE 4
#define MANUAL_MODE 2
#define MINCARS 0
#define CARLIST 4
typedef struct CarInfo {
char name[MAXCHAR];
char type[MAXCHAR];
int number;
char color[MAXCHAR];
int distance;
int place;
} CarInfo;
// Check database file exist or not
int isDatabaseExist() {
FILE *databaseFile;
databaseFile = fopen(DATABABSE, "r");
if (databaseFile == NULL) {
return 1;
} else {
// Close database file before return.
fclose(databaseFile);
return 0;
}
}
//Prints result to file. Open file and write the result of race
void writeOutput(struct CarInfo cars[], int racerNum) {
int i = 0;
FILE *outputFile;
outputFile = fopen(OUTPUTFILE, "w");
if (outputFile == NULL) {
printf("ERROR: Can not open the output file to write result\n");
return;
}
for (i = 0; i < racerNum; i++) {
printf("%s is #%d\n", cars[i].name, i + 1);
fprintf(outputFile, "%s #%d\n", cars[i].name, i + 1);
}
fclose(outputFile);
}
//Display the ranking on the screen with all the data
void displayRacingInfo(int distance, struct CarInfo displayArray[], int i) {
int j = 0;
// Maximum number of spaces (race track) is 90 spaces
if (distance > TRACKLENGTH) {
distance = TRACKLENGTH;
}
printf("#%d ", displayArray[i].number);
for (j = 0; j < distance; j++) {
printf("*");
}
printf("\n");
}
//Try to sort the list base on place using bubble-sort
void sortDatabaseBasePlace(struct CarInfo cars[], int racerNum) {
int i = 0, j = 0;
for (i = 0; i < racerNum; i++) {
for (j = i + 1; j < racerNum; j++) {
if (cars[i].place > cars[j].place) {
struct CarInfo tmp = cars[i];
cars[i] = cars[j];
cars[j] = tmp;
}
}
}
}
// Update place at step
void updatePlace(struct CarInfo organizeArray[], int racer, int step) {
if (organizeArray[racer].distance >= TRACKLENGTH) {
if (organizeArray[racer].place == 0) {
organizeArray[racer].place = step;
}
}
}
//Get random number with max value
int getRandomNumber(int max) {
return (rand() % max) + 1;
}
// Check all player finished or not
int isFinishedRace(struct CarInfo cars[], int racerNum) {
int i;
for (i = 0; i < racerNum; i++) {
if (cars[i].distance < TRACKLENGTH) {
return 1;
}
}
return 0;
}
// running race
int raceRunning(struct CarInfo cars[], int racerNum) {
int i, raceStep = 1, racer_pick, distance;
int playerNumber = AUTO_MODE;
// Check race mode. MANUAL or AUTO
if (racerNum == MANUAL_MODE) {
playerNumber = MANUAL_MODE;
}
// Clean all buffer stdin
while ((i = getchar()) != '\n' && i != EOF) { }
printf("Please press any key to start race!!!!!!!!!!\n");
getchar();
// Reset all infomation
for (i = 0; i < playerNumber; i++) {
cars[i].distance = 0;
cars[i].place = 0;
}
// If this is manual mode
if (playerNumber == MANUAL_MODE) {
//Just run until meet distance
do {
printf("Race Step: %d\n", raceStep);
// Pick on player to move
racer_pick = getRandomNumber(playerNumber) - 1;
// run random distance
cars[racer_pick].distance = cars[racer_pick].distance
+ getRandomNumber(MAXMOVE);
// Update place
updatePlace(cars, racer_pick, raceStep);
// display info to screen
for (i = 0; i < playerNumber; i++) {
distance = cars[i].distance;
displayRacingInfo(distance, cars, i);
}
raceStep++;
//Forces player to click button to advance the race
if (playerNumber == MANUAL_MODE) {
printf("Press [ENTER] to continue\n");
getchar();
}
printf("\n\n\n");
} while (isFinishedRace(cars, playerNumber));
} else if (playerNumber == AUTO_MODE) {
// If this is auto mode
while (isFinishedRace(cars, playerNumber)) {
printf("Race Step: %d\n", raceStep);
// Pick player randomly
racer_pick = getRandomNumber(playerNumber) - 1;
// run random distance
cars[racer_pick].distance = cars[racer_pick].distance
+ getRandomNumber(MAXMOVE);
// Update place
updatePlace(cars, racer_pick, raceStep);
// display info to screen
for (i = 0; i < playerNumber; i++) {
distance = cars[i].distance;
displayRacingInfo(distance, cars, i);
}
raceStep++;
// Sleep 1 second then continue run
sleep(1);
printf("\n\n\n");
}
}
return playerNumber;
}
//AUTO RACE handling
void raceWithAutoMode() {
int i;
CarInfo carDatabase[AUTO_MODE];
FILE *inputFile = fopen(DATABABSE, "r");
if (inputFile == NULL) {
printf("Error when read the database. Please check database file: %s\n",
DATABABSE);
return;
}
// Try to read all car information
for (i = 0; i < CARLIST; i++) {
fscanf(inputFile, "%s %s %d %s", carDatabase[i].name,
carDatabase[i].type, &carDatabase[i].number,
carDatabase[i].color);
}
// Close file
fclose(inputFile);
printf("=== THIS IS AUTO MODE RACE ========== (1 Players)\n");
// Run race
raceRunning(carDatabase, AUTO_MODE);
// Try to sort database after run. Then write to ouput file
sortDatabaseBasePlace(carDatabase, AUTO_MODE);
// Write to output file
writeOutput(carDatabase, AUTO_MODE);
}
//MANUAL RACE HANDLING
void raceWithManualMode() {
int i, k, player, validChoiceCar, carChoice, selection, j = 0, racerNum =
MANUAL_MODE;
CarInfo carDatabase[AUTO_MODE];
CarInfo playerCars[racerNum];
FILE *inputFile = fopen(DATABABSE, "r");
if (inputFile == NULL) {
printf("Error when read the database. Please check database file: %s\n",
DATABABSE);
return;
}
// Try to read all car information
for (i = 0; i < CARLIST; i++) {
fscanf(inputFile, "%s %s %d %s", carDatabase[i].name,
carDatabase[i].type, &carDatabase[i].number,
carDatabase[i].color);
}
//Close database file after read
fclose(inputFile);
printf("=== THIS IS MANUAL MODE RACING=== (2 Players)\n");
// Assign car to player
do {
//Do loop for trapping until proper selection is made
do {
// Flag for choice valid car
validChoiceCar = 0;
//For player number
player = j + 1;
printf("\nPlayer %d, Please select your car:\n", player);
// Print car for choice
for (i = 0; i < CARLIST; i++) {
k = i + 1;
printf("\t%d) %s %s %d %s\n", k, carDatabase[i].name,
carDatabase[i].type, carDatabase[i].number,
carDatabase[i].color);
}
printf("\n Your choice: ");
scanf("%d", &carChoice);
if (carChoice <= MINCARS || carChoice > CARLIST) {
// This is invalid choice
printf("Invalid choice. Please try again.\n");
} else {
selection = carChoice - 1;
printf("You have selected car #%d, the %s %s driven by %s\n",
carDatabase[selection].number, carDatabase[selection].color,
carDatabase[selection].type, carDatabase[selection].name);
// Copy to playerCar choice
playerCars[j] = carDatabase[selection];
}
//If player 2 selects same car as player 1, set trap to redo selection
if (playerCars[1].number == playerCars[0].number
&& playerCars[0].number != 0 && playerCars[1].number != 0) {
printf("Can not choice the same card. Please try again.\n");
// Reset playerCars
playerCars[0].number = playerCars[1].number = 0;
validChoiceCar = 0;
j = 0;
}
// If this is valid choice
else {
validChoiceCar = 1;
}
}
//Loop until valid choice
while (validChoiceCar != 1);
//Counter for player car selection loop
j++;
}
//Repeat until read enough two player
while (j < MANUAL_MODE);
//Run racing
raceRunning(playerCars, j);
//Sort player due to place
sortDatabaseBasePlace(playerCars, j);
// Write output
writeOutput(playerCars, racerNum);
}
int main(int argc, char** argv) {
// The first output (display) must be your name
printf("\n");
int choice;
do {
printf("Please choice option to run:\n");
printf("\t1) Auto Race (1 Player)\n");
printf("\t2) Manual Race (2 Player)\n");
printf("\t3) Quit\n");
printf("Your option: ");
scanf("%d", &choice);
if (choice == 1) {
raceWithAutoMode();
} else if (choice == 2) {
raceWithManualMode();
} else if (choice == 3) {
printf("Bye!!! Exiting!\n");
} else {
printf("Invalid choice. Please try again\n");
}
} while (choice != 3);
return 0;
}
Our C Programming Assignment Expert Analysis on the Programming Solution
-
The program includes necessary header files for input/output, file handling, and sleeping.
-
The program defines several constants and a structure
CarInfoto store information about cars participating in the race. -
The program contains several functions for handling different aspects of the game, such as checking if the database file exists, writing the race results to an output file, displaying the racing information, sorting the cars based on their positions, updating the place of a car at each step, generating random numbers for racing, checking if all players have finished the race, and running the race in auto and manual modes.
-
The main function is used to present a menu to the user and allow them to choose between auto and manual race modes or quit the game. Depending on the user's choice, the corresponding race function is called.
-
The auto race function
raceWithAutoModereads car information from the database file, runs the race simulation in auto mode, sorts the cars based on their positions, writes the race results to an output file, and displays the results. -
The manual race function
raceWithManualModealso reads car information from the database file, but in this case, it allows two players to select their cars for the race. Then, it runs the race simulation in manual mode, sorts the cars based on their positions, writes the race results to an output file, and displays the results. -
The program uses various loops, conditional statements, and functions to manage the race simulation, handle user input, and perform file operations.