扑克牌游戏,两人接龙(数据结构:队列、栈、双向链表)
生活随笔
收集整理的這篇文章主要介紹了
扑克牌游戏,两人接龙(数据结构:队列、栈、双向链表)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
游戲規(guī)則:
1、將一副牌中的大小王去掉,剩余的52張牌(1-13)*4,洗牌后按順序分配給兩名選手(這里用的方法是隨機抽取其中的一張牌發(fā)給選手);
2、隨機抽取其中一人先出牌,之后兩人輪流將自己手里最前面的牌放到桌面;
3、如果放下去的牌,在桌面上已經存在,則選手將兩個相同點數(shù)的牌面之間的所有牌(含相同點數(shù)的牌),收取到自己手中,并放到最后;
4、直到其中一人手中沒有牌,游戲結束;手里有牌的人勝出。
?
要點:
1、兩名選手,所持牌面符合“先進先出”的原則,用順序表作為數(shù)據(jù)結構存儲(本文采用的是順序鏈,方便摘除和增加結點)
2、桌面的牌符合”先進后出“的原則,利用棧數(shù)據(jù)結構存儲
3、為了增加游戲的過程可讀性,增加了每一輪出牌情況,及兩名選手和桌面牌面的展示;
運行情況:
開始->
結束->
?
完整代碼如下:
#include<stdio.h> #include<stdlib.h> #include<time.h> /*定義,每張牌*/ typedef struct Card {int hcard;struct Card *front; struct Card *back; } Bcard; /*初始化選手和桌面,創(chuàng)建選手牌面隊列頭結點和桌面牌面棧*/ Bcard *initcard() {Bcard *p=(Bcard *)malloc(sizeof(Bcard));p->front=p;p->back=p;return p; } /*選手取牌*/ pushcard(Bcard *p,int temcard) {Bcard *t = (Bcard *)malloc(sizeof(Bcard));if(t==NULL){printf("申請空間失敗!\n"); }//將牌發(fā)到選手手中,申請新空間結點,連接到選手隊列 t->hcard=temcard;t->back=p->back;p->back->front=t;t->front=p;p->back=t; } /*選手出牌*/ popcard(Bcard *p) {Bcard *t;t=p->front;//定位要出的牌//摘除牌所占結點 t->front->back=p;p->front=t->front;printf("%3d\n",t->hcard);//顯示選手出的牌 free(t);//釋放選手已經出的牌 } /*遇到相同點數(shù)的牌,桌面上的牌給選手,出棧*/ popsharcard(Bcard *p12,Bcard *p3card) {Bcard *t;pushcard(p12,p3card->back->hcard);t=p3card->back;p3card->back=p3card->back->back;p3card->back->front=p3card;free(t);//釋放已經被選手收取的牌所占空間 } /*初始發(fā)牌*/ void fapai(Bcard *p1card,Bcard *p2card) {Bcard *p4card=initcard();//鏈表 整副牌初始化 1-13 * 4 //將52張牌(不含大小王)放入臨時鏈表 int i,j;for(i=1;i<=4;i++){for(j=1;j<=13;j++){pushcard(p4card,j);}}//洗牌結束,開始給兩名選手發(fā)牌 int select=1; //發(fā)牌標記srand(time(NULL)); //隨機種子 for(i=1;i<=52;i++) {Bcard *ptem1;Bcard *ptem2;if(1==select)//兩人輪流取牌 {ptem2=p1card;}else{ptem2=p2card;}select*=-1;//轉換發(fā)牌標記 ptem1=p4card;j=rand()%(53-i)+1;//在整副牌中隨機抽取一張 發(fā)牌 while(j>0)//定位到收取的的牌 {ptem1=ptem1->back;j--;}pushcard(ptem2,ptem1->hcard);//發(fā)牌給選手 popcard(ptem1->back); //去除已經發(fā)過的牌 }system("cls");//清屏,之前發(fā)牌的時候每發(fā)一次都輸出一次+回車,為了看起來好看 printf("\n發(fā)牌結束\n"); } /*輸出選手和桌面上的牌面信息*/ void shuchuxuanchou(Bcard *pp) {Bcard *ppt;ppt=pp;while(1){if(ppt->front==pp){break;}printf("%3d",ppt->front->hcard);ppt=ppt->front;}printf("\n"); } /*遍歷桌面牌面,查看是否存在和要出的牌點數(shù)相同的牌*/ int bianli(Bcard *p3,int temcard) {Bcard *pt;pt=p3;while(pt->back!=p3){if(temcard==pt->back->hcard){return 1;} pt=pt->back;}return -1; } /*收牌,先將自己要出的牌放在最后,再按順序將桌面上相同點數(shù)的牌之前的牌收取到手中,放在最后*/ void shouqu(Bcard *ptem,Bcard *p3card) {int temcard=ptem->front->hcard;pushcard(ptem,ptem->front->hcard);popcard(ptem);while(1){if(temcard==p3card->back->hcard){pushcard(ptem,p3card->back->hcard);popcard(p3card->back->back);break;}else{printf("%3d\n",p3card->back->hcard); popsharcard(ptem,p3card); } } } /*開始游戲,隨機抽取先出牌的選手,展示桌面牌面,選手牌面,其中一人手里沒有牌,則對方勝利*/ void playgame(Bcard *p1card,Bcard *p2card,Bcard *p3card) {srand(time(NULL)); //隨機種子 int select=rand()%3;//隨機確定誰先出牌 0-選手 1 先出 ,1-選手 2 先出Bcard *ptem; if(2==select)//確定誰先出牌 {ptem=p1card;}else{ptem=p2card;}int sum=0;while(1){printf("\n第 %d 輪",++sum);printf("\n桌面牌面");shuchuxuanchou(p3card);if(p1card->front==p1card) {printf("\n\n選手 NO.1 手中已經無牌可出\n\n"); printf("恭喜 NO.2 獲得勝利\n"); exit(0); }else if(p2card->front==p2card){printf("\n\n選 NO.2 手中已經無牌可出\n\n"); printf("恭喜 NO.1 獲得勝利\n"); exit(0); }int result=bianli(p3card,ptem->front->hcard);//查看桌面是否有要出的牌 if(-1==result)//沒有 則放入桌面 {pushcard(p3card,ptem->front->hcard); popcard(ptem);}else//有 則收取到正在出牌的選手手里,放在最后 {printf("\n選手收牌:\n");shouqu(ptem,p3card); printf("\n選手 NO.1 \n");shuchuxuanchou(p1card);printf("\n選手 NO.2 \n");shuchuxuanchou(p2card);}/*轉換出牌選手*/if(ptem==p1card){ptem=p2card;}else if(ptem==p2card){ptem=p1card;} } }/*主函數(shù)*/ int main() {//初始化兩名對手和桌面 Bcard *p1card=initcard();//隊列 選手 1 Bcard *p2card=initcard();//隊列 選手 2Bcard *p3card=initcard();//棧 桌面 //發(fā)牌 fapai(p1card,p2card); //展示選手 手里的牌面 printf("\n選手 NO.1 \n");shuchuxuanchou(p1card); printf("\n選手 NO.2 \n");shuchuxuanchou(p2card);//開始游戲 printf("\n選手出牌\n");playgame(p1card,p2card,p3card);//游戲結束 getchar();return 0; }?
?
?
?
總結
以上是生活随笔為你收集整理的扑克牌游戏,两人接龙(数据结构:队列、栈、双向链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程下载文件实践之旅
- 下一篇: 单片机基础入门:单片机电源电路设计,搞定