纸牌游戏——小猫钓鱼
生活随笔
收集整理的這篇文章主要介紹了
纸牌游戏——小猫钓鱼
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、游戲規則
將一副撲克牌平均分成兩份,每人拿一份。小哼先拿出手中的第一張撲克牌放在桌上,然后小哈也拿出手中的第一張撲克牌,并放在小哼剛打出的撲克牌的上面,就像這樣兩人交替出牌。出牌時,如果某人打出的牌與桌上某張牌的牌面相同,即可將兩張相同的牌及其中間所夾的牌全部取走,并依次放到自己手中牌的末尾。當任意一人手中的牌全部出完時,游戲結束,對手獲勝。(小哼和小哈手中牌的牌面只有1~9)
二、題目分析
- 小哼和小哈有兩種操作,分別是出牌和贏牌,這恰好對應隊列的兩個操作,出牌就是出隊,贏牌就是入隊。
- 桌子就是一個棧,每打出一張牌放到桌上就相當于入棧。當有人贏牌的時候,依次將牌從桌上拿走,這就相當于出棧。
- 枚舉桌上的每一張牌,如果某人打出的牌與桌子上的某張牌相同,即可將兩張牌以及中間所夾的牌全部取走。
- 綜上所述,我們需要兩個隊列、一個棧來模擬整個游戲。
1,首先我們來創建一個結構體用來實現隊列:
struct queue{int data[1000]; //數組data用來存儲隊列中的元素 int head; //head用來存儲隊頭 int tail; //tail用來存儲隊尾 };?
2,再創建一個結構體用來實現棧:
struct stack{int data[10]; //數組data用來存儲棧中的元素 int top; //top用來存儲棧頂 };?
3,定義兩個隊列變量q1和q2:
struct queue q1,q2; //q1用來模擬小哼手中的牌,q2用來模擬小哈手中的牌 struct stack s; //棧變量s用來模擬桌上的牌?
4,初始化隊列和棧:
/*初始化隊列q1和q2為空,因為此時兩人手中都還沒有牌*/ q1.head=1;q1.tail=1; q2.head=1;q2.tail=1; s.top=0; //初始化棧s為空,因為最開始的時候桌上也沒有牌?
5,讀入小哼和小哈最初時手中的牌,分兩次讀入,每次讀入6個數,分別插入q1和q2中:
for(i=1;i<=6;i++){ //先讀入6張牌,放到小哼手上 scanf("%d",&q1.data[q1.tail]); //讀入一個數到隊尾 q1.tail++; //隊尾往后挪一位 }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++; //小哼已經打出一張牌,所以要把打出的牌出隊 s.top++;s.data[s.top]=t; //再把打出的牌放到桌上,即入棧 }8,如果flag的值為1就標明小哼可以贏得桌上的牌,所以需要將贏得的牌依次放入小哼的手中:
if(flag==1) //小哼此輪可以贏牌 {q1.head++; //小哼已經打出一張牌,所以要把打出的牌出隊 q1.data[q1.tail]=t; //因為此輪可以贏牌,所以緊接著把剛才打出的牌又放到手中牌的末尾 q1.tail++;while(s.data[s.top]!=t) //把桌上可以贏得的牌依次放到手中牌的末尾 {q1.data[q1.tail]=s.data[s.top]; //依次放入隊尾 q1.tail++;s.top--; //棧中少了一張牌,所以棧頂要減1 } }?
?9,至此,小哼出牌的所有階段就模擬完了(小哈類似)。接下來我們要判斷游戲如何結束:即只要兩人中有一個人的牌用完了游戲就結束。因此我們需要在模擬兩人出牌代碼的外面加一個while循環來判斷:
while(q1.head<q1.tail && q2.head<q2.tail){ //當隊列不為空的時候執行循環?
10,輸出誰最終贏得了游戲,以及游戲結束后獲勝者手中的牌和桌上的牌。(以小哼為例)
if(q2.head==q2.tail)//如果小哼獲勝那么小哈手中一定沒有牌了(隊列q2為空) {printf("小哼win\n");printf("小哼當前手中的牌是");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桌上已經沒有牌了");}?
三、完整代碼如下
#include<stdio.h> struct queue{int data[1000]; //數組data用來存儲隊列中的元素 int head; //head用來存儲隊頭 int tail; //tail用來存儲隊尾 }; struct stack{int data[10]; //數組data用來存儲棧中的元素 int top; //top用來存儲棧頂 };int main() {struct queue q1,q2; //q1用來模擬小哼手中的牌,q2用來模擬小哈手中的牌 struct stack s; //棧變量s用來模擬桌上的牌 int book[10];int i,t;/*初始化隊列q1和q2為空,因為此時兩人手中都還沒有牌*/ q1.head=1;q1.tail=1;q2.head=1;q2.tail=1;s.top=0; //初始化棧s為空,因為最開始的時候桌上也沒有牌 for(i=1;i<=9;i++)book[i]=0;for(i=1;i<=6;i++){ //先讀入6張牌,放到小哼手上 scanf("%d",&q1.data[q1.tail]); //讀入一個數到隊尾 q1.tail++; //隊尾往后挪一位 }for(i=1;i<=6;i++){ //再讀入6張牌,放到小哈手上 scanf("%d",&q2.data[q2.tail]);q2.tail++;}while(q1.head<q1.tail && q2.head<q2.tail){ //當隊列不為空的時候執行循環 t=q1.data[q1.head]; //小哼先亮出一張牌 if(book[t]==0) {q1.head++; //小哼已經打出一張牌,所以要把打出的牌出隊 s.top++;s.data[s.top]=t; //再把打出的牌放到桌上,即入棧 book[t]=1;}else{q1.head++; //小哼已經打出一張牌,所以要把打出的牌出隊 q1.data[q1.tail]=t; //因為此輪可以贏牌,所以緊接著把剛才打出的牌又放到手中牌的末尾 q1.tail++;while(s.data[s.top]!=t) //把桌上可以贏得的牌依次放到手中牌的末尾 {book[s.data[s.top]]=0; //取消標記q1.data[q1.tail]=s.data[s.top]; //依次放入隊尾 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)//如果小哼獲勝那么小哈手中一定沒有牌了(隊列q2為空) {printf("小哼win\n");printf("小哼當前手中的牌是");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桌上已經沒有牌了");}else{printf("小哈win\n");printf("小哈當前手中的牌是");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桌上已經沒有牌了");} return 0; } 小貓釣魚?
?
轉載于:https://www.cnblogs.com/OctoptusLian/p/6686759.html
總結
以上是生活随笔為你收集整理的纸牌游戏——小猫钓鱼的全部內容,希望文章能夠幫你解決所遇到的問題。