- 论坛徽章:
- 1
|
劣质代码评析[url]http://www.cnblogs.com/pmer/archive/2012/10/20/2731910.html[/url]
一时手痒写了几行代码,但是觉得很难看,求解毒
- #include<stdlib.h>
- #include<stdio.h>
- #include<time.h>
- #define MASK 1
- #define MARK_SET(inNum,mark) (mark|=(MASK<<(inNum)))
- #define CHECK_EXIST(inNum,mark) (mark&(MASK<<(inNum)))
- #define RESET_MARK(mark) mark=0
- #define CREATE_MARK(mark) int mark=0
- #define RESET_TIPS(ti) ti.num=0;ti.A_Counts=0;ti.B_Counts=0
- #define NUM_LENGTH 4
- #define NUM_MOD 10
- #define MAX_TIMES 10
- typedef struct _tips_info{
- int num;
- int A_Counts;
- int B_Counts;
- }tips_info,*ptips_info;
- int generate(int*);
- void tips(int,int*,int,ptips_info);
- int show_tips(ptips_info,int);
- void show_num(int*);
- int main(void)
- {
- srand((unsigned)time(NULL)); //这句是抄袭
- int num[NUM_LENGTH];
- int mark = generate(num);
- tips_info ti;
- int input;
- int i = 0;
- for(;i<MAX_TIMES;i++)
- {
- printf("guess num(%d):",NUM_LENGTH);
- scanf("%d",&input); //此处不知如何处理。假定输入的就是4位整数
- RESET_TIPS(ti);
- tips(input,num,mark,&ti);
- if(show_tips(&ti,1))return 0;
- }
- printf("game over!");
- show_num(num);
- return 0;
- }
- void show_num(int * numAr)
- {
- int num = 0;
- int i = NUM_LENGTH;
- for(;i>0;i--) num = num*10+numAr[i-1];
- printf("%d\n",num);
- }
- int show_tips(ptips_info ti,int reset)
- {
- if(ti->A_Counts==NUM_LENGTH)
- {
- printf("congratulations!(%d)\n",ti->num);
- return 1;
- }
- else
- printf("%dA%dB:[%d]\n",ti->A_Counts,ti->B_Counts,ti->num);
- return 0;
- }
- void tips(int num,int* numAr,int mark,ptips_info ti)
- {
- ti->num = num;
- CREATE_MARK(submark);
- int i = 0;
- for(;i<NUM_LENGTH;i++)
- {
- int sub = num%NUM_MOD;
- num /= NUM_MOD;
- if(sub==numAr[i])
- {
- ti->A_Counts++;
- if(CHECK_EXIST(sub,submark))ti->B_Counts--;
- }
- else if(!CHECK_EXIST(sub,submark)&&CHECK_EXIST(sub,mark))ti->B_Counts++;
- MARK_SET(sub,submark);
- }
- }
- int generate(int * numAr)
- {
- CREATE_MARK(mark);
- int i = NUM_LENGTH;
- for(;i>0;i--)
- {
- int num;
- do
- {
- num = rand()%NUM_MOD;
- }while(CHECK_EXIST(num,mark)&&(mark||num));
- numAr[i-1] = num;
- MARK_SET(num,mark);
- }
- return mark;
- }
复制代码 {:3_190:} |
|