自己设置的纸牌游戏(简单数组栈和队列的设计)

星期天小白与小婷约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成俩份,每人拿一份。小白先拿出手中的第一张扑克牌放在桌上,然后小婷也拿出手中的第一张扑克牌,并放在小白刚打出的扑克牌上面,就像这样俩人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将俩张相同的牌以及中间所夹着的牌全部取走,并依次放到自己手中牌的末尾。当任意一个人的牌全部出完时,游戏结束,对手获胜!

现在,我为了方便测试只涉及一组数据,因为数据如果不对的话将永远循环下去。

现在假设小白的6张牌顺序为2 4 1 2 5 6,小婷的为3 1 3 5 6 4,最终谁会获胜呢?

自我心得:很有趣的小游戏,通过这个游戏,自己设置了一些符合自己需要的栈和队列,模拟的时候需保持全局观念,不然很容易出错。

最终情况为:
小婷 Win
小婷手中牌为:1 6 5 2 3 4 1
桌上牌为:3 4 5 6 2(注意桌上此时是从第一张开始显示的)

  1 #include<iostream>
  2 #include<vector>
  3 #include<iostream>
  4 using namespace std;
  5 struct myqueue
  6 {
  7     int date[100];
  8     int top;
  9     int tail;
 10     myqueue()
 11     {
 12         top=-1;
 13         tail=-1;
 14 
 15     }
 16     int myempty()
 17     {
 18         return top==tail;
 19 
 20 
 21     }
 22    int mytop()
 23     {
 24         if(myempty())
 25             return 0;
 26         return date[top];
 27 
 28 
 29     }
 30     void myinsert(int x)
 31     {
 32         if(top==-1)
 33         {
 34             date[++top]=x;
 35             tail=1;
 36         }
 37         else
 38         {
 39             date[tail]=x;
 40             tail++;
 41 
 42 
 43         }
 44     }
 45     void mypop()
 46     {
 47         if(top<tail)
 48         top++;
 49         else
 50         {
 51             cout<<"空队列"<<endl;
 52         }
 53     }
 54     void print()
 55     {
 56         for(int i=top;i<tail;i++)
 57             cout<<date[i]<<" ";
 58             cout<<endl;
 59 
 60     }
 61 
 62 
 63 };
 64 struct mystack
 65 {
 66     int date[100];
 67     int top;
 68 
 69     mystack()
 70     {
 71         top=-1;
 72     }
 73     int mytop()
 74     {
 75         if(top==-1) return 0;
 76         return date[top];
 77     }
 78     void mypush(int x)
 79     {
 80         date[++top]=x;
 81     }
 82     void mypop()
 83     {
 84         if(top!=-1)
 85             top--;
 86     }
 87     int findx(int x)
 88     {
 89         int ok=-1;
 90         for(int i=top-1;i>=0;i--)
 91         if(date[i]==x) {ok=i;break;}
 92         return ok;
 93 
 94 
 95     }
 96     void popok(int x,myqueue &y)
 97     {
 98         for(int i=top;i>=x;i--)
 99                 y.myinsert(date[i]);
100         top=x-1;
101 
102     }
103     void print()
104     {
105         for(int i=0;i<=top;i++)
106             cout<<date[i]<<" ";
107             cout<<endl;
108 
109     }
110 
111 
112 
113 };
114 
115 int main()
116 {
117 
118     myqueue x1,x2;
119     mystack x;
120     int a[6]={2,4,1,2,5,6};
121     int b[6]={3,1,3,5,6,4};
122     for(int i=0;i<6;i++)
123     {
124         x1.myinsert(a[i]);
125         x2.myinsert(b[i]);
126 
127     }
128 
129     while(!x1.myempty()&&!x2.myempty())
130     {
131 
132         x.mypush(x1.mytop());
133         int t=x1.mytop();
134         x1.mypop();
135         if(x.findx(t)>=0)
136         {
137             x.popok(x.findx(t),x1);
138 
139         }
140          if(x1.myempty()) break;
141         x.mypush(x2.mytop());
142         int m=x2.mytop();
143         x2.mypop();
144          if(x.findx(m)>=0)
145         {
146             x.popok(x.findx(m),x2);
147 
148         }
149     }
150     if(x1.myempty()) {cout<<"小婷 Win"<<endl;
151     cout<<"小婷手中牌为:";
152     x2.print();
153     cout<<"桌子上牌为:";
154     x.print();
155 
156 
157     }
158     else {cout<<"小白 Win"<<endl;
159     cout<<"小白手中牌为:";
160     x1.print();
161     cout<<"桌子上牌为:";
162     x.print();
163     }
164     return 0;
165 
166 }

 

posted @ 2017-07-22 17:10  余生漫漫浪  阅读(1264)  评论(2编辑  收藏  举报