C語言編寫猜數字小遊戲
阿新 • • 發佈:2021-01-22
C語言編寫猜數字小遊戲
經過對C語言的初步學習,為提高程式設計能力,可以敲一些稍費腦筋的程式碼,猜數字就是一個很好的選擇。要想實現該遊戲,那麼首先我們應該知道製作的大體思路。
- 電腦應隨機產生一個數字(為便於玩家猜的同時,增加難度和趣味性,所以選擇1~100)
- 玩家輸入所猜數字,電腦給予反饋。
- 玩家得知反饋後進行進一步操作。
(如:所猜數字過大,所猜數字過小,所猜數字正確(是否重玩一局))
知道大體思路後我們就可以著手寫程式碼了
首先玩遊戲肯定要有進入介面,讓別人知道這是什麼遊戲。
#include<stdio.h>//標頭檔案萬萬不能忘
void menu ()//無需返回值
{
printf("*********猜數字********\n");
printf("********1.PLAY********\n");
printf("********0.EXIT********\n");
}
接著可以將主函式大體寫出來
int main()
{
srand((unsigned int)time(NULL));//產生隨機數
int input = 0;
do//選用do—while是因為它可以先執行後判斷,符合當前需求
{
menu();
printf("請選擇(1/0)\n" );
scanf("%d", &input);
switch (input)//在此如果使用if語句有些繁瑣
{
case 1:
game();//遊戲主體,下面會寫到
break;
case 0:
printf("退出遊戲\n");
break;
default:
printf("輸錯啦,請重新輸入\n");//應對輸錯情況
break;
}
} while(input);//0為假,非0為真,所以借input判斷迴圈是否執行
return 0;
}
然後就是重頭戲——遊戲主體
根據思路首先要產生隨機數
Generates a pseudorandom number.
int rand( void );
The rand function returns a pseudorandom integer in the range 0 to RAND_MAX. Use the srand function to seed the pseudorandom-number generator before calling rand.
MSDN上對rand部分解釋如上,我們可以知道rand的返回值在0到RAND_MAX(0x7fff,十進位制為32767)之間,那麼它是否可以起到產生隨機數的作用呢?
經測試其確實可以產生隨機數,但再次編譯時不難發現,兩次的數字是相同的,這就使遊戲的趣味性下降了。
srand
Sets a random starting point.
void srand( unsigned int seed );
所以需要srand為其提供生成起點,但srand又需要一個變化的隨機數種子來幫助rand生成隨機數,所以我們引入一個時間戳的概念(時間戳:當前時間和計算機的起始時間的差值,單位是秒;計算機起始時間:1970年1月1日上午8:00:00)time()函式返回的即是時間戳,時間肯定是一直在改變的,即時間戳也是如此。因每次只需取一次隨機種子,所以將該語句放在主函式中。
void game()
{
int ret = rand() % 100+1;//因為rand取值範圍為0~32767,所以%100並+1使其<=100
int num;
while (1)//只要沒猜出來就一直猜
{
printf("猜猜看:");
scanf("%d", &num);
if (num > ret)
{
printf("猜大了\n");
}
else if (num < ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你猜對了\n");
break;//猜對後跳出迴圈
}
}
}
最後再寫一下主程式
#include<stdio.h>
#include<stdlib.h>//為使用time()函式
void menu()
{
printf("********猜數字********\n");
printf("********1.PLAY********\n");
printf("********0.EXIT********\n");
}
void game()
{
int ret = rand() % 100+1;//因為rand取值範圍為0~32767,所以%100並+1使其<=100
int num;
while (1)//只要沒猜出來就一直猜
{
printf("猜猜看:");
scanf("%d", &num);
if (num > ret)
{
printf("猜大了\n");
}
else if (num < ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你猜對了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do//選用do—while是因為它可以先執行後判斷,符合當前需求
{
menu();
printf("請選擇(1/0)\n");
scanf("%d", &input);
switch (input)//在此如果使用if語句有些繁瑣
{
case 1:
game();//遊戲主體,下面會寫到
break;
case 0:
printf("退出遊戲\n");
break;
default:
printf("輸錯啦,請重新輸入\n");//應對輸錯情況
break;
}
} while(input);//0為假,非0為真,所以借input判斷迴圈是否執行
return 0;
}
ps:第一次寫技術類部落格,還有很多地方需要改正完善,望各位大佬可以指出我的不足。