猜4个不同数字的游戏

看到,网上有人问起这个程序,所以写下来自己练习一下。固然很渣,希望大家指点


/*
 * =====================================================================================
 *
 *       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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值