寫一個猜數字的游戲
猜數字游戲:
1、電腦會生成一個亂數
2、猜數字
首先明白游戲的玩法:在一定數值范圍內,游戲隨機生成一個數字,玩家輸入比亂數大的數字時,程式會提醒,數值大于目標數,反之亦然,通過不斷試錯,最終找出目標數字,此游戲可以重復玩,
第一步:設立選單(輸出1進行游戲,0退出游戲)
設立一個menu(),選單函式
void menu()
{
printf("*******************************************\n");
printf("************ 1. play 0. exit ************\n");
printf("*******************************************\n");
}
因為游戲可以重復玩,所以需要一次執行,再進行回圈,選擇do…while()陳述句
#include <stdio.h>
void menu()
{
printf("*******************************************\n");
printf("************ 1. play 0. exit ************\n");
printf("*******************************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("請選擇>:");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤\n");
break;
}
}
while(input)
;
return 0;
}
第二步:生成亂數
int rand(void) :回傳一個范圍在 0 到 RAND_MAX 之間的偽亂數,
RAND_MAX 是一個常量,它的默認值在不同的實作中會有所不同,但是值至少是 32767,
使用該函式,需要引頭檔案<stdib.h>
srand 函式是亂數發生器的初始化函式,
它初始化隨機種子,會提供一個種子,這個種子會對應一個亂數,如果使用相同的種子后面的 rand() 函式會出現一樣的亂數,如: srand(1); 直接使用 1 來初始化種子,不過為了防止亂數每次重復,常常使用系統時間來初始化,即使用 time函式來獲得系統時間,它的回傳值為從 00:00:00 GMT, January 1, 1970 到現在所持續的秒數,然后將time_t型資料轉化為(unsigned)型再傳給srand函式,即: srand((unsigned) time(&t)); 還有一個經常用法,不需要定義time_t型t變數,即: srand((unsigned) time(NULL)); 直接傳入一個空指標,因為你的程式中往往并不需要經過引數獲
得的資料,
需要參考頭檔案<time.hw>
void game()
{
int ret = 0;
srand((unsigned int)time(NULL));
ret =rand();
printf("%d\n", ret);
printf("猜數字游戲\n");
}

此時生成了亂數,但是如果輸入數字的時間過快,可能會輸出相同的數字,而且是遞增的,
所以srand((unsigned int)time(NULL))位置需要調整到主函式內,即:
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
.....

解決了生成亂數的問題,但是rand()函式生成的數字是0到32767,對于猜數字游戲來說,范圍太大,將范圍調整成1~100,
想要輸出給定范圍之內的亂數,需要使用rand() % (b - a + 1)+ a,顯然,rand()% (b - a + 1)的范圍是[0,b - a],再加上a之后的范圍就是[a,b]下面的代碼是生成[0,2]和[3,8]范圍內的亂數,
void game()
{
int ret = 0;
ret =rand()%100+1;
printf("%d\n", ret);
printf("猜數字游戲\n");
}
第三步:進行數字判斷
while(1)
{
printf("請猜數字:>");
scanf("%d",&guess);
if(guess>ret)
{
printf("猜大了\n");
}
else if(guess<ret)
{
printf("猜小了\n");
}
else
{
printf("猜對了\n");
break;
}
}
}
最終效果
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
int guess = 0;
int ret = 0;
ret =rand()%100+1;
while(1)
{
printf("請猜數字:>");
scanf("%d",&guess);
if(guess>ret)
{
printf("猜大了\n");
}
else if(guess<ret)
{
printf("猜小了\n");
}
else
{
printf("猜對了\n");
break;
}
}
}
void menu()
{
printf("*******************************************\n");
printf("************ 1. play 0. exit ************\n");
printf("*******************************************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇>:");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤\n");
break;
}
}while(input);
return 0;
}

在整個代碼撰寫程序中,最復雜的就是隨機值的生成,要明白srand()和rand()函式的使用,
計算機并不能產生真正的亂數,而是已經撰寫好的一些無規則排列的數字存盤在電腦里,把這些數字劃分為若干相等的N份,并為每份加上一個編號用srand()函式獲取這個編號,然后rand()就按順序獲取這些數字,當srand()的引數值固定的時候,rand()獲得的數也是固定的,所以一般srand的引數用time(NULL),因為系統的時間一直在變,所以rand()獲得的數,也就一直在變,相當于是亂數了,只要用戶或第三方不設定隨機種子,那么在默認情況下隨機種子來自系統時鐘,如果想在一個程式中生成亂數序列,需要至多在生成亂數之前設定一次隨機種子,
即:只需在主程式開始處呼叫 srand((unsigned int)time(NULL)); 后面直接用rand就可以了,不要在 for 等回圈放置,
srand()函式描述
rand()函式描述
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/273602.html
標籤:其他
