127 纸牌游戏

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 #define BOOLEAN int
  5 #define TRUE    1
  6 #define FALSE   0
  7 
  8 #define MAX 52
  9 #define INPUT_COUNT_EACH_LINE 26
 10 
 11 typedef struct tagPile
 12 {
 13     char rank[MAX];
 14     char suit[MAX];
 15     int  cardCount;
 16 }Pile;
 17 
 18 Pile pile[MAX] = {{0}};
 19 int  pileCount = 0;    
 20 
 21 char card[MAX][2] = {{0}};
 22 
 23 BOOLEAN getNewPack()
 24 {
 25     int i = 0;
 26     int j = 0;
 27     int k = 0;
 28     char line[100] = {0};
 29     
 30     for(i = 0; i < 2; i++)
 31     {
 32         gets(line);
 33         if(line[0] == '#')
 34         {
 35             return 0;
 36         }    
 37         
 38         for(j=0; j<INPUT_COUNT_EACH_LINE; j++)
 39         {
 40             for(k=0; k<2; k++)
 41             {
 42                 card[INPUT_COUNT_EACH_LINE*i+j][k] = line[j*3+k];
 43             }            
 44         }    
 45     }
 46     return TRUE;
 47 }
 48 
 49 BOOLEAN compareCard(pileId1, pileId2)
 50 {
 51     if((pile[pileId1].rank[pile[pileId1].cardCount-1] == pile[pileId2].rank[pile[pileId2].cardCount-1])
 52        || (pile[pileId1].suit[pile[pileId1].cardCount-1] == pile[pileId2].suit[pile[pileId2].cardCount-1]))
 53     {
 54         return TRUE;
 55     }
 56     else
 57     {
 58         return FALSE;
 59     }
 60 }
 61 
 62 int comparePile(int pileId)
 63 {
 64     int i = 0;
 65     
 66     if(pileId>2)
 67     {
 68         if(compareCard(pileId, pileId-3))
 69         {
 70             return pileId-3;
 71         }            
 72     }
 73     else if(pileId > 0)
 74     {
 75         if(compareCard(pileId, pileId-1))
 76         {
 77             return pileId-1;
 78         }            
 79     }    
 80     
 81     return pileId;    
 82 }
 83 
 84 void moveCard(int pileIdNew, int pileIdOld)
 85 {
 86     int cardCountNew = pile[pileIdNew].cardCount;
 87     int cardCountOld = pile[pileIdOld].cardCount;
 88     cardCountNew++;
 89     
 90     pile[pileIdNew].cardCount++;
 91     pile[pileIdNew].rank[cardCountNew-1] = pile[pileIdOld].rank[cardCountOld-1];
 92     pile[pileIdNew].suit[cardCountNew-1] = pile[pileIdOld].suit[cardCountOld-1];
 93     pile[pileIdOld].cardCount--;
 94     
 95     return;    
 96 }
 97 
 98 void moveOnePile(int pileIdOld)
 99 {
100     memcpy(&pile[pileIdOld], &pile[pileIdOld+1], sizeof(Pile));
101     
102     return;
103 }
104 
105 void moveAllPile(int pileIdOld)
106 {
107     for(; pileIdOld < pileCount-1; pileIdOld++)
108     {
109         moveOnePile(pileIdOld);
110     }
111     
112     pileCount--;
113     
114     return;
115 }
116 
117 
118 void mergePile(int pileId)
119 {
120     int pileIdNew = 0;
121     int pileIdOld = pileId;    
122     
123     for(pileIdNew = pileIdOld; pileIdNew<pileCount; )
124     {
125         pileIdNew = comparePile(pileIdOld);
126         if(pileIdNew == pileIdOld)
127         {
128             pileIdNew++;
129             pileIdOld++;
130         }
131         else
132         {
133             moveCard(pileIdNew, pileIdOld);
134             if(!pile[pileIdOld].cardCount)
135             {
136                 moveAllPile(pileIdOld);
137                 pileIdOld--;
138             }
139         }
140     }
141     
142     return;
143 }
144 
145 /*undo*/
146 void putCard(int cardId)
147 {
148     pileCount++;
149     
150     pile[pileCount-1].rank[0] = card[cardId][0];
151     pile[pileCount-1].suit[0] = card[cardId][1];    
152     pile[pileCount-1].cardCount++;
153     
154     return;    
155 }
156 
157 void printCard()
158 {
159     int i = 0;
160     
161     if(pileCount>1)
162     {
163         printf("%d piles remaining:", pileCount);        
164     }
165     else{
166         printf("%d pile remaining:", pileCount);
167     }
168     
169     printf("%d piles remaining:", pileCount);
170     for(i = 0; i < pileCount; i++)
171     {
172         printf(" %d", pile[i].cardCount);
173     }
174     printf("\n");
175 }
176 
177 int main(int argc, char *argv[])
178 {
179     int i = 0;
180     
181     while(getNewPack())
182     {
183         for(i = 0; i < MAX; i++)
184         {
185             putCard(i);    
186             mergePile(pileCount-1);
187         }
188     
189         printCard();
190     }
191 
192     return 0;
193 }

 

转载于:https://www.cnblogs.com/reasontom/p/3528714.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值