C語言猜數(shù)字游戲重寫版

字號:

其實這個程序算法上很簡單,所以寫得很長是想實現(xiàn)一個好的人機交互,這可以在creatDialog()的眾多語句中看出來。此外改動了以前的隨機數(shù)生成函數(shù),并對原數(shù)和輸入數(shù)得比較函數(shù)的格式完全重寫(其實算法大致一樣,執(zhí)行效率不一定能提高,不過代碼長度大大減少)。
    不足之處還望大家不吝賜教。
    #include
    #include
    #include
    struct right_place {int right; int place;};
    int main (void)
    {
     int creatDialog (int x, int *p );
     void rndProduce (int numDft[]);
     struct right_place numCompare (int numDft[], int numIn[]);
     int dialog, quitOrContinue, allQuit;
     int numDft[4], numIn[4], result[2];
     struct right_place compareBack;
     creatDialog (1, NULL);
     allQuit = 1;
     while (allQuit == 1)
     {
     creatDialog (7, NULL);
     rndProduce (numDft);
     quitOrContinue = 1;
     while (quitOrContinue == 1)
     {
     dialog = 2;
     while (dialog == 2)
     {
     creatDialog (2, numIn);
     dialog = creatDialog (3, numIn);
     }
     compareBack = numCompare (numDft, numIn);
     result[0] = compareBack.right ;
     result[1] = compareBack.place ;
     quitOrContinue = creatDialog (4, result);
     }
     if (quitOrContinue == 2)
     allQuit = creatDialog (5, numDft);
     if (quitOrContinue == 3)
     allQuit = 1;
     if (quitOrContinue == 4)
     allQuit = 2;
     }
     if (allQuit == 2)
     creatDialog (6, NULL);
     getchar ();
     return 0;
    }
    int creatDialog (int x, int *p)
    {
     int back;
     int i;
     switch (x)
     {
     case 0:
     printf ("************************************************************************\n");
     break;
     case 1:
     creatDialog (0, NULL);
     printf ("歡迎玩猜數(shù)字游戲!\n版本2.0\n作者:andyzhshg\n制作日期:2007.9.1\n");
     creatDialog (0, NULL);
     printf ("在本游戲中,你需要輸入四個數(shù)字,\n然后電腦會給出你猜測的正確情況。");
     printf ("電腦會用它之前生成的\n四位數(shù)與之你的輸入比較,然后告訴你");
     printf ("你猜對了幾個數(shù)字,包\n括數(shù)值和順序的信息.\n");
     break;
     case 2:
     creatDialog (0, NULL);
     printf ("請輸入你猜測的四位數(shù)字(用空格、回車、或Tab隔開):\n");
     for (i = 0; i < 4; i++, p++)
     scanf ("%i", p);
     break;
     case 3:
     creatDialog (0, NULL);
     printf ("你輸入的數(shù)字是:%i %i %i %i ,確認請輸入“1”,重新輸入按“2”。\n", *p, *(p + 1), *(p + 2), *(p + 3));
     scanf ("%i", &back);
     return back;
     break;
     case 4:
     creatDialog (0, NULL);
     printf ("你輸入的數(shù)字中:\n數(shù)值和位置都正確的有%i個,\n數(shù)值正確但位置不正確的有%i個.\n", *p, *(p+1));
     if ((*p) == 4)
     {
     printf ("恭喜你,答對了!\n");
     printf ("繼續(xù)游戲嗎?繼續(xù)請輸入“1”,退出游戲請輸入“2”。\n");
     scanf ("%i", &back);
     if (back == 1)
     return 3;
     if (back == 2)
     return 4;
     }
     else
     {
     printf ("繼續(xù)嗎?繼續(xù)請輸入“1”,顯示正確答案請輸入“2”。\n");
     scanf ("%i", &back);
     return back;
     }
     break;
     case 5:
     creatDialog (0, NULL);
     printf ("正確答案是:%i %i %i %i,再接再厲啊!\n", *p, *(p + 1), *(p + 2), *(p + 3));
     printf ("繼續(xù)游戲嗎?繼續(xù)請輸入“1”,退出游戲請輸入“2”。\n");
     scanf ("%i", &back);
     return back;
     break;
     case 6:
     creatDialog (0, NULL);
     printf ("感謝你玩本游戲,再見!\n按任意鍵退出\n");
     break;
     case 7:
     creatDialog (0, NULL);
     printf ("新的游戲開始了!GOOD LUCK!\n");
     break;
     default:
     break;
     }
    }
    void rndProduce (int numDft[])
    {
     int i;
     srand( (unsigned)time( NULL ) ) ;
     for ( i = 0; i < 4; i++)
     numDft[i] = rand () % 10;
     //printf ("%i %i %i %i\n", numDft[0], numDft[1], numDft[2], numDft[3]);
    }
    struct right_place numCompare (int numDft[], int numIn[])
    {
     int i, j;
     struct {int Dft; int In;} flag[4] = { 1, 1, 1 ,1 ,1, 1, 1, 1 };
     struct right_place result = { 0, 0 };
     for (i = 0; i < 4; i++)
     if (numDft[i] == numIn[i])
     {
     (result.right)++;
     flag[i].Dft = 0;
     flag[i].In = 0;
     }
     for (i = 0; i < 4; i++)
     for (j = 0; j < 4; j++)
     if (flag[i].Dft && flag[j].In && numDft[i] == numIn[j])
     {
     (result.place)++;
     flag[i].Dft = 0;
     flag[j].In = 0;
     }
     return result;
    }