目錄
創(chuàng)新互聯(lián)專(zhuān)注于五常企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城網(wǎng)站建設(shè)。五常網(wǎng)站建設(shè)公司,為五常等地區(qū)提供建站服務(wù)。全流程定制設(shè)計(jì),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)前言
一、c語(yǔ)言版本
1.游戲設(shè)計(jì)思路
2.rand()及srand()函數(shù)的使用
2.取模確定取值范圍
3.條件運(yùn)算符
4.利用二分法進(jìn)行猜測(cè)
二、java版本
1.Math.random()的用法
2.整體代碼展示
總結(jié)
系統(tǒng)隨機(jī)提供一個(gè)某范圍內(nèi)的數(shù)字,讓用戶進(jìn)行逐步地猜測(cè),那么你是否能猜出系統(tǒng)先生心中所想的數(shù)字呢?
今天為大家?guī)?lái)一個(gè)c語(yǔ)言和java版本的猜數(shù)字小游戲,雖然實(shí)現(xiàn)過(guò)程十分簡(jiǎn)單,但也有些小細(xì)節(jié)希望初學(xué)者能夠理解掌握。
(注:1.文中代碼段由作者自己編寫(xiě),若有紕漏或錯(cuò)誤,歡迎大家指正;2.作者本人為初學(xué)者,編程水平有待提高,所寫(xiě)博客皆為本人的筆記和一些簡(jiǎn)單知識(shí)的分享,還望各位路過(guò)的大佬嘴下留情)
一、c語(yǔ)言版本 1.游戲設(shè)計(jì)思路我們先來(lái)探討一下猜數(shù)字小游戲的整體設(shè)計(jì)思路。
2.rand()及srand()函數(shù)的使用
- 首先我們需要系統(tǒng)提供一個(gè)[0,100]范圍內(nèi)的隨機(jī)整數(shù)(可自定義范圍),再進(jìn)行逐步猜測(cè)。
- 其次對(duì)于我們所輸入的不同數(shù)字,系統(tǒng)根據(jù)判斷作出三種不同的答復(fù):
ⅰ當(dāng)輸入數(shù)字小于系統(tǒng)所給數(shù)字,則輸出“You guessed the number down”,猜測(cè)繼續(xù);
ⅱ當(dāng)輸入數(shù)字大于系統(tǒng)所給數(shù)字,則輸出“You guessed the number up”,猜測(cè)繼續(xù);
ⅲ當(dāng)輸入數(shù)字等于系統(tǒng)所給數(shù)字,則輸出“Congratulations! You guessed it”,猜測(cè)結(jié)束。
當(dāng)我們理解了整體設(shè)計(jì)思路之后,就可以正式開(kāi)始敲寫(xiě)程序了。
如何讓系統(tǒng)為我們提供一個(gè)0到100的隨機(jī)整數(shù)呢?這時(shí)c語(yǔ)言中的rand()函數(shù)就派上用場(chǎng)了。
rand()函數(shù):系統(tǒng)會(huì)隨機(jī)提供一個(gè)位于 0 ~ RAND_MAX 之間的整數(shù)。C語(yǔ)言標(biāo)準(zhǔn)并沒(méi)有規(guī)定 RAND_MAX 的具體數(shù)值,只是規(guī)定它的值至少為 32767。在實(shí)際編程中,我們也不需要知道?RAND_MAX 的具體值,把它當(dāng)做一個(gè)很大的數(shù)來(lái)對(duì)待即可。
一個(gè)隨機(jī)數(shù)生成的實(shí)例:
#include#include//需調(diào)用rand()函數(shù)
int main()
{
int a = rand();
printf("%d\n",a);
return 0;
}
運(yùn)行結(jié)果實(shí)例:
可是當(dāng)我們多次運(yùn)行這段程序時(shí),就會(huì)產(chǎn)生疑問(wèn)了,為什么我每次生成的隨機(jī)數(shù)都是一個(gè)數(shù)呢?隨機(jī)數(shù)難道不隨機(jī)嗎?
其實(shí)并不然,實(shí)際上,rand() 函數(shù)產(chǎn)生的隨機(jī)數(shù)是偽隨機(jī)數(shù),是根據(jù)一個(gè)數(shù)值按照某個(gè)公式推算出來(lái)的,這個(gè)數(shù)值我們稱之為“種子”。
種子在每次啟動(dòng)計(jì)算機(jī)時(shí)是隨機(jī)的,但是一旦計(jì)算機(jī)啟動(dòng)以后它就不再變化了,也就是說(shuō),每次啟動(dòng)計(jì)算機(jī)以后,種子就是定值了。
那我們到底如何才能真正地生成一個(gè)隨機(jī)數(shù)呢,這時(shí)我們就可以使用標(biāo)題中所提到的srand()函數(shù)來(lái)對(duì)“種子”進(jìn)行重新“播種”。
“播種”原理:srand()函數(shù)需要一個(gè) unsigned int 類(lèi)型的參數(shù),使用
頭文件中的 time() 函數(shù)即可得到當(dāng)前的時(shí)間(精確到秒),用時(shí)間作為參數(shù):srand((unsigned)time(NULL)) 只要每次播種的時(shí)間不同,那么生成的種子就不同,最終的隨機(jī)數(shù)也就不同、
對(duì)之前的代碼進(jìn)行修改:
#include#include//需調(diào)用srand()函數(shù)
#include//需調(diào)用time()函數(shù)
int main()
{
int a;
srand((unsigned)time(NULL));
a = rand();
printf("%d\n", a);
return 0;
}
多次的運(yùn)行結(jié)果實(shí)例:
具體的隨機(jī)教程可見(jiàn)下方鏈接,在此只做部分的知識(shí)分享(作者本人也是通過(guò)此教程進(jìn)行學(xué)習(xí)的)C語(yǔ)言隨機(jī)數(shù)生成教程,C語(yǔ)言rand和srand用法詳解 (biancheng.net)http://c.biancheng.net/view/2043.html
2.取模確定取值范圍當(dāng)我們掌握了rand()及srand()函數(shù)的用法,接著就可以對(duì)這個(gè)隨機(jī)數(shù)進(jìn)行一個(gè)范圍的圈定,在本文我們采用取模的方法確定隨機(jī)數(shù)在[0,100]之內(nèi)。
3.條件運(yùn)算符確定范圍:
int a = rand()%100;
分析:
取模即取余,而其余數(shù)的范圍即是隨機(jī)數(shù)范圍的子集。
當(dāng)被除數(shù)小于101時(shí),其余數(shù)皆為0;
當(dāng)被除數(shù)無(wú)論多大,其余數(shù)大只能為100,因?yàn)楫?dāng)你余數(shù)大于或等于100時(shí),只能說(shuō)明你沒(méi)有除盡;
這樣我們就得到了隨機(jī)數(shù)的范圍[1,100]。
當(dāng)我們獲得了[0,100]內(nèi)的一個(gè)隨機(jī)整數(shù),問(wèn)題基本上已經(jīng)解決的差不多了。
下面展示完整代碼:?
#include#include//需要調(diào)用rand()及srand()函數(shù)
#include//需要調(diào)用time()函數(shù)
int main()
{
//每秒進(jìn)行一次播種
srand((unsigned)time(NULL));
//系統(tǒng)隨機(jī)給出一個(gè)整數(shù)
int r_number = rand() % 101; //函數(shù)返回一個(gè)0~RAND_MAX范圍內(nèi)的整數(shù),取模確定取值范圍
//用戶循環(huán)輸入整數(shù),進(jìn)行猜測(cè)
printf("Please guess\n"); //打印提示信息
int number = -1;
while (number != r_number) //用戶猜測(cè)數(shù)字不等于隨機(jī)數(shù)字,滿足條件進(jìn)行循環(huán)
{
scanf("%d", &number);
if (number != r_number)
printf((number >r_number) ? "You guessed the number up\n" : "You guessed the number down\n");
else
printf("Congratulations! You guessed it");
}
}
下面展示運(yùn)行結(jié)果:?
有的朋友或許會(huì)對(duì)第18行的代碼有些疑惑,這里有一個(gè)小小的知識(shí)點(diǎn),關(guān)于條件運(yùn)算符的使用。
條件運(yùn)算符的使用:
首先我們先來(lái)看一段代碼?
if(a >b) { max = a; } else { max = b; }
我們可以嘗試用條件運(yùn)算符來(lái)優(yōu)化這段代碼
max = (a>b) ? max=a : max=b;
第一段代碼通過(guò)使用條件運(yùn)算符便簡(jiǎn)化成了一串代碼,可見(jiàn)條件運(yùn)算符的便利之處。
什么是條件運(yùn)算符呢?
條件運(yùn)算符是由一組“?”和“:”兩個(gè)符號(hào)組成,判斷“?”前的表達(dá)式的真假,若真,執(zhí)行“:”前的語(yǔ)句;若假,執(zhí)行“:”后的語(yǔ)句。
條件運(yùn)算符的一般形式:
表達(dá)式1 ? 表達(dá)式2 : 表達(dá)式3;
當(dāng)我們掌握了條件運(yùn)算符的使用后,再來(lái)看第18段代碼究竟是什么意思?
printf((number >r_number) ? "You guessed the number up\n" : "You guessed the number down\n");
首先判斷number是否大于r_number,若是,則輸出“You guessed the number up”;若否,則輸出“You guessed the number down”。
這樣一來(lái),對(duì)于條件運(yùn)算符存在疑惑的朋友們是不是能夠理解了呢。
4.利用二分法進(jìn)行猜測(cè)為什么說(shuō)方法正確的話,100以內(nèi)的數(shù)最多猜7次就夠了呢?
這里再為大家分享一個(gè)猜測(cè)100以內(nèi)的數(shù)的方法,叫做二分法。
二分法查找:
數(shù)據(jù)是按升序排序的,對(duì)于給定值1,從序列的中間位置50開(kāi)始比較,
如果當(dāng)前位置等于key,則查找成功;
若key小于當(dāng)前位置值arr[k],則在數(shù)列的前半段中查找,arr[low,mid-1];
若key大于當(dāng)前位置值arr[k],則在數(shù)列的后半段中繼續(xù)查找arr[mid+1,high],
直到找到為止
我們來(lái)分析100以內(nèi)猜數(shù)字的最壞情況復(fù)雜度:假設(shè)系統(tǒng)給出的隨機(jī)數(shù)為1,見(jiàn)下圖:
對(duì)于給定值1,從序列的中間位置50開(kāi)始比較,1小于當(dāng)前位置值50,則在數(shù)列的前半段中查找,如此反復(fù),在經(jīng)過(guò)7次的猜測(cè)后,我們終于猜到了系統(tǒng)所給的值。
所以說(shuō)100以內(nèi)的數(shù)最多猜7次就夠了。
二、java版本 1.Math.random()的用法java版本的猜數(shù)字小游戲與c語(yǔ)言版本的整體設(shè)計(jì)思路相同,但值得注意的是,在java版本中使系統(tǒng)提供隨機(jī)數(shù)的方法與c語(yǔ)言版本不同,這里提供其中一種方法,運(yùn)用Math.random()語(yǔ)句。
Math.random()語(yǔ)句:
是一個(gè)隨機(jī)函數(shù)。利用該函數(shù)可以取得0到1之間的隨機(jī)小數(shù),如果想得到一個(gè)大于1的隨機(jī)值,則需要再乘以一定的數(shù)值來(lái)實(shí)現(xiàn)。
而這里我們需要得到一個(gè)[1,100]的隨機(jī)整數(shù),
首先我們將Math.random()乘以100再加一,此時(shí)其范圍為[0,101)的浮點(diǎn)數(shù);
其次再將Math.random()強(qiáng)制轉(zhuǎn)換為整形,如下:
int r_number = ((int)(Math.random()*100+1));
2.整體代碼展示如此,我們便得到了系統(tǒng)提供的一個(gè)隨機(jī)數(shù),下面展示整體代碼:
package text;
import java.util.Scanner;
public class Text {
public static void main(String[] args) {
//系統(tǒng)隨機(jī)給出一個(gè)整數(shù)
Scanner in = new Scanner(System.in);
int r_number = ((int)(Math.random()*100+1));
//用戶循環(huán)輸入整數(shù),進(jìn)行猜測(cè)
System.out.println("Please guess"); //打印提示信息
int number = 0;
while (number != r_number) //用戶猜測(cè)數(shù)字不等于隨機(jī)數(shù)字,滿足條件進(jìn)行循環(huán)
{
number = in.nextInt();
if (number != r_number)
System.out.print((number >r_number) ? "You guessed the number up\n" : "You guessed the number down\n");
else
System.out.print("Congratulations! You guessed it");
}
}
}
運(yùn)行結(jié)果展示:?
總結(jié)以上便是對(duì)于c語(yǔ)言和java版本的猜數(shù)字小游戲的代碼設(shè)計(jì)分享,雖說(shuō)其過(guò)程十分簡(jiǎn)單,但還是希望能夠幫到大家?。如若文章存在紕漏或錯(cuò)誤,歡迎大家指正,謝謝!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧