Я предлагаю вам исправить это, я сделаю это гораздо менее сложным. Победитель Rock-Paper-Scisors может быть определен арифметически.
Проще сравнивать подобное для лайка, а использование целочисленных значений позволяет получить более простое арифметическое решение c. Также арифметически проще использовать 0,1,2, а не 1,2,3. Поэтому сначала преобразуйте пользовательский ввод в 0,1,2:
#define INVALID_SELECTION sizeof(rps)
static const char rps[] = {'r', 'p', 's'} ;
int human = INVALID_SELECTION ;
while( human == INVALID_SELECTION )
{
printf("\nEnter R for Rock, P for Paper, or S for Scissors: ");
char ch = 0 ;
scanf("%c", &ch ) ;
while( ch != '\n' && getchar() != '\n' ) ;
for( human = 0;
human < INVALID_SELECTION && tolower(ch) != rps[human] ;
human++ )
{
// do nothing
}
}
Затем следует определить компьютерную игру:
srand( (int)time(NULL) ) ;
int computer = rand() % 3 ;
, хотя обратите внимание, что вам нужен только вызов srand()
один раз, так что если вы поместите игру в oop, чтобы повторить игру, вызов srand()
должен появиться до повтор l oop.
Затем вы можете сообщить об игре таким образом:
static const char* play_lookup[] = { "Rock", "Paper", "Scissors" } ;
printf( "Human played %s\n", play_lookup[human] ) ;
printf( "Computer played %s\n", play_lookup[computer] ) ;
Тогда human
и computer
прямо и арифметически сопоставимы так, что:
int battle = human - computer ;
if( battle < 0 ) battle += 3 ;
switch( battle )
{
case 0 : printf( "Draw!\n" ) ; break ;
case 1 : printf( "Human wins!\n" ) ; break ;
case 2 : printf( "Computer wins!\n" ) ; break ;
}
из (кредит @ HAL9000):
int battle = ((human - computer) + 3) % 3 ;
switch( battle )
...
Собираем все вместе:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
int main()
{
// Randomize
srand( (int)time(NULL) ) ;
// Repeat play indefinitely
for(;;)
{
#define INVALID_SELECTION sizeof(rps)
static const char rps[] = {'r', 'p', 's'} ;
int human = INVALID_SELECTION ;
// While human input is not one of R,P,S,r,p or s...
while( human == INVALID_SELECTION )
{
printf("\nEnter R for Rock, P for Paper, or S for Scissors: ");
char ch = 0 ;
scanf("%c", &ch ) ;
while( ch != '\n' && getchar() != '\n' ) ;
// Transform input to one of 0,1,2 (for R,P,S respectively)
for( human = 0;
human < INVALID_SELECTION && tolower(ch) != rps[human] ;
human++ )
{
// do nothing
}
}
// Get computer's play
int computer = rand() % 3 ;
// Report human and computer plays in full text
static const char* play_lookup[] = { "Rock", "Paper", "Scissors" } ;
printf( "Human played %s\n", play_lookup[human] ) ;
printf( "Computer played %s\n", play_lookup[computer] ) ;
// Calculate and report result
int battle = ((human - computer) + 3) % 3 ;
switch( battle )
{
case 0 : printf( "Draw!\n" ) ; break ;
case 1 : printf( "Human wins!\n" ) ; break ;
case 2 : printf( "Computer wins!\n" ) ; break ;
}
}
return 0;
}
Пример вывода:
Enter R for Rock, P for Paper, or S for Scissors: r
Human played Rock
Computer played Rock
Draw!
Enter R for Rock, P for Paper, or S for Scissors: r
Human played Rock
Computer played Scissors
Human wins!
Enter R for Rock, P for Paper, or S for Scissors: r
Human played Rock
Computer played Rock
Draw!
Enter R for Rock, P for Paper, or S for Scissors: r
Human played Rock
Computer played Scissors
Human wins!
Enter R for Rock, P for Paper, or S for Scissors: r
Human played Rock
Computer played Paper
Computer wins!
Enter R for Rock, P for Paper, or S for Scissors: p
Human played Paper
Computer played Paper
Draw!
Enter R for Rock, P for Paper, or S for Scissors: p
Human played Paper
Computer played Scissors
Computer wins!
Enter R for Rock, P for Paper, or S for Scissors: p
Human played Paper
Computer played Rock
Human wins!
Enter R for Rock, P for Paper, or S for Scissors: s
Human played Scissors
Computer played Scissors
Draw!
Enter R for Rock, P for Paper, or S for Scissors: s
Human played Scissors
Computer played Paper
Human wins!
Enter R for Rock, P for Paper, or S for Scissors: s
Human played Scissors
Computer played Paper
Human wins!
Enter R for Rock, P for Paper, or S for Scissors: s
Human played Scissors
Computer played Scissors
Draw!
Enter R for Rock, P for Paper, or S for Scissors: s
Human played Scissors
Computer played Rock
Computer wins!
Enter R for Rock, P for Paper, or S for Scissors: R
Human played Rock
Computer played Scissors
Human wins!
Enter R for Rock, P for Paper, or S for Scissors: P
Human played Paper
Computer played Paper
Draw!
Enter R for Rock, P for Paper, or S for Scissors: S
Human played Scissors
Computer played Paper
Human wins!
Enter R for Rock, P for Paper, or S for Scissors: xx
Enter R for Rock, P for Paper, or S for Scissors: yy
Enter R for Rock, P for Paper, or S for Scissors: zz
Enter R for Rock, P for Paper, or S for Scissors: