2010年6月6日 星期日

猜數字遊戲,幾A幾B的那種《指標版》

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

struct numeric_rec{
   char a;
   char b;
};
typedef struct numeric_rec nr;
int is_in(char *a,int n);
int main()
{
    int i,j,num=4;
    char *ans=NULL,*usr=NULL,*ptr=NULL,tmp,chk;
    nr col={0,0};
    long tt;
    srand(time(&tt)%60);
    ans=(char *)malloc(sizeof(char)*num);
    for(i=0;i<num;i++){
        if(i>0){
           do{
               ptr=ans;
               tmp=rand()%10;
               chk=0;
               while(ptr!=&ans[i]){
                  if(*(ptr++)==(tmp+48)){
                     chk=1;
                     break;
                  }
               }
           }while(chk==1);
           ans[i]=tmp+48;
        }else{
           tmp=rand()%10;
           ans[i]=48+tmp;
        }       
    }
    usr=(char *)malloc(sizeof(char)*(num+1));
    printf("%d位數\n",num);
    do{
        col.a=0;
        col.b=0;
        printf("猜:");
        scanf("%s",usr);
        if(is_in(usr,num) || strlen(usr)!=num){
           printf("數字不符或重覆!\n");
           continue;
        }
        printf("\n結果:");
        for(i=0;i<num;i++){
           chk=0;
           for(j=0;j<num;j++){
               if(usr[i]==ans[j]){
                   if(i==j){
                       col.a++;
                       chk=1;
                   }else{
                       col.b++;
                   }
               }
           }
           if(chk==1){
              printf("[%c]",usr[i]);
           }else{
              printf("%c",usr[i]);
           }
        }
        printf(" (%dA%dB)\n",col.a,col.b);
    }while(col.a!=num);
    system("pause");
    return 0;
}
int is_in(char *a,int n){
   char chk[10]={0,0,0,0,0,0,0,0,0,0};
   int i,tmp;
   for(i=0;i<n;i++){
      tmp=a[i]-48;
      if(chk[tmp]!=1){
          chk[tmp]=1;
      }else{
          return 1;
      }
   }
   return 0;
}

沒有留言:

張貼留言