天天看點

寫一個猜數字的遊戲

寫一個猜數字的遊戲

猜數字遊戲:

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()函數描述

繼續閱讀