您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)怎樣用C語(yǔ)言實(shí)現(xiàn)紙牌游戲,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
一副沒(méi)有花牌(J、Q、K、A、大小王)的撲克牌,兩個(gè)人進(jìn)行紙牌游戲,其中一個(gè)人為用戶,另一個(gè)人為計(jì)算機(jī);
每輪每人各發(fā)5張牌,各自以這5張牌建立二叉排序樹(shù);
由用戶先出,輪流出牌,每次只能出一張并且要比別人出的大,如:用戶出3,計(jì)算機(jī)則要出比3大的牌,沒(méi)有則選擇不出;
最先出完的人獲勝。
1. 首頁(yè)面
2. 游戲說(shuō)明
3. 開(kāi)始游戲
4. 開(kāi)始出牌
5. 游戲結(jié)束
#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; }
看完上述內(nèi)容,你們對(duì)怎樣用C語(yǔ)言實(shí)現(xiàn)紙牌游戲有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。