首頁 > 釣魚視頻 > 四海釣魚 > 裝備發燒友
小貓釣魚(卡牌游戲)- C 語言 小貓釣魚(卡牌游戲)- C 語言
闡明:
周日,小橫和小海一起玩棋盤游戲。 他們正在玩一種很奇怪的撲克游戲——“小貓釣魚”。 游戲規則如下:將一副撲克牌分成兩等份,每人拿一份。 蕭恒首先拿出了手中的第一張撲克牌,放在了桌子上。 隨后蕭哈也拿出了手中的第一張撲克牌,放在了蕭衡剛剛打出的撲克牌之上。 他們就這樣交替著。 玩你的牌。 打牌時,如果某人打出的牌與桌上的牌面相同,則可以將兩張相同的牌以及它們之間的所有牌取走并放在其手中的牌的末尾。 當任何人手中的牌全部打完時,游戲結束,對手獲勝。 如果游戲開始時,小哈手上有6張牌,順序為2 4 1 2 5 6,小哈手上也有6張牌,順序為3 1 3 5 6 4,最終誰會獲勝? 現在你可以拿出卡片來嘗試一下。 接下來,請編寫一個程序來自動確定誰會獲勝。
這里我們做一個約定,小哼和小哈手中牌的牌面只有 1~9。
分析:
我們先來分析一下這個游戲有哪些操作。 小橫有兩種操作小貓釣魚牌的游戲,即打牌和贏牌。 這對應了隊列的兩個操作。 打出一張牌就意味著離開隊伍,贏得一張牌就意味著加入隊伍。 肖哈的***工作和肖恒的一樣。 桌子是一個棧,每打出一張牌放到桌子上,就相當于被推入棧中。 當有人贏得一張牌時,他們會將牌一張一張地從桌子上拿走,這相當于彈出堆棧。 那么如何解決贏牌問題呢? 贏牌的規則是:如果有人打出的牌與桌上的牌相同,則兩張牌以及它們之間的牌都可以被移除。 那么你怎么知道桌上已經有哪些牌呢? 最簡單的方法是枚舉桌上的每張牌,當然還有更好的方法我們稍后會討論。 好吧,總結一下,我們需要兩個隊列和一個堆棧來模擬整個游戲。
代碼:
#includestruct queue{//定義隊列 int data[1000]; int head; int tail; }; struct stack//定義棧 { int data[10]; int top; }; int main() { struct queue q1, q2;//模擬小哈和小哼 struct stack s;//模擬桌子上的牌 int i,t; int book[10];//對桌子上的牌做標記 //初始化值 q1.head = 1; q1.tail = 1; q2.head = 1; q2.tail = 1; //初始化棧頂 s.top = 0; //初始化計數器 for (i = 1; i < 10; i++) book[i] = 0; //逐個輸入 小哼 printf("請輸入小哼手上的6張牌:"); for (i = 1; i <= 6; i++) { scanf_s("%d", &q1.data[q1.tail]); q1.tail++; } //逐個輸入 小哈 printf("請輸入小哈手上的6張牌:"); for (i = 1; i <= 6; i++) { scanf_s("%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) {//表明桌上沒有牌面為t的牌 //小哼此輪沒有贏牌 q1.head++;//小哼已經打出一張牌,所以要把打出的牌出隊 s.top++; s.data[s.top] = t; //再把打出的牌放到桌上,即入棧 book[t] = 1;//標記桌上現在已經有牌面為t的牌 } 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];//依次放入隊尾 s.top--;//棧中少了一張牌,所以棧頂要減1 q1.tail++; } } t = q2.data[q2.head];//小哈出一張牌 //判斷小哈當前打出的牌是否能贏牌 if (book[t] == 0) {//表明桌上沒有牌面為t的牌 //小哈此輪沒有贏牌 q2.head++;//小哈已經打出一張牌,所以要把打出的牌出隊 s.top++; s.data[s.top] = t;//再把打出的牌放到桌上,即入棧 book[t] = 1;//標記桌上現在已經有牌面為t的牌 } 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];//依次放入隊尾 s.top--; q2.tail++; } } } if (q2.head == q2.tail) { printf("小哼WIN!n"); printf("小哼手里的牌是:"); for (i = q1.head; i < q1.tail; i++) { printf("%d ", q1.data[i]); } if (s.top != 0) {//如果桌上有牌則依次輸出桌上的牌 printf("n桌上的牌是:"); for (i = 1; i <= s.top; i++) { printf("%d ", s.data[i]); } } else { printf("桌上已經沒牌了!"); } } if (q1.head == q1.tail) { printf("小哈WIN!n"); printf("小哈手里的牌是:"); for (i = q2.head; i < q2.tail; i++) { printf("%d ", q1.data[i]); } if (s.top != 0) { printf("n桌上的牌是:"); for (i = 1; i <= s.top; i++) { printf("%d ", s.data[i]); } } else { printf("桌上已經沒牌了!"); } } getchar(); getchar(); return 0; }
進入:
請輸入小哼手上的6張牌:2 4 1 2 5 6 請輸入小哈手上的6張牌:3 1 3 5 6 4
輸出:
小哼WIN! 小哼手里的牌是:5 6 2 3 1 4 6 5 桌上的牌是:2 1 3 4
總結:
隊列:(11條消息)解密數字-隊列-C語言博客-CSDN博客
棧:(11條消息)回文數(棧)-c語言博客-CSDN博客
- 上一篇: (釣魚技巧)怎么調漂,還不照樣上得如何的好么?
- 下一篇: 我有一個有意思又有意義的節目創意
猜你喜歡
- 2024-02-27 看電視臺用什么軟件觀看電視直播app合集
- 2024-02-27 上海國際休閑漁具展,釣魚達人現身海汽車會展中心
- 2024-02-27 廣東省基礎教育(汕頭龍湖)教研基地項目實施方案論證會暨項目啟動儀式在林
- 2024-02-27 南京釣魚大爺不能沒有高淳,就像西方無能失去耶路撒冷
- 2024-02-26 嘉德秋拍預覽|閑居:閑居古詩詞
- 2024-02-26 仿生學家發現青蛙和電子蛙眼自然界中生物的奇特本領
- 2024-02-26 磯釣竿和海竿的區別 會計從業資格證考試常見問題及解決辦法
- 2024-02-26 (哈嘍ω?)這條黑魚竟是有一朵花兒!
- 2024-02-26 龜龜里的常見病怎么治療?怎么治好?
- 2024-02-26 釣魚選手釣上百斤魚的視頻讓大家目瞪口呆