C語言實(shí)現(xiàn)紙牌游戲(小貓釣魚)
C語言使用隊(duì)列和棧實(shí)現(xiàn)紙牌游戲–小貓釣魚,供大家參考,具體內(nèi)容如下
C語言:
//紙牌游戲--小貓釣魚--隊(duì)列 棧--(所謂的拉火車)
#include <stdio.h>
struct queue //隊(duì)列
{
int data[1000];
int head;
int tail;
};
struct stack //棧
{
int data[10];
int top;
};
int main(void)
{
struct queue q1, q2; //小哼 q1 和小哈 q2 的隊(duì)列
struct stack s; //棧
int book[10]; //記錄,判斷是否第二次出現(xiàn)
int i, t;
q1.head = 1, q1.tail = 1; //初始化隊(duì)列
q2.head = 1, q2.tail = 1;
s.top = 0; //初始化棧
for(i = 1;i <= 9;i++) //初始化出現(xiàn)次數(shù)為 0
book[i] = 0;
for(i = 1; i <= 6; i++) { //這里給定一個(gè)人 6 張牌
scanf("%d", &q1.data[q1.tail]);
q1.tail++;
}
for(i = 1;i <= 6;i++) {
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){ //當(dāng)桌上無此牌時(shí)
q1.head++; //將此牌出隊(duì)
//s.top++;
s.data[++s.top] = t; //將打出的牌入棧
book[t] = 1; //標(biāo)記此牌桌上已有
}else{ //此牌桌上已有,小哼能贏
q1.head++; //將打出的此牌出隊(duì)
q1.data[q1.tail] = t; //將此牌入隊(duì)尾
q1.tail++;
while(s.data[s.top] != t) { //把桌子上贏的牌收回去, 此處沒有收最后一根牌 t
book[s.data[s.top]] = 0; //取消標(biāo)記
q1.data[q1.tail] = s.data[s.top]; //依次放在隊(duì)尾
q1.tail++;
s.top--; //棧中少了一張牌,所以- 1
}
//收回桌上的 t 牌
book[t] = 0;
q1.data[q1.tail] = t;
q1.tail++;
s.top--;
}
if(q1.head == q1.tail ) //如果小哼牌打完了,游戲結(jié)束
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[t] = 0;
q2.data[q2.tail] = t;
q2.tail++;
s.top--;
}
}
if(q2.head == q2.tail ) {
printf("小哼 win \n");
printf("小哼當(dāng)前手中的牌是 ");
for(i = q1.head;i < q1.tail;i++)
printf(" %d",q1.data[i]);
if(s.top) { //如果桌子上有牌的話
printf("\n桌子的牌是");
for(i = 1;i <= s.top;i++)
printf(" %d",s.data[i]);
printf("\n");
}
else
printf("\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) { //如果桌子上有牌的話
printf("\n桌子的牌是");
for(i = 1;i <= s.top;i++)
printf(" %d",s.data[i]);
printf("\n");
} else
printf("\n桌子上已經(jīng)沒有牌了");
}
return 0;
}
/*Code Running Results
1 2 3 4 5 6
3 2 1 5 2 6
小哈 win
小哈當(dāng)前手中的牌是 5 6 2 3 1 3 2 5 2
桌子的牌是 4 6 1
*/
該程序使用隊(duì)列來實(shí)現(xiàn)玩家的手中的牌(玩家的牌只能前面出牌,贏得牌依次放后面),用棧實(shí)現(xiàn)桌子上的牌(出牌放在末端,贏牌也是從末端拿走)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
如何利用C++實(shí)現(xiàn)mysql數(shù)據(jù)庫的連接池詳解
為了提高M(jìn)ySQL數(shù)據(jù)庫的訪問的瓶頸,除了在服務(wù)器端增設(shè)緩存服務(wù)器緩存常用的數(shù)據(jù)之外(如redis),還可以增加數(shù)據(jù)庫連接池,來提高M(jìn)ySQL Server的訪問效率,這篇文章主要給大家介紹了關(guān)于如何利用C++實(shí)現(xiàn)mysql數(shù)據(jù)庫的連接池的相關(guān)資料,需要的朋友可以參考下2021-07-07
Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例
驗(yàn)證碼的原理基于人類視覺和計(jì)算機(jī)視覺的差異性,通過給用戶顯示一些難以被機(jī)器識(shí)別的圖形或文字,讓用戶進(jìn)行人機(jī)交互,確認(rèn)自己的身份,這樣可以有效保護(hù)網(wǎng)站安全,所以本給大家介紹了Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例,感興趣的朋友可以參考下2024-01-01
c++ 移動(dòng)構(gòu)造相關(guān)總結(jié)
這篇文章主要介紹了c++ 移動(dòng)構(gòu)造的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下2021-02-02
C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)詳細(xì)講解
高精度算法的本質(zhì)是把大數(shù)拆成若干固定長度的塊,然后對每一塊進(jìn)行相應(yīng)的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)的相關(guān)資料,需要的朋友可以參考下2022-11-11

