C語言詳細(xì)實現(xiàn)猜拳游戲流程
一、游戲邏輯
1.打印選擇菜單(1.play,0.exit)
2.提示玩家0、1、2 分別代表石頭、剪刀、布
3.設(shè)置與計算機博弈次數(shù)
4.為計算機設(shè)置出拳(調(diào)用rand()函數(shù)生成0、1、2其中一個隨機數(shù))
5.玩家出拳
6.判斷輸贏
7.展示玩家和計算機出的拳
8.若退出游戲展示玩家勝負(fù)與平局信息
二、思維導(dǎo)圖

三、游戲過程

四、代碼分析
1.設(shè)置隨機數(shù)的方法

僅僅使用rand()函數(shù)來生成隨機數(shù)是不行的,因為它每玩一次生成的隨機數(shù)都是相同的,即隨機數(shù)不隨機,所以要通過srand()函數(shù),種下一個隨機種子,來產(chǎn)生隨機數(shù)。根據(jù)時間每時每刻都是變化的,可以用time()時間函數(shù)來產(chǎn)生種子。


這里 time_t 的類型就是在C語言中被定義為長整型,而srand()函數(shù)的參數(shù)類型unsignedint(無符號整形),所以使用時要強制類型轉(zhuǎn)換,而且**time()**函數(shù),不需要設(shè)置參數(shù),故用NULL代替。
2.設(shè)置計算機出拳的方法
comp = rand() % 3;
調(diào)用 rand() 函數(shù) %3 就可以得到有個0~2之間的數(shù)值
3.判斷輸贏的方法

據(jù)圖可以看出只需要判斷 (human - comp + 3) % 3 的值是 0、1 還是 2 就可以判斷是平局、計算機贏還是電腦贏。
代碼示例:
void disp_result(is_winer)
{
switch (is_winer)
{
case 0:
printf("平局\n");
draw++;//平局次數(shù)加1
break;
case 1:
printf("計算機贏\n");
lose++;//失敗次數(shù)加1
break;
case 2:
printf("玩家贏\n");
win++;//獲勝次數(shù)加1
break;
}
}is_winer 中存放的是 (human - comp + 3) % 3 的值,利用 switch 語句判斷其結(jié)果,再輸出對應(yīng)的語句。變量draw、lose、win是用來統(tǒng)計玩家戰(zhàn)績信息。
4.玩家猜拳
控制玩家輸入的范圍是0~2之間的數(shù)值
倘若玩家輸入的數(shù)值不是0~2之間的,程序就無法正常運行了,所以要控制范圍。
可以利用do while循環(huán)來達(dá)到此目的。
代碼示例:
do
{
scanf("%d", &human);//玩家出拳
printf("\n");
if (human < 0 || human > 2)
{
printf("輸入錯誤,重新輸入\n");
}
is_winer = (human - comp + 3) % 3;
disp_result(is_winer);//判斷輸贏的函數(shù)
Dishumanplayer(human);//展示玩家出的拳
Discomplayer(comp);//展示計算機出拳
} while (human < 0 || human > 2);//控制玩家輸出范圍是0~2 if 語句的作用是用來當(dāng)玩家輸入的數(shù)值超過了范圍時,對其進(jìn)行提示輸入錯誤。
五、完整代碼
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int draw = 0;//統(tǒng)計平局?jǐn)?shù)
int lose = 0;//統(tǒng)計失敗數(shù)
int win = 0;//統(tǒng)計獲勝數(shù)
int human = 0;//玩家手勢
int comp = 0;//計算機手勢
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)//展示計算機和玩家出拳的函數(shù)
{
printf("計算機出的是:");
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("計算機贏\n");
lose++;//失敗次數(shù)加1
break;
case 2:
printf("玩家贏\n");
win++;//獲勝次數(shù)加1
break;
}
}
void game()
{
printf("(0)-石頭,(1)-剪刀,(2)-布\n");
printf("猜拳游戲開始!!!\n");
int number = 0;//猜拳次數(shù)
printf("請選擇猜拳次數(shù):");
scanf("%d", &number);
while (number)
{
comp = rand() % 3;//計算機出拳
printf("玩家出拳:");
do
{
scanf("%d", &human);//玩家出拳
printf("-----------猜拳游戲-------------\n");
if (human < 0 || human > 2)
{
printf("輸入錯誤,重新輸入\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("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤,重新選擇\n");
break;
}
} while (input);
//展示玩家成績
printf("\a\n%d平 %d敗 %d勝\n", draw, lose, win);
return 0;
}到此這篇關(guān)于C語言詳細(xì)實現(xiàn)猜拳游戲流程的文章就介紹到這了,更多相關(guān)C語言猜拳游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++如何獲取當(dāng)前系統(tǒng)時間的實例詳解
這篇文章主要介紹了 C/C++如何獲取當(dāng)前系統(tǒng)時間的實例詳解的相關(guān)資料,這里提供了幾種實現(xiàn)方法,幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08
C語言實現(xiàn)查詢自動售貨機中的商品價格【實例分享】
本文主要介紹了C語言實現(xiàn)查詢自動售貨機中的商品價格的相關(guān)資料。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04
C++實現(xiàn)從數(shù)組中同時取出最大最小元素算法示例
這篇文章主要介紹了C++實現(xiàn)從數(shù)組中同時取出最大最小元素算法,結(jié)合具體實例形式分析了C++通過數(shù)組的遍歷、排序獲取最大與最小元素的相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
用C++類實現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法
下面小編就為大家?guī)硪黄肅++類實現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
C++實現(xiàn)LeetCode(124.求二叉樹的最大路徑和)
這篇文章主要介紹了C++實現(xiàn)LeetCode(124.求二叉樹的最大路徑和),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
隊列的動態(tài)鏈?zhǔn)酱鎯崿F(xiàn)代碼分享
DynaLnkQueue.cpp - 動態(tài)鏈?zhǔn)疥犃?,即隊列的動態(tài)鏈?zhǔn)酱鎯崿F(xiàn)2014-02-02

