// date 2008.5.25
// author fanghua.nie
// just do a exercise in the C How To Program
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define START_POS 1
#define RACE_DISTANCE 70 // the distances of the race
#define TORTOISE 'T' // the symbol that is printed in the screen as a tortoise
#define RABBIT 'R' // the symbol that is printed in the screen as a rabbit
#define ROAD '.' // the symbol that is printed in the screen as a mile road.
#define COMPLETE_ROAD '+'
// define the console color
#define LIGHT_GREEN FOREGROUND_GREEN | FOREGROUND_INTENSITY
#define LIGHT_YELLOW FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY
#define LIGHT_RED FOREGROUND_RED | FOREGROUND_INTENSITY
// define BOOL datatype
typedef int BOOL;
#define TRUE 1
#define FALSE 0
//get the speed of the tortoise or the rabbit
int GetTortoiseSpeed ( int percent, int * speed );
int GetRabbitSpeed ( int percent, int * speed );
//output the result in console interface
void PrintRaceResult ( int tortoisePosition, int rabbitPosition );
int main (void)
{
int percent; // save the percent as a integer that less 10
// 1 10%, 2 20%, 9 90%, 10 100% etc.
int speed; // save the speed of the rabbit or the tortoise
int tortoisePosition = START_POS;
int rabbitPosition = START_POS;
srand ( time(NULL) );
printf (" The game began:\n");
//show the tortoise and the rabbit
PrintRaceResult ( tortoisePosition, rabbitPosition );
while ( rabbitPosition < RACE_DISTANCE && tortoisePosition < RACE_DISTANCE )
{
//compute next speed of the tortoise
percent = rand()%10 + 1;
if ( !GetTortoiseSpeed ( percent, &speed ) ) //get the speed of the tortoise
{
puts ("Error!\n");
exit (ERROR);
}
// move the tortoise to next position
tortoisePosition = tortoisePosition + speed;
if ( tortoisePosition < 0 )
tortoisePosition = START_POS;
else if ( tortoisePosition > RACE_DISTANCE )
tortoisePosition = RACE_DISTANCE;
//compute next rate of rabbit speed
percent = rand()%10 + 1; //get the percent
if ( !GetRabbitSpeed (percent, &speed) ) //get the speed of rabbit
{
puts ("Error!\n");
exit (ERROR);
}
//move the rabbit
rabbitPosition = rabbitPosition + speed;
//check the position whether is right or not, then correct it.
if ( rabbitPosition < 0 )
rabbitPosition = START_POS;
else if ( rabbitPosition > RACE_DISTANCE )
rabbitPosition = RACE_DISTANCE;
//show the tortoise and the rabbit
PrintRaceResult ( tortoisePosition, rabbitPosition );
}
//print the race result
if ( rabbitPosition > tortoisePosition )
{
printf ("Rabbit Wins!\n");
}
else if ( rabbitPosition == tortoisePosition )
{
printf ("It's a tie\n");
}
else
{
printf ("Tortoise Wins!\n");
}
return 0;
}
BOOL GetTortoiseSpeed ( int percent, int * speed )
{
if ( percent >= 1 && percent <= 5 )
{
(*speed) = 3;
return TRUE;
}
else if ( percent >= 6 && percent <= 7 )
{
(*speed) = -6;
return TRUE;
}
else if ( percent >= 8 && percent <= 10 )
{
(*speed) = 1;
return TRUE;
}
else
{
return FALSE;
}
}
BOOL GetRabbitSpeed ( int percent, int * speed )
{
if ( percent >= 1 && percent <= 2 )
{
(*speed) = 0;
return TRUE;
}
else if ( percent >= 3 && percent <= 4 )
{
(*speed) = 9;
return TRUE;
}
else if ( percent == 5 )
{
(*speed) = -12;
return TRUE;
}
else if ( percent >= 6 && percent <= 8 )
{
(*speed) = 1;
return TRUE;
}
else if ( percent >= 9 && percent <= 10 )
{
(*speed) = -2;
return TRUE;
}
else
{
return FALSE;
}
}
void PrintRaceResult ( int tortoisePosition, int rabbitPosition )
{
int tcount;
int rcount;
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
printf ("\n ");
for ( tcount = START_POS; tcount <= RACE_DISTANCE; tcount++ )
{
if ( tcount == tortoisePosition )
{
SetConsoleTextAttribute (hOut, LIGHT_GREEN );
putchar (TORTOISE);
}
else if ( tcount < tortoisePosition )
{
SetConsoleTextAttribute (hOut, LIGHT_GREEN );
putchar (COMPLETE_ROAD);
}
else
{
SetConsoleTextAttribute (hOut, LIGHT_RED );
putchar (ROAD);
}
}
printf ("\n ");
for ( rcount = START_POS; rcount <= RACE_DISTANCE; rcount++ )
{
if ( rcount == rabbitPosition )
{
SetConsoleTextAttribute ( hOut, LIGHT_GREEN );
putchar (RABBIT);
}
else if ( rcount < rabbitPosition )
{
SetConsoleTextAttribute (hOut, LIGHT_GREEN );
putchar (COMPLETE_ROAD);
}
else
{
SetConsoleTextAttribute ( hOut, LIGHT_YELLOW );
putchar (ROAD);
}
}
printf ("\n\n");
}