C語(yǔ)言實(shí)戰(zhàn)之紙牌游戲
1. 基本要求
- 一副沒(méi)有花牌(J、Q、K、A、大小王)的撲克牌,兩個(gè)人進(jìn)行紙牌游戲,其中一個(gè)人為用戶,另一個(gè)人為計(jì)算機(jī);
- 每輪每人各發(fā)5張牌,各自以這5張牌建立二叉排序樹(shù);
- 由用戶先出,輪流出牌,每次只能出一張并且要比別人出的大,如:用戶出3,計(jì)算機(jī)則要出比3大的牌,沒(méi)有則選擇不出;
- 最先出完的人獲勝。
2. 運(yùn)行界面
1. 首頁(yè)面
2. 游戲說(shuō)明
3. 開(kāi)始游戲
4. 開(kāi)始出牌
5. 游戲結(jié)束
3. 代碼解釋?
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
int card[5][2]; // 分別標(biāo)記玩家和用戶已經(jīng)出過(guò)的牌
int playercard[5]; // 玩家的手牌
int computercard[5]; // 電腦的手牌
char bhuase[5];
char chuase[5];
typedef struct node
{
int data;
struct node *LChild;
struct node *RChild;
}node;
typedef struct tree
{
int data;
struct node *LChild;
struct node *RChild;
}tree;
// 游戲說(shuō)明
void PlayingCardsyxsm()
{
printf(" 每輪每人各發(fā)5張牌,各自以五張牌建立二叉樹(shù),由用戶先出,輪流出牌,\n");
printf(" 每次只能出一張并且要比別人出的大,\n");
printf(" 如:用戶出3,計(jì)算機(jī)則要算出比3大的牌,沒(méi)有則選擇不出;\n");
printf(" 最先出完的人獲勝。\n");
}
// 發(fā)牌
void PlayingCardsfp()
{
int player;
int computer;
// 玩家和電腦各發(fā)五張牌
for(int i = 0; i < 5; i ++ ){
player = rand() % 9 + 2;
printf("玩家發(fā)到的牌:%d \n", player);
playercard[i] = player;
computer = rand() % 9 + 2;
printf("電腦發(fā)到的牌:%d \n", computer);
computercard[i] = computer;
}
}
// 出牌
void PlayingCardscp()
{
int player = 0; // 玩家當(dāng)前回合出的牌
int computer = 0; // 電腦當(dāng)前回合出的牌
int playercount = 0; // 玩家的出牌數(shù)
int computercount = 0; // 電腦的出牌數(shù)
bool flag = false;
// 當(dāng)每次都出現(xiàn)最大值時(shí),游戲同樣最多進(jìn)行5回合
for(int m = 0; m < 5; m ++ )
{
// 在雙方都有牌出的時(shí)候,一共最多進(jìn)行5回合出牌
for(int k = 0; k < 5; k ++ )
{
for(int j = 0; j < 5; j ++ )
{
// 確定當(dāng)前牌可以出,大于對(duì)方的出牌,且自己沒(méi)有出過(guò)這張牌
if(playercard[j] > computer && card[j][0] == 0)
{
printf("玩家出牌%c%d\n", bhuase[j],playercard[j]);
playercount ++ ; // 玩家出牌數(shù)+1
// 標(biāo)記玩家已經(jīng)出過(guò)這張牌了
card[j][0] = 1;
player = playercard[j];
Sleep(800); // 在頭函數(shù)#include <windows.h>中,起到休眠程序的作用
break;
}
}
// 若果玩家已經(jīng)出完5張牌,則玩家獲勝,退出循環(huán)
if(playercount == 5)
{
printf("玩家贏了!");
flag = true;
break;
}
for(int j = 0; j < 5; j ++ )
{
// 確定當(dāng)前牌可以出,大于對(duì)方的出牌,且自己沒(méi)有出過(guò)這張牌
if(computercard[j] > player && card[j][1] == 0)
{
printf("電腦出牌%c%d\n", chuase[j],computercard[j]);
computercount ++ ; // 電腦出牌數(shù)+1
// 標(biāo)記電腦已經(jīng)出過(guò)這張牌了
card[j][1] = 1;
computer = computercard[j];
Sleep(800);
break;
}
}
// 若果電腦已經(jīng)出完5張牌,則電腦獲勝,退出循環(huán)
if(computercount == 5)
{
printf("電腦贏了!");
flag = true;
break;
}
}
// 如果玩家的牌大于電腦的最大牌后,將電腦當(dāng)前回合的牌值重置為0,繼續(xù)進(jìn)行下一回合
if(player > computer) computer = 0;
// 如果電腦的牌大于玩家的最大牌后,將玩家當(dāng)前回合的牌值重置為0,繼續(xù)進(jìn)行下一回合
if(computer > player) player = 0;
if(flag) break;
}
}
// 發(fā)完牌后玩家的手牌
void PlayingCardsxswj()
{
printf("玩家\n");
printf(" %d %d %d %d %d\n", playercard[0], playercard[1], playercard[2], playercard[3], playercard[4], playercard[5]);
}
// 發(fā)完牌后電腦的手牌
void PlayingCardsxsdn()
{
printf("電腦\n");
printf(" %d %d %d %d %d\n", computercard[0], computercard[1], computercard[2], computercard[3], computercard[4], computercard[5]);
}
// 初始化樹(shù)的頭結(jié)點(diǎn)為空
void treechushihua(node *t)
{
t = NULL;
}
// 建立平衡二叉樹(shù)
node *treecharu(node *t, int key)
{
// 如果頭結(jié)點(diǎn)為空,就將當(dāng)前節(jié)點(diǎn)設(shè)置為根節(jié)點(diǎn)
if(t == NULL)
{
node *p;
p = (node*)malloc(sizeof(node));
p->data = key;
p->LChild = NULL;
p->RChild = NULL;
t = p;
}
// 如果頭結(jié)點(diǎn)不為空,則進(jìn)行平衡二叉樹(shù)的插入操作
else
{
// 插入結(jié)點(diǎn)的值小于根節(jié)點(diǎn),則插入左子樹(shù)
if(key < t->data)
t->LChild = treecharu(t->LChild, key);
// 插入結(jié)點(diǎn)的值大于等于根節(jié)點(diǎn),則插入右子樹(shù)
else
t->RChild = treecharu(t->RChild, key);
}
return t;
}
// 將玩家手牌存儲(chǔ)到平衡二叉樹(shù)中
node *jianlib(node *t)
{
int i, key;
for(i = 0; i < 5; i ++ )
{
key = playercard[i];
t = treecharu(t, key);
}
return t;
}
// 將電腦手牌存儲(chǔ)到平衡二叉樹(shù)中
node *jianlic(node *t)
{
int i, key;
for(i = 0; i < 5; i ++ )
{
key = computercard[i];
t = treecharu(t, key);
}
return t;
}
// 順序輸出玩家或電腦手牌
void treepaixu1(node *t)
{
if(t != NULL)
{
treepaixu1(t->LChild);
printf("%d ", t->data);
treepaixu1(t->RChild);
}
}
// 先序遍歷玩家平衡二叉樹(shù)
void treepaixu2(node *t, int *p)
{
if(t == NULL) return;
else
{
// 先序遍歷,將玩家手牌有序化
treepaixu2(t->LChild, p);
playercard[(*p) ++ ] = t->data;
treepaixu2(t->RChild, p);
}
}
// 先序遍歷電腦平衡二叉樹(shù)
void treepaixu3(node *t, int *p)
{
if(t == NULL) return;
else
{
// 先序遍歷,將電腦手牌有序化
treepaixu3(t->LChild, p);
computercard[(*p) ++ ] = t->data;
treepaixu3(t->RChild, p);
}
}
// 主函數(shù)
int main()
{
int k = 0;
// 隨機(jī)函數(shù),通過(guò)時(shí)間種子來(lái)獲取隨機(jī)數(shù)種子,獲得隨機(jī)數(shù)
srand((unsigned)time(NULL));
int n = 0;
// 選擇菜單
while(k != -1)
{
puts("");
puts("");
puts("");
printf("\t\t\t ****紙牌游戲****\n");
printf("\t\t\t****1.游戲說(shuō)明****\n");
printf("\t\t\t****2.開(kāi)始游戲****\n");
printf("\t\t\t****3.開(kāi)始出牌****\n");
printf("\t\t\t****4.游戲結(jié)束****\n");
printf("\t\t\t******************\n");
puts("");
printf("\t\t**********************************\n");
printf("\t\t**********************************\n");
puts("");
printf("\t\t\t請(qǐng)輸入(1、2、3、4):\n");
scanf("%d", &k);
switch(k){
// 游戲說(shuō)明
case 1: PlayingCardsyxsm(); break;
// 發(fā)牌階段
case 2:{
// 發(fā)牌
PlayingCardsfp();
// 建立玩家二叉樹(shù)
node *t1 = NULL;
t1 = jianlib(t1);
printf("玩家手牌為:");
treepaixu1(t1);
// 建立電腦二叉樹(shù)
node *t2 = NULL;
t2 = jianlic(t2);
puts("");
printf("電腦手牌為:");
treepaixu1(t2);
// 玩家手牌有序化
n = 0;
treepaixu2(t1, &n);
// 電腦手牌有序化
n = 0;
treepaixu3(t2, &n);
puts("");
// 輸出玩家和電腦的手牌
PlayingCardsxswj();
PlayingCardsxsdn();
break;
}
// 出牌階段
case 3:{
PlayingCardscp();
break;
}
// 退出游戲
case 4:k=-1; break;
}
}
return 0;
}
以上就是C語(yǔ)言實(shí)戰(zhàn)之紙牌游戲的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言紙牌游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例
這篇文章主要為大家介紹了Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09C語(yǔ)言實(shí)現(xiàn)時(shí)間戳轉(zhuǎn)日期的算法(推薦)
下面小編就為大家?guī)?lái)一篇C語(yǔ)言實(shí)現(xiàn)時(shí)間戳轉(zhuǎn)日期的算法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06vscode調(diào)試gstreamer源碼的詳細(xì)流程
在本文中主要介紹了如何使用vscode調(diào)試C++和python程序,并進(jìn)一步分析了如何調(diào)試gstreamer源碼,講述了如何調(diào)試gstreamer源碼的具體流程,感興趣的朋友跟隨小編一起看看吧2023-01-01C++?const與constexpr區(qū)別小結(jié)
C++11標(biāo)準(zhǔn)中,const用于為修飾的變量添加只讀屬性,而constexpr關(guān)鍵字則用于指明其后是一個(gè)常量,本文主要介紹了C++?const與constexpr區(qū)別小結(jié),感興趣的可以了解一下2024-03-03自己模擬寫(xiě)C++中的String類型實(shí)例講解
下面小編就為大家?guī)?lái)一篇自己模擬寫(xiě)C++中的String類型實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07c++ 虛函數(shù),虛表相關(guān)總結(jié)
這篇文章主要介紹了c++ 虛函數(shù),虛表的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下2021-03-03C++中的類成員函數(shù)當(dāng)線程函數(shù)
這篇文章主要介紹了C++中的類成員函數(shù)當(dāng)線程函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11用C實(shí)現(xiàn)添加和讀取配置文件函數(shù)
本篇文章是對(duì)用C語(yǔ)言實(shí)現(xiàn)添加和讀取配置文件函數(shù)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05