C語(yǔ)言詳細(xì)實(shí)現(xiàn)猜拳游戲流程
一、游戲邏輯
1.打印選擇菜單(1.play,0.exit)
2.提示玩家0、1、2 分別代表石頭、剪刀、布
3.設(shè)置與計(jì)算機(jī)博弈次數(shù)
4.為計(jì)算機(jī)設(shè)置出拳(調(diào)用rand()函數(shù)生成0、1、2其中一個(gè)隨機(jī)數(shù))
5.玩家出拳
6.判斷輸贏
7.展示玩家和計(jì)算機(jī)出的拳
8.若退出游戲展示玩家勝負(fù)與平局信息
二、思維導(dǎo)圖
三、游戲過(guò)程
四、代碼分析
1.設(shè)置隨機(jī)數(shù)的方法
僅僅使用rand()函數(shù)來(lái)生成隨機(jī)數(shù)是不行的,因?yàn)樗客嬉淮紊傻碾S機(jī)數(shù)都是相同的,即隨機(jī)數(shù)不隨機(jī),所以要通過(guò)srand()函數(shù),種下一個(gè)隨機(jī)種子,來(lái)產(chǎn)生隨機(jī)數(shù)。根據(jù)時(shí)間每時(shí)每刻都是變化的,可以用time()時(shí)間函數(shù)來(lái)產(chǎn)生種子。
這里 time_t 的類型就是在C語(yǔ)言中被定義為長(zhǎng)整型,而srand()函數(shù)的參數(shù)類型unsignedint(無(wú)符號(hào)整形),所以使用時(shí)要強(qiáng)制類型轉(zhuǎn)換,而且**time()**函數(shù),不需要設(shè)置參數(shù),故用NULL代替。
2.設(shè)置計(jì)算機(jī)出拳的方法
comp = rand() % 3;
調(diào)用 rand() 函數(shù) %3 就可以得到有個(gè)0~2之間的數(shù)值
3.判斷輸贏的方法
據(jù)圖可以看出只需要判斷 (human - comp + 3) % 3 的值是 0、1 還是 2 就可以判斷是平局、計(jì)算機(jī)贏還是電腦贏。
代碼示例:
void disp_result(is_winer) { switch (is_winer) { case 0: printf("平局\n"); draw++;//平局次數(shù)加1 break; case 1: printf("計(jì)算機(jī)贏\n"); lose++;//失敗次數(shù)加1 break; case 2: printf("玩家贏\n"); win++;//獲勝次數(shù)加1 break; } }
is_winer 中存放的是 (human - comp + 3) % 3 的值,利用 switch 語(yǔ)句判斷其結(jié)果,再輸出對(duì)應(yīng)的語(yǔ)句。變量draw、lose、win是用來(lái)統(tǒng)計(jì)玩家戰(zhàn)績(jī)信息。
4.玩家猜拳
控制玩家輸入的范圍是0~2之間的數(shù)值
倘若玩家輸入的數(shù)值不是0~2之間的,程序就無(wú)法正常運(yùn)行了,所以要控制范圍。
可以利用do while循環(huán)來(lái)達(dá)到此目的。
代碼示例:
do { scanf("%d", &human);//玩家出拳 printf("\n"); if (human < 0 || human > 2) { printf("輸入錯(cuò)誤,重新輸入\n"); } is_winer = (human - comp + 3) % 3; disp_result(is_winer);//判斷輸贏的函數(shù) Dishumanplayer(human);//展示玩家出的拳 Discomplayer(comp);//展示計(jì)算機(jī)出拳 } while (human < 0 || human > 2);//控制玩家輸出范圍是0~2
if 語(yǔ)句的作用是用來(lái)當(dāng)玩家輸入的數(shù)值超過(guò)了范圍時(shí),對(duì)其進(jìn)行提示輸入錯(cuò)誤。
五、完整代碼
#include<stdio.h> #include<time.h> #include<stdlib.h> int draw = 0;//統(tǒng)計(jì)平局?jǐn)?shù) int lose = 0;//統(tǒng)計(jì)失敗數(shù) int win = 0;//統(tǒng)計(jì)獲勝數(shù) int human = 0;//玩家手勢(shì) int comp = 0;//計(jì)算機(jī)手勢(shì) int is_winer = 0;//判斷勝負(fù) void menu() { printf("****************************************\n"); printf("*************** 猜拳游戲 ***************\n"); printf("****************************************\n"); printf("*************** 1.play ****************\n"); printf("*************** 0.exit ****************\n"); printf("****************************************\n"); } void Displayer(int comp, int human)//展示計(jì)算機(jī)和玩家出拳的函數(shù) { printf("計(jì)算機(jī)出的是:"); switch (comp) { case 0: printf("石頭\n"); break; case 1: printf("剪刀\n"); break; case 2: printf("布\n"); break; } printf("玩家出的是:"); switch (human) { case 0: printf("石頭\n"); break; case 1: printf("剪刀\n"); break; case 2: printf("布\n"); break; } } //判斷輸贏 void disp_result(is_winer) { switch (is_winer) { case 0: printf("平局\n"); draw++;//平局次數(shù)加1 break; case 1: printf("計(jì)算機(jī)贏\n"); lose++;//失敗次數(shù)加1 break; case 2: printf("玩家贏\n"); win++;//獲勝次數(shù)加1 break; } } void game() { printf("(0)-石頭,(1)-剪刀,(2)-布\n"); printf("猜拳游戲開(kāi)始!!!\n"); int number = 0;//猜拳次數(shù) printf("請(qǐng)選擇猜拳次數(shù):"); scanf("%d", &number); while (number) { comp = rand() % 3;//計(jì)算機(jī)出拳 printf("玩家出拳:"); do { scanf("%d", &human);//玩家出拳 printf("-----------猜拳游戲-------------\n"); if (human < 0 || human > 2) { printf("輸入錯(cuò)誤,重新輸入\n"); } is_winer = (human - comp + 3) % 3; disp_result(is_winer);//判斷輸贏的函數(shù) Displayer(comp, human);//展示出拳 } while (human < 0 || human > 2);//控制玩家輸出范圍是0~2 number--; } } int main() { srand((int)time(NULL)); int input = 0; do { menu(); printf("選擇玩游戲還是退出游戲!!!\n"); printf("請(qǐng)選擇:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯(cuò)誤,重新選擇\n"); break; } } while (input); //展示玩家成績(jī) printf("\a\n%d平 %d敗 %d勝\n", draw, lose, win); return 0; }
到此這篇關(guān)于C語(yǔ)言詳細(xì)實(shí)現(xiàn)猜拳游戲流程的文章就介紹到這了,更多相關(guān)C語(yǔ)言猜拳游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解
這篇文章主要介紹了 C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解的相關(guān)資料,這里提供了幾種實(shí)現(xiàn)方法,幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08C語(yǔ)言實(shí)現(xiàn)查詢自動(dòng)售貨機(jī)中的商品價(jià)格【實(shí)例分享】
本文主要介紹了C語(yǔ)言實(shí)現(xiàn)查詢自動(dòng)售貨機(jī)中的商品價(jià)格的相關(guān)資料。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04C++實(shí)現(xiàn)從數(shù)組中同時(shí)取出最大最小元素算法示例
這篇文章主要介紹了C++實(shí)現(xiàn)從數(shù)組中同時(shí)取出最大最小元素算法,結(jié)合具體實(shí)例形式分析了C++通過(guò)數(shù)組的遍歷、排序獲取最大與最小元素的相關(guān)操作技巧,需要的朋友可以參考下2017-09-09用C++類實(shí)現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法
下面小編就為大家?guī)?lái)一篇用C++類實(shí)現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04C++實(shí)現(xiàn)LeetCode(124.求二叉樹(shù)的最大路徑和)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(124.求二叉樹(shù)的最大路徑和),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷小程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10隊(duì)列的動(dòng)態(tài)鏈?zhǔn)酱鎯?chǔ)實(shí)現(xiàn)代碼分享
DynaLnkQueue.cpp - 動(dòng)態(tài)鏈?zhǔn)疥?duì)列,即隊(duì)列的動(dòng)態(tài)鏈?zhǔn)酱鎯?chǔ)實(shí)現(xiàn)2014-02-02