看到,网上有人问起这个程序,所以写下来自己练习一下。固然很渣,希望大家指点
/*
* =====================================================================================
*
* Filename: GussNumGame.c
*
* Description: A guessing Num Game in c
*
* Version: 1.0
* Created: 01/27/2013 10:12:48 PM
* Revision: none
* Compiler: gcc
*
* Author: Alan Wang (), alan.3976@gmail.com
* Organization:
*
* =====================================================================================
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define DIGNUM 4
#define GUESSTIMES 10
void printSeq(int answer[], int num);
void makeAGuess();
int isRepeat(int arr[], int num);
int isRightAnswer(int answer[], int guess[]);
int answer[DIGNUM] = {0};
int guess[DIGNUM] = {0};
int guessTimes = 0;
int main(void) {
int i;
srand((unsigned)time(NULL));
// Generate answer and make sure
// that the 4 digits are different
// to each other
do {
for (i = 0; i < DIGNUM; i++)
answer[i] = rand()%10;
} while(isRepeat(answer, DIGNUM));
printSeq(answer, DIGNUM);
do {
guessTimes++;
makeAGuess();
} while (guessTimes <= GUESSTIMES && !isRightAnswer(answer, guess));
return 0;
}
void makeAGuess() {
int i;
int guessTemp;
printf("Please input the sequence you guessing! \n");
scanf("%d", &guessTemp);
//split the guessTemp into int guess[DIGNUM]
guess[0] = guessTemp / 1000; //这四句有没有更好的写法?
guess[1] = guessTemp % 1000 / 100;
guess[2] = guessTemp % 1000 % 100 / 10;
guess[3] = guessTemp % 10;
}
int isRightAnswer(int answer[], int guess[]) {
// Flag A means right num at right pos
// Flag B means right num but at wrong pos
int aFlagNum = 0, bFlagNum = 0;
int i, j;
if (guessTimes == GUESSTIMES) {
printf("You are so stupid, the answer is :\n");
printSeq(answer, DIGNUM);
exit(0);
}
for (i = 0; i < DIGNUM; i++) {
for (j = 0; j < DIGNUM; j++) {
if (i == j && answer[i] == guess[j])
aFlagNum++;
else if (i != j && answer[i] == guess[j])
bFlagNum++;
}
}
if (aFlagNum == DIGNUM) {
printf("Good one,you got the answer :\n");
printSeq(answer, DIGNUM);
return 1;
}
printf("\t\t\t\t\t%dA%dB [%d]", aFlagNum, bFlagNum, guessTimes);
printf("\t\t\t");
printSeq(guess, DIGNUM);
return 0;
}
int isRepeat(int answer[], int num) {
int i, j;
for (i = 0; i < DIGNUM; i++) {
for (j = i + 1; j < DIGNUM; j++) {
if (answer[i] == answer[j]) {
return 1;
}
}
}
return 0;
}
void printSeq(int arr[], int num) {
int i;
for (i = 0; i < num; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return;
}