日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

纸牌游戏——小猫钓鱼

發(fā)布時(shí)間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 纸牌游戏——小猫钓鱼 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、游戲規(guī)則

將一副撲克牌平均分成兩份,每人拿一份。小哼先拿出手中的第一張撲克牌放在桌上,然后小哈也拿出手中的第一張撲克牌,并放在小哼剛打出的撲克牌的上面,就像這樣兩人交替出牌。出牌時(shí),如果某人打出的牌與桌上某張牌的牌面相同,即可將兩張相同的牌及其中間所夾的牌全部取走,并依次放到自己手中牌的末尾。當(dāng)任意一人手中的牌全部出完時(shí),游戲結(jié)束,對手獲勝。(小哼和小哈手中牌的牌面只有1~9)

二、題目分析

  • 小哼和小哈有兩種操作,分別是出牌和贏牌,這恰好對應(yīng)隊(duì)列的兩個(gè)操作,出牌就是出隊(duì),贏牌就是入隊(duì)。
  • 桌子就是一個(gè)棧,每打出一張牌放到桌上就相當(dāng)于入棧。當(dāng)有人贏牌的時(shí)候,依次將牌從桌上拿走,這就相當(dāng)于出棧。
  • 枚舉桌上的每一張牌,如果某人打出的牌與桌子上的某張牌相同,即可將兩張牌以及中間所夾的牌全部取走。
  • 綜上所述,我們需要兩個(gè)隊(duì)列、一個(gè)棧來模擬整個(gè)游戲。

1,首先我們來創(chuàng)建一個(gè)結(jié)構(gòu)體用來實(shí)現(xiàn)隊(duì)列:

struct queue{int data[1000]; //數(shù)組data用來存儲(chǔ)隊(duì)列中的元素 int head; //head用來存儲(chǔ)隊(duì)頭 int tail; //tail用來存儲(chǔ)隊(duì)尾 };

?

2,再創(chuàng)建一個(gè)結(jié)構(gòu)體用來實(shí)現(xiàn)棧:

struct stack{int data[10]; //數(shù)組data用來存儲(chǔ)棧中的元素 int top; //top用來存儲(chǔ)棧頂 };

?

3,定義兩個(gè)隊(duì)列變量q1和q2:

struct queue q1,q2; //q1用來模擬小哼手中的牌,q2用來模擬小哈手中的牌 struct stack s; //棧變量s用來模擬桌上的牌

?

4,初始化隊(duì)列和棧:

/*初始化隊(duì)列q1和q2為空,因?yàn)榇藭r(shí)兩人手中都還沒有牌*/ q1.head=1;q1.tail=1; q2.head=1;q2.tail=1; s.top=0; //初始化棧s為空,因?yàn)樽铋_始的時(shí)候桌上也沒有牌

?

5,讀入小哼和小哈最初時(shí)手中的牌,分兩次讀入,每次讀入6個(gè)數(shù),分別插入q1和q2中:

for(i=1;i<=6;i++){ //先讀入6張牌,放到小哼手上 scanf("%d",&q1.data[q1.tail]); //讀入一個(gè)數(shù)到隊(duì)尾 q1.tail++; //隊(duì)尾往后挪一位 }for(i=1;i<=6;i++){ //再讀入6張牌,放到小哈手上 scanf("%d",&q2.data[q2.tail]);q2.tail++;}

?

6,游戲開始,小哼先出牌:

t=q1.data[q1.head]; //小哼先亮出一張牌

?

7,枚舉桌上的每一張牌與t比較(判斷桌上的牌與t有沒有相同的):

if(flag==0) {q1.head++; //小哼已經(jīng)打出一張牌,所以要把打出的牌出隊(duì) s.top++;s.data[s.top]=t; //再把打出的牌放到桌上,即入棧 }

8,如果flag的值為1就標(biāo)明小哼可以贏得桌上的牌,所以需要將贏得的牌依次放入小哼的手中:

if(flag==1) //小哼此輪可以贏牌 {q1.head++; //小哼已經(jīng)打出一張牌,所以要把打出的牌出隊(duì) q1.data[q1.tail]=t; //因?yàn)榇溯喛梢在A牌,所以緊接著把剛才打出的牌又放到手中牌的末尾 q1.tail++;while(s.data[s.top]!=t) //把桌上可以贏得的牌依次放到手中牌的末尾 {q1.data[q1.tail]=s.data[s.top]; //依次放入隊(duì)尾 q1.tail++;s.top--; //棧中少了一張牌,所以棧頂要減1 } }

?

?9,至此,小哼出牌的所有階段就模擬完了(小哈類似)。接下來我們要判斷游戲如何結(jié)束:即只要兩人中有一個(gè)人的牌用完了游戲就結(jié)束。因此我們需要在模擬兩人出牌代碼的外面加一個(gè)while循環(huán)來判斷:

while(q1.head<q1.tail && q2.head<q2.tail){ //當(dāng)隊(duì)列不為空的時(shí)候執(zhí)行循環(huán)

?

10,輸出誰最終贏得了游戲,以及游戲結(jié)束后獲勝者手中的牌和桌上的牌。(以小哼為例)

if(q2.head==q2.tail)//如果小哼獲勝那么小哈手中一定沒有牌了(隊(duì)列q2為空) {printf("小哼win\n");printf("小哼當(dāng)前手中的牌是");for(i=q1.head;i<=q1.tail-1;i++)printf(" %d",q1.data[i]);if(s.top>0) //如果桌上有牌則依次輸出桌上的牌 {printf("\n桌上的牌是");for(i=1;i<=s.top;i++)printf(" %d",s.data[i]);}elseprintf("\n桌上已經(jīng)沒有牌了");}

?

三、完整代碼如下

#include<stdio.h> struct queue{int data[1000]; //數(shù)組data用來存儲(chǔ)隊(duì)列中的元素 int head; //head用來存儲(chǔ)隊(duì)頭 int tail; //tail用來存儲(chǔ)隊(duì)尾 }; struct stack{int data[10]; //數(shù)組data用來存儲(chǔ)棧中的元素 int top; //top用來存儲(chǔ)棧頂 };int main() {struct queue q1,q2; //q1用來模擬小哼手中的牌,q2用來模擬小哈手中的牌 struct stack s; //棧變量s用來模擬桌上的牌 int book[10];int i,t;/*初始化隊(duì)列q1和q2為空,因?yàn)榇藭r(shí)兩人手中都還沒有牌*/ q1.head=1;q1.tail=1;q2.head=1;q2.tail=1;s.top=0; //初始化棧s為空,因?yàn)樽铋_始的時(shí)候桌上也沒有牌 for(i=1;i<=9;i++)book[i]=0;for(i=1;i<=6;i++){ //先讀入6張牌,放到小哼手上 scanf("%d",&q1.data[q1.tail]); //讀入一個(gè)數(shù)到隊(duì)尾 q1.tail++; //隊(duì)尾往后挪一位 }for(i=1;i<=6;i++){ //再讀入6張牌,放到小哈手上 scanf("%d",&q2.data[q2.tail]);q2.tail++;}while(q1.head<q1.tail && q2.head<q2.tail){ //當(dāng)隊(duì)列不為空的時(shí)候執(zhí)行循環(huán) t=q1.data[q1.head]; //小哼先亮出一張牌 if(book[t]==0) {q1.head++; //小哼已經(jīng)打出一張牌,所以要把打出的牌出隊(duì) s.top++;s.data[s.top]=t; //再把打出的牌放到桌上,即入棧 book[t]=1;}else{q1.head++; //小哼已經(jīng)打出一張牌,所以要把打出的牌出隊(duì) q1.data[q1.tail]=t; //因?yàn)榇溯喛梢在A牌,所以緊接著把剛才打出的牌又放到手中牌的末尾 q1.tail++;while(s.data[s.top]!=t) //把桌上可以贏得的牌依次放到手中牌的末尾 {book[s.data[s.top]]=0; //取消標(biāo)記q1.data[q1.tail]=s.data[s.top]; //依次放入隊(duì)尾 q1.tail++;s.top--; //棧中少了一張牌,所以棧頂要減1 }book[s.data[s.top]]=0;q1.data[q1.tail]=s.data[s.top];q1.tail++;s.top--;}if(q1.head==q1.tail) break;t=q2.data[q2.head];if(book[t]==0){q2.head++;s.top++;s.data[s.top]=t;book[t]=1;}else{q2.head++;q2.data[q2.tail]=t;q2.tail++;while(s.data[s.top]!=t){book[s.data[s.top]]=0;q2.data[q2.tail]=s.data[s.top];q2.tail++;s.top--;}book[s.data[s.top]]=0;q2.data[q2.tail]=s.data[s.top];q2.tail++;s.top--;}}if(q2.head==q2.tail)//如果小哼獲勝那么小哈手中一定沒有牌了(隊(duì)列q2為空) {printf("小哼win\n");printf("小哼當(dāng)前手中的牌是");for(i=q1.head;i<=q1.tail-1;i++)printf(" %d",q1.data[i]);if(s.top>0) //如果桌上有牌則依次輸出桌上的牌 {printf("\n桌上的牌是");for(i=1;i<=s.top;i++)printf(" %d",s.data[i]);}elseprintf("\n桌上已經(jīng)沒有牌了");}else{printf("小哈win\n");printf("小哈當(dāng)前手中的牌是");for(i=q2.head;i<=q2.tail-1;i++)printf(" %d",q2.data[i]);if(s.top>0){printf("\n桌上的牌是");for(i=1;i<=s.top;i++)printf(" %d",s.data[i]);}elseprintf("\n桌上已經(jīng)沒有牌了");} return 0; } 小貓釣魚

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/OctoptusLian/p/6686759.html

總結(jié)

以上是生活随笔為你收集整理的纸牌游戏——小猫钓鱼的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。