寫一個猜數字的遊戲
猜數字遊戲:
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()函數描述