C语言设计憋七纸牌游戏

游戏规则描述:
1. 每种花色均为一个双端队列,且只能输入,不能输出,每个队列的第一个输入元素(牌张)必须为7;
2. 向队列中插入的元素必须与队列中两端的元素花色相同且在数值上相邻。例如,当队列中仅有黑桃7时,则只有黑桃8或黑桃6可插入黑桃队列中;若红心队列中已有6、7、8、9,则玩家手上只有红心5或者红心10可插入到红心队列中。其余依此类推;
3. 无论发牌结果如何,手中有黑桃7的玩家必须首先将黑桃7打出,置于桌面。依顺时针次序,其他玩家出掉手中的活牌并加入到桌面上的队列两端,若无活牌可出,则扣掉一张牌。出牌过程连续进行,不存在出牌权的问题;
4. 所谓活牌,是指与桌面上已有的牌花色相同且点数相邻的牌,或者一张任意花色的7;玩家手上若有活牌,则必须选择一张加入队列,不可扣牌;
5. 扣牌:玩家手中没有活牌时必须扣掉任意一张牌,且不可让其他人看到(本程序例外),扣牌在本局不可再拿回手中;有活牌时必须出活牌,不能扣牌;扣牌后,比大于7的被扣牌张点数更大,或者比小于7的被扣牌张点数更小的牌张将失去进入队列的机会,亦将被扣掉。例如,若某玩家扣掉手中的草花10,则其他玩家手中的草花J、Q和K亦失去加入队列的机会,必定在某个时刻被迫扣下;
6. 走通:有一位玩家本局游戏没有扣牌,即该玩家本局游戏手中牌全部出完后,没有扣一张牌;
7. 计算输赢以手中被扣牌张的点数为依据,这里我们不对输赢计算方法作要求,学有余力的同学可自行处理。

实现的一些要求:
本程序模拟憋七的发牌和出牌过程,通过随机函数将52张扑克牌分发到四方。为方便计,可分别称为东南西北方
在持牌区的下方划出左右两个区域,出牌区显示出牌过程,扣牌区显示被扣掉的牌
在出牌区下方是出牌提示区,提示该轮到哪方出牌。出什么牌或扣什么牌由人工从键盘上输入,但程序应该能做到在无牌可出时显示扣牌提示,在有牌可出时只显示出牌提示,且无论哪种情况,输入错误都能检测到并要求重新输入
当出掉或扣掉一张牌时,持牌区中的相应数字应被空格替换掉,同时出牌区或者扣牌区中应相应显示出此牌张点数
为防止屏幕滚动,可使用光标定位函数
#include <conio.h>
void gotoxy(int x, int y)
来实现在屏幕指定位置输出(默认情况下屏幕范围为25行80列)。亦即牌局无论进行到何时,屏幕上的内容均不能滚出屏幕外,必须固定显示,因此出牌提示区需要反复覆盖提示

无需考虑人机对战算法。但必须实现以下要求:
显示版式按上图形式,不得使用图形模式(不能用图形函数)
花色用ASC2码表示,花色和牌大小都要排序
另:最好用一维数组做。能写出思路流程者有额外加分

/* 纸牌模拟程序 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
struct card
{ char suit[2];
char face[3];
};
typedef struct card CARD;
void initcard(CARD deck[],char s[][2],char f[][3]);
void shuffle(CARD deck[]);
void print(CARD deck[]);

int main()
{ CARD deck[52];
char s[4][2]={"\003","\004","\005","\006"};
char f[13][3]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
initcard(deck,s,f);
srand(time(NULL));
shuffle(deck);
print(deck);
system("pause");
return 0;
}

void initcard(CARD deck[],char s[][2],char f[][3])
{ int i;
for(i=0;i<52;i++)
{ strcpy(deck[i].suit,s[i/13]);
strcpy(deck[i].face,f[i%13]);
}
}
void shuffle(CARD deck[])
{ int i,j;
CARD temp;
for(i=0;i<52;i++)
{ j=rand()%52;
if(j!=i)
{ temp=deck[i];
deck[i]=deck[j];
deck[j]=temp;
}
}
}
void print(CARD deck[])
{ int i;
for(i=0;i<52;i++)
{ printf("%2s--%2s",deck[i].suit,deck[i].face);
printf("%c",(i+1)%4? '\t' : '\n');
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-07-14
用C语言设计的话就是用纸牌模拟,
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

struct card
{ char suit[2];
char face[3];
};
typedef struct card CARD;
void initcard(CARD deck[],char s[][2],char f[][3]);
void shuffle(CARD deck[]);
void print(CARD deck[]);

int main()
{ CARD deck[52];
char s[4][2]={"\003","\004","\005","\006"};
char f[13][3]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};(根据规则变化可自行修改)
initcard(deck,s,f);(以下为固定)
srand(time(NULL));
shuffle(deck);
print(deck);
system("pause");
return 0;
}

void initcard(CARD deck[],char s[][2],char f[][3])
{ int i;
for(i=0;i<52;i++)
{ strcpy(deck[i].suit,s[i/13]);
strcpy(deck[i].face,f[i%13]);
}

void shuffle(CARD deck[])
{ int i,j;
CARD temp;
for(i=0;i<52;i++)
{ j=rand()%52;
if(j!=i)
{ temp=deck[i];
deck[i]=deck[j];
deck[j]=temp;
}

void print(CARD deck[])
{ int i;
for(i=0;i<52;i++)
{ printf("%2s--%2s",deck[i].suit,deck[i].face);
printf("%c",(i+1)%4? '\t' : '\n');
}我自己试了下,完全可用,不能做的太大,防止字符超出,缓冲区溢出
第2个回答  2009-07-10
不会