用C语言(控制台)写个斗地主程序(不需要人机对战)
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-10 18:55

2010-09-10 19:12
2010-09-10 19:15

2010-09-10 19:43
2010-09-10 19:49

2010-09-10 20:05
2010-09-10 20:16

2010-09-10 21:00
2010-09-10 21:04
程序代码:void Game ( void )
{
for ( ; ; )
{
int isOver = 0 , isWin = 0;
int who/*该谁出牌了*/ , banker/*地主*/,
inital_banker/*和控制 谁是第一个叫地主 有关*/;
InitalGame( );//初始化游戏,发牌
banker = GetBanker( ++ inital_banker );//抢地主,返回地主的编号
//do sth. ///地主收桌面上的3张牌等
for ( who=banker; !isWin ; )//最先由地主出牌,isWin不为0,表示有人牌全部出完了,这一局应该结束了
{
for ( isOver=0; ; )//
{
//do sth. ///出牌等
if ( isOver == 2 ) break;//有连续2个人没出牌了,这一轮该结束了
who = (who > 2) ? ( 1 ) : (who + 1);//下一个出牌者
}
}
WhoWin( who );//谁赢了?显示必要的信息
RePlay ? ///重新开始?
if ( !RePlay ) break;//不重玩了
}
}对于每个人的出牌时间限制,可能还要稍加修改。对于悔牌,只要设计一个环形栈就可以了。
程序代码:typedef struct _CARD { //所有牌的类集合
int n;//牌种类的序号
union{
//各种类型的牌 ///这里这样设计只是为了悔牌,如果不悔牌的话,只要定义一个int属性就好了
}card;
} CARD , *PCARD;
struct card_type_0 {//空牌,用于不出牌,错误的牌等
int dummy;
};
struct card_type_1 {//单张
int v;//牌的大小,斗地主不要区分黑桃等,故如黑桃5,我们把它的大小设为5。红桃K设为13
};
struct card_type_2 { //一对
int v;//同单张,如对A,大小设为14,对2大小设为15
};
struct card_type_3 { //三张,三张带牌规则有可能个地方的不一样
int v;//同单张
union{
struct card_type_1 _simp;//带单张
struct card_type_2 _double;//带一对
struct card_type_0 _nothing;//不带
}ex;
};
struct card_type_3s { //连续的三张,如三8三9
int v; // 连续的三张最小单张 + 连续的三张的长度 * 32,
//有几个三个连起的,如三4三5三6三7,最小单张为4,长度为3
union{
//带的牌,这里规则我不清楚
}ex;
};
struct card_type_4 { //炸弹
int v;//基本上同单张,在加上对鬼,对鬼的大小设为16
};
struct card_type_4ex { // 4张带牌
int v;// 同单张
union{ //我不知道可不可以带其他的牌
struct card_type_1 _simp;//带单张
struct card_type_2 _double;//带一对
struct card_type_0 _nothing;//不带
}ex;
}
/***************这里***************/
struct card_type_5 { //顺子
int v;//顺子的最小单张 + 顺子的长度 * 32,其中32是我随便去的一个大与15数,乘以32可以通过位运算实现
};
...... //省略了部分牌的楼型
/********这里在写牌类型的结构时,一定要安排好个属性的位置,比较大小时用得着**************/
////////////////比较牌的大小///////////////
CARD TranslateCardType(int char0,...);//把牌的组合转换成牌的类
我们要比较牌大小时,可以这样
CARD card1 = TranslateCardType( card10,... ),
card2 = TranslateCardType( card20,... );
int i1 = *(int*)&card1.card , i2 = *(int*)&card2.card ;
if ( (card1.n = card2.n) && (card1.n != 0) )
① (i2>i1) ? 1 : 0;//返回1,表示后面的牌前面的大,可以出;0则相反 ///普通牌类,不是顺子,连对,连三张等
② (i2/32 != i1/32) return -1;//不匹配,如顺子的张数不等
③ (i2>i1) ? 1 : 0; //顺子,连对,连三张等的大小比较
else if ( card1.n ==炸弹的编号 ) return 1;
else return -1;//不匹配

2010-09-11 01:24