用C语言(控制台)写个斗地主程序(不需要人机对战)
提示: 作者被禁止或删除 内容自动屏蔽
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;//不匹配