C語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字游戲
前言:
本文主要講解以c語(yǔ)言編寫(xiě)猜數(shù)字游戲,目的是介紹C語(yǔ)言中的循環(huán)和分支的具體用法。
一:猜數(shù)字游戲基本介紹&對(duì)程序預(yù)期
.猜數(shù)字游戲,顧名思義,就是系統(tǒng)隨機(jī)給出一個(gè)數(shù)字,玩家對(duì)這個(gè)數(shù)字進(jìn)行猜測(cè),如果玩家猜測(cè)的數(shù)字大于給出的數(shù)字,則系統(tǒng)會(huì)提示猜大了,如果玩家猜測(cè)的數(shù)字小于給出的數(shù)字,則系統(tǒng)會(huì)提示猜小了,這樣逐步縮小猜測(cè)范圍,直到玩家猜對(duì)為止。
2.程序預(yù)期:猜數(shù)字結(jié)束后,玩家如果猜對(duì)了的話(huà)可以繼續(xù)游戲,也可以退出游戲
二:程序設(shè)計(jì)思路
1.總體思路:
首先,實(shí)現(xiàn)游戲功能必須要有一個(gè)菜單來(lái)提示玩家如何進(jìn)行操作。其次,為了代碼具有可讀性,可以將游戲部分函數(shù)和菜單部分函數(shù)作為兩個(gè)子函數(shù),然后在主函數(shù)調(diào)用他們。然后我們?yōu)榱藢?shí)現(xiàn)玩家可以多次游戲可以使用循環(huán)。
綜上所述,我們應(yīng)該設(shè)計(jì)兩個(gè)子函數(shù):菜單函數(shù)和游戲函數(shù)。一個(gè)主函數(shù)
2.菜單部分函數(shù):
菜單部分函數(shù)
void menu() { printf("***********************************************\n"); printf("*************************1play*****************\n"); printf("*************************0exit*****************\n"); printf("***********************************************\n"); }
菜單函數(shù)設(shè)計(jì)相對(duì)簡(jiǎn)單,只是為了提示玩家如何操作
3.游戲部分函數(shù)
void game() { srand((unsigned int)time(NULL)); int ret = rand() % 100 + 1; while (1) { printf("猜數(shù)字\n"); int guess = 0; scanf("%d", &guess); if (guess > ret) { printf("猜大了\n"); } else if (guess < ret) { printf("猜小了\n"); } else { printf("猜對(duì)了\n"); break; } } }
①在游戲函數(shù)部分,首先要生成隨機(jī)數(shù),生成隨機(jī)數(shù)的方法如下:
C語(yǔ)言中提供了生成隨機(jī)數(shù)的函數(shù)rand函數(shù)
rand函數(shù)會(huì)返回一個(gè)0到RAND-MAX的隨機(jī)整數(shù),使用這個(gè)函數(shù)需要包含頭文件<stdlib.h>
但是rand函數(shù)每次生成的隨機(jī)數(shù)相同,所以只用rand函數(shù)不夠,所以要使用srand()函數(shù)增加隨機(jī)性
后一句中說(shuō)明在使用rand函數(shù)前要定義一個(gè)srand()函數(shù)
如畫(huà)線(xiàn)句所示,srand函數(shù)的作用就是一個(gè)隨機(jī)數(shù)的生成的種子。
而且需要一個(gè)無(wú)符號(hào)整型,在srand函數(shù)中括號(hào)輸入一個(gè)隨機(jī)數(shù)字即可生成隨機(jī)數(shù),時(shí)間正是一個(gè)一直在變化的數(shù)字。
在這里提出一個(gè)時(shí)間戳的概念:時(shí)間戳是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒 (北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)。
因?yàn)閟rand需要的參數(shù)是無(wú)符號(hào)類(lèi)型,所以對(duì)time進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換。time后不需要參數(shù),所以給他一個(gè)空指針。
使用srand((unsigned int)time(NULL))
輸入time返回一個(gè)時(shí)間戳
需要一個(gè)頭文件<time.h>
因?yàn)榻o出的隨機(jī)數(shù)范圍太大,所以需要限定隨機(jī)數(shù)范圍
如下:int ret = rand()%100+1,將隨機(jī)數(shù)限定在0-100區(qū)間,便于猜測(cè)
②:猜數(shù)字環(huán)節(jié)
利用while循環(huán)來(lái)逐步縮小猜測(cè)范圍,當(dāng)猜測(cè)的數(shù)字等于隨機(jī)數(shù)時(shí)提示”猜對(duì)了“。
4.主函數(shù)部分
int main() { int input = 0; do { menu(); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: break; default: printf("輸入錯(cuò)誤,請(qǐng)重新輸入"); } } while (input); return 0; }
主函數(shù)中使用了switch語(yǔ)句,和do-while語(yǔ)句
主要目的是為了玩家選擇是否進(jìn)入游戲
5.代碼主體
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<time.h> void menu() { printf("***********************************************\n"); printf("*************************1play*****************\n"); printf("*************************0exit*****************\n"); printf("***********************************************\n"); } void game() { srand((unsigned int)time(NULL)); int ret = rand() % 100 + 1; while (1) { printf("猜數(shù)字\n"); int guess = 0; scanf("%d", &guess); if (guess > ret) { printf("猜大了\n"); } else if (guess < ret) { printf("猜小了\n"); } else { printf("猜對(duì)了\n"); break; } } } int main() { int input = 0; do { menu(); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: break; default: printf("輸入錯(cuò)誤,請(qǐng)重新輸入"); } } while (input); return 0; }
三:總結(jié)
此程序主要為了熟悉循環(huán)和分支的具體用法,并且學(xué)會(huì)利用時(shí)間戳和rand函數(shù)生成隨機(jī)數(shù)。
到此這篇關(guān)于C語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字游戲的文章就介紹到這了,更多相關(guān)C語(yǔ)言猜數(shù)字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 數(shù)據(jù)類(lèi)型強(qiáng)制轉(zhuǎn)化的實(shí)現(xiàn)
這篇文章主要介紹了C++ 數(shù)據(jù)類(lèi)型強(qiáng)制轉(zhuǎn)化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02C++實(shí)現(xiàn)LeetCode(46.全排列)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(46.全排列),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++ 學(xué)習(xí)之旅二 說(shuō)一說(shuō)C++頭文件
作為一個(gè)二手的.net程序員,你看到了C++頭文件一定就犯迷糊了,這到底是個(gè)啥玩意。再我糾結(jié)了24個(gè)小時(shí), google20次,度娘10下,看過(guò)10來(lái)騙文章以后,我可能稍微開(kāi)竅了。我對(duì)C++頭文件總結(jié),與.net比較如下2012-11-11C++設(shè)計(jì)模式之抽象工廠(chǎng)模式
這篇文章主要介紹了C++設(shè)計(jì)模式之抽象工廠(chǎng)模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07c++11多種格式時(shí)間轉(zhuǎn)化為字符串的方法實(shí)現(xiàn)
本文主要介紹了c++11多種格式時(shí)間轉(zhuǎn)化為字符串的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C++析構(gòu)函數(shù)內(nèi)部工作機(jī)制詳解
析構(gòu)函數(shù)(Destructor)也是一種特殊的成員函數(shù),沒(méi)有返回值,不需要程序員顯式調(diào)用(程序員也沒(méi)法顯式調(diào)用),而是在銷(xiāo)毀對(duì)象時(shí)自動(dòng)執(zhí)行。構(gòu)造函數(shù)的名字和類(lèi)名相同,而析構(gòu)函數(shù)的名字是在類(lèi)名前面加一個(gè)~符號(hào)2023-02-02淺談#ifndef,#define,#endif的作用和用法
下面小編就為大家?guī)?lái)一篇淺談#ifndef,#define,#endif的作用和用法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12