<mosaic.cnfolio.com>

Source Code for 20 Questions Game


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>


/* Animals are listed all in lower case letters & with a space
Binary algorith represenatation is used to determine characteristics for animal and is unique for each case */


#define ANIMALS_LIST      "daddylonglegs bee penguin eagle giraffe octopus tiger elephant jellyfish bull \nparrot dolphin python crocodile cat leopard monkey zebra sheep rat \nowl spider frog polarbear snail tortoise rabbit salmon rhino fox"
#define MAMMALS                    "0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1"
#define FLYING_ANIMALS             "1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
#define WATER_ANIMALS              "0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0"
#define BEAK                       "0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0"

#define NOCTURNAL_ANIMALS          "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1"
#define SHELL_ANIMALS              "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0"
#define SLITHERING_ANIMALS         "0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0"
#define WHISKERS                   "0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1"

#define PAWS                       "0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1"
#define STRIPES                    "0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0"
#define FUR                        "0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 1 0 0 1"
#define FOURLEGGED_ANIMALS         "0 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1"

#define STINGING_ANIMALS           "0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
#define TAIL                       "0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1"
#define SCALES                     "0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0"
#define CARNIVORES                 "0 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1"

#define SPOTS                      "0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
#define GILLS                      "0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0"
#define HORNS                      "0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"
#define FEATHERS                   "0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0"



/* Every enrty in this list will be displayed with a space */
 
#define ANIMAL_DELIMITER  " "


/* Total animals used to determine how much memory the program must need */

#define TOTAL_ANIMALS     30


/* Key to be used by the user for the game to begin generating questions */
 
#define CONTINUE_KEY      "play"


/* User input to show a yes answer */

#define YES_KEY           "yes"


/* User input to show a no answer  */

#define NO_KEY            "no"


/* The user must type this to exit the game */

#define EXIT_KEY           "exit"


/* Buffer size determines amount of characters that can be used */

#define BUFFER_SIZE       32


/* To disable debugging, value must be set to zero. This will not display ongoing changes
A value of one or any other but zero will turn debugging on */


#define DEBUG_STATUS      0



/* Global array to store all the animals in the list and arrays that store each case in index order */

char* animals_list[ TOTAL_ANIMALS ] = { NULL };


int   mammals[ TOTAL_ANIMALS ] = { 0 };

int   flying_animals[ TOTAL_ANIMALS ] = { 0 };

int   water_animals[ TOTAL_ANIMALS ] = { 0 };

int   beak[ TOTAL_ANIMALS ] = { 0 };

int   nocturnal_animals[ TOTAL_ANIMALS ] = { 0 };

int   shell_animals[ TOTAL_ANIMALS ] = { 0 };

int   slithering_animals[ TOTAL_ANIMALS ] = { 0 };

int   whiskers[ TOTAL_ANIMALS ] = { 0 };

int   paws[ TOTAL_ANIMALS ] = { 0 };

int   stripes[ TOTAL_ANIMALS ] = { 0 };

int   fur[ TOTAL_ANIMALS ] = { 0 };

int   fourlegged_animals[ TOTAL_ANIMALS ] = { 0 };

int   stinging_animals[ TOTAL_ANIMALS ] = { 0 };

int   tail[ TOTAL_ANIMALS ] = { 0 };

int   scales[ TOTAL_ANIMALS ] = { 0 };

int   carnivores[ TOTAL_ANIMALS ] = { 0 };

int   spots[ TOTAL_ANIMALS ] = { 0 };

int   gills[ TOTAL_ANIMALS ] = { 0 };

int   horns[ TOTAL_ANIMALS ] = { 0 };

int   feathers[ TOTAL_ANIMALS ] = { 0 };


void  setupGameData();
void  startGame();
void  askUserQuestion( int, char*, int* );
void  displayRemainingAnimals();
int   countRemainingAnimals();
char* findLastAnimal();



/* Start of the program function */

int main( void )
{
/* This statement creates an integer variable with the name "continue_game" and will initialize the value to 1 */
  int continue_game = 1;

  /* Initialize the number of attempts to zero */
  int guesses = 0;

  time_t start_time, end_time;

  setupGameData();

  startGame();

  /* Start timing the game session */
  start_time = time( NULL );
  printf( "\nGame started at %s\n", ctime( &start_time ) );

  /* Start the main loop to play the game */
  do
  {
   /* Increment the attempts counter by 1 */
   guesses++;
   /* Displays each case in the output with the question in index order */
   switch ( guesses )
   {
     case 1:
      askUserQuestion( guesses, "\nQuestion %d: Is your animal a mammal? \n", mammals );
      break;
     case 2:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal fly?  \n", flying_animals );
      break;
     case 3:
      askUserQuestion( guesses, "\nQuestion %d: Does you your animal live in water only or on land & in water? \n", water_animals );
      break;
     case 4:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have a beak? \n", beak );
      break;
     case 5:
      askUserQuestion( guesses, "\nQuestion %d: Is your animal nocturnal? \n", nocturnal_animals );
      break;
     case 6:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have a shell? \n",shell_animals );
      break;
     case 7:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal slither? \n", slithering_animals );
      break;
     case 8:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have whiskers? \n", whiskers );
      break;
     case 9:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have paws? \n", paws );
      break;
     case 10:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have stripes? \n", stripes );
      break;
     case 11:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have fur? \n", fur );
      break;
     case 12:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have four legs? \n", fourlegged_animals );
      break;
     case 13:
      askUserQuestion( guesses, "\nQuestion %d: Can your animal sting? \n", stinging_animals );
      break;
     case 14:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have a tail? \n", tail );
      break;
     case 15:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have scales? \n", scales );
      break;
     case 16:
      askUserQuestion( guesses, "\nQuestion %d: Is your animal a carnivore? \n", carnivores );
      break;
     case 17:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have patterned spots? \n", spots );
      break;
     case 18:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have gills? \n", gills );
      break;
     case 19:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have horns or tusks \n", horns );
      break;
     case 20:
      askUserQuestion( guesses, "\nQuestion %d: Does your animal have feathers? \n", feathers );
      break;
     default :
      /* Losing end of game condition that will be displayed if the program for some reason cannot guess your animal*/
      printf( "\nCongratualtions, You have won, I cannot guess your animal!\n" );

      /* Stop the game */
      continue_game = 0;
      break;
   }

   if ( DEBUG_STATUS )
     displayRemainingAnimals();

   /* Winning end of game condition */
   if ( countRemainingAnimals() == 1 )
   {
     printf( "\nIt took %d attempts to guess your animal, %s!\n", guesses, findLastAnimal() );

     /* Stop the game */
     continue_game = 0;
   }

  } while ( continue_game );

  /* Stop timing the game session */
  end_time = time( NULL );
  printf( "\nGame ended at %s\n", ctime( &end_time ) );

  /* Unix convention is to return zero from main for normal program exit */
  return 0;
}


/*
 * setupGameData : Parses the list of animals and characteristics.
 */

void setupGameData()
{
  char* animal;
  int   index;

  /* Start the process to parse the list of animals and characteristics */
  animal = strtok( strdup( ANIMALS_LIST ), ANIMAL_DELIMITER );

  /* Go through the list of animals until the end of the list is found, indicated by a NULL value */
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   /* Assign the individual animal into the appropriate index */
   animals_list[ index ] = animal;

   /* Continue to the next animal */
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that are mammals*/
  animal = strtok( strdup( MAMMALS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   mammals[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that fly */
  animal = strtok( strdup( FLYING_ANIMALS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   flying_animals[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that can live in water */
  animal = strtok( strdup( WATER_ANIMALS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   water_animals[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }
 
  /* Update characteristic for animals that have a beak */
  animal = strtok( strdup( BEAK ) , ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   beak[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that are nocturnal */
  animal = strtok( strdup( NOCTURNAL_ANIMALS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   nocturnal_animals[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that have a shell */
  animal = strtok( strdup( SHELL_ANIMALS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   shell_animals[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that slither */
  animal = strtok( strdup( SLITHERING_ANIMALS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   slithering_animals[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that have whiskers */
  animal = strtok( strdup( WHISKERS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   whiskers[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals with paws */
  animal = strtok( strdup( PAWS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   paws[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that have stripes */
  animal = strtok( strdup( STRIPES ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   stripes[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that have fur */
  animal = strtok( strdup( FUR ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   fur[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that have four legs */
  animal = strtok( strdup( FOURLEGGED_ANIMALS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   fourlegged_animals[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that sting */
  animal = strtok( strdup( STINGING_ANIMALS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   stinging_animals[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that have a tail */
  animal = strtok( strdup( TAIL ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   tail[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update charactertistic for animals with scales */
  animal = strtok( strdup( SCALES ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   scales[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that are carnivores */
  animal = strtok( strdup( CARNIVORES ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   carnivores[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that have spots */
  animal = strtok( strdup( SPOTS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   spots[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that have gills */
  animal = strtok( strdup( GILLS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   gills[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

  /* Update characteristic for animals that have horns or tusks */
  animal = strtok( strdup( HORNS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   horns[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }

   /* Update characteristic for animals that have feathers */
  animal = strtok( strdup( FEATHERS ), ANIMAL_DELIMITER );
  for ( index = 0; ( index < TOTAL_ANIMALS ) && ( animal != NULL ); index++ )
  {
   feathers[ index ] = atoi( animal );
   animal = strtok( NULL, ANIMAL_DELIMITER );
  }
}


void startGame()
{
  char buffer[ BUFFER_SIZE ];
  int  index;
/* Basic start of game user interface */
  printf(" ----------------------------------------------------\n ");
  printf("||        Welcome To The 20 Questions Game        ||\n");
  printf(" ----------------------------------------------------\n ");

  printf("To exit the game at any point please enter '%s'\n" , EXIT_KEY);
      
  printf(" Please choose an animal from the list:\n\n");
 /* Will display the list of animals stored in the array. Game will only start when user has entered the continue key */
   for ( index = 0; index < TOTAL_ANIMALS; index++ )
   printf( "%s ", animals_list[ index ] );
  printf( "\n\nType in '%s' when you're ready and I will try to guess the animal : ", CONTINUE_KEY);
  scanf( "%s", buffer );
  /* If statement that will enable a program exit when exit key is typed, will only compare text as its not a string compare */
  if ( strcmp( buffer, EXIT_KEY ) == 0 )
   exit(0);
/* Statement showing that if the continue key is not equal to zero game will not play */
  while ( strcmp( buffer, CONTINUE_KEY ) != 0 )
   {
     printf("\nThat is wrong. Please enter play or exit - please note words are case sensitive");
     printf( "\n\nType in '%s' when you're ready and I will try to guess the animal : ", CONTINUE_KEY );
     scanf( "%s", buffer );

     if ( strcmp( buffer, EXIT_KEY ) == 0 )
       exit(0);
   }


  if ( DEBUG_STATUS )
  {
   /* Go through and display the list of animals and characteristics, only if debug is set to a non-zero value */
   for ( index = 0; index < TOTAL_ANIMALS; index++ )
     printf( "%s: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \n", animals_list[ index ], mammals[ index ], flying_animals[ index ], water_animals[ index ], beak[ index ], nocturnal_animals[ index ], shell_animals[ index ], slithering_animals[ index ], whiskers[ index ], paws[ index ], stripes[ index ], fur[ index ], fourlegged_animals[ index ], stinging_animals[ index ], tail[ index ], scales[ index ], carnivores[ index ], spots[ index ], gills[ index ], horns[ index ], feathers[ index ] );
  }
}
 


void askUserQuestion( int guessNumber, char* question, int* animalData )
{
  char buffer[ BUFFER_SIZE ];
  int  index;

  printf( question, guessNumber );
  printf( "Type '%s' if that's correct or '%s' if its wrong: ", YES_KEY, NO_KEY );
  /* Wait for the user answer */
  scanf( "%s", buffer );
  if ( strcmp( buffer, EXIT_KEY ) == 0 )
   exit(0);
/* Statement that enables game to display the next case when the 'yes' or 'no' key is pressed by using a IS NOT logical gate */
  while ( !(strcmp( buffer, YES_KEY ) == 0 || strcmp( buffer, NO_KEY ) == 0) )
/* Print statement to display error messages if a user wrongly inputs a key with a spelling or handling error */
   {
   printf("\nThat was typed incorrectly. Please enter either yes, no or exit\n");
   printf( question, guessNumber );
   printf( "Type '%s' if that's correct or '%s' if its wrong: ", YES_KEY, NO_KEY );
   scanf( "%s", buffer );
   if ( strcmp( buffer, EXIT_KEY ) == 0 )
     exit(0);
   }


  /* Go through the list of remaining animals and take action based on the user answer */
  for ( index = 0; index < TOTAL_ANIMALS; index++ )
  {
   /* Only process if there is an animal at that location in the array */
   if ( animals_list[ index ] != NULL )
   {
     if ( strcmp( buffer, YES_KEY ) == 0 )
     {
      /* If the user answer is yes, then remove animals do not match */
      if ( animalData[ index ] != 1 )
        animals_list[ index ] = NULL;
     }
     else
     {
      /* If the user answer is no, then remove animals which match */
      if ( animalData[ index ] == 1 )
        animals_list[ index ] = NULL;
     }
   }
  }
}



/* Display the list of possible animals remaining */

void displayRemainingAnimals()
{
  int index;

  printf( "\nAnimals remaining: " );
  for ( index = 0; index < TOTAL_ANIMALS; index++ )
  {
   if ( animals_list[ index ] != NULL )
     printf( "%s ", animals_list[ index ] );
  }
  printf( "\n" );
}


/* Determine animals remaining and return a number */
int countRemainingAnimals()
{
  int animals_remaining = 0;
  int index;

  for ( index = 0; index < TOTAL_ANIMALS; index++ )
  {
   if ( animals_list[ index ] != NULL )
     animals_remaining++;
  }

  return animals_remaining;
}


/* Determine last remaining animal available and return it */

char* findLastAnimal()
{
  int index;

  for ( index = 0; index < TOTAL_ANIMALS; index++ )
  {
   if ( animals_list[ index ] != NULL )
     return animals_list[ index ];
  }

  return NULL;
}


User Guide


Welcome to the 20 Questions game


This program is a version of the popular 20 questions game, using animals, in which the computer will attempt to guess your chosen animal.

20 Questions involves you to select an animal from a list of 30. The computer will then begin to ask you random questions in relation to animals and you have to simply answer with a 'yes' or 'no'. The computer will then eliminate the animals that don't relate too the question until one animal is remaining...hopefully the one you initially chose!

When you have a game ready to play you should see the following screen

text

The first instructions explain how to 1. exit the game at any point and 2. the list of animals in which you need to select from. To exit the game, simply enter 'exit' at any given point and the game will automatically end.

text

Once you have chosen your animal ( ensure you know all facts about the animal) you can press 'Play' to start generating the questions. If you accidently type in the word 'Play' with a spelling or handling error, a message will be displayed with the correct way to input 'Play'. Please see below.

text

As soon as you have pressed play to begin a new game, you will be given your first question relating to your animal, along with a sentence below explaining how to input your answer, in this case it can only be yes or no. When you have entered your answer the next question will come up, as shown below.

text

If you accidently type in the word 'yes' or 'no with a spelling or handling error, a message will be displayed with the correct way to input 'yes' & 'no'. Please see below.

text

Questions will contiue to be displayed untill it has guessed your animal, this will be done when only one animal is remaining and the output below shows that you have won by telling you, hopefully the correct animal that you chose at the beggining.

text

















FILE MANAGER

Attachment Timestamp Size
Win.jpg 2008-12-21 14:27 18.97 KB
Answers Error.jpg 2008-12-21 14:27 27.86 KB
Answers.jpg 2008-12-21 14:27 19.39 KB
Play.jpg 2008-12-21 14:27 21.86 KB
Exit.jpg 2008-12-21 14:27 12.16 KB
Start.jpg 2008-12-21 14:26 51.88 KB