| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7269 人关注过本帖
标题:用C语言(控制台)写个斗地主程序(不需要人机对战)
只看楼主 加入收藏
cacker
该用户已被删除
收藏
已结贴  问题点数:20 回复次数:34 
用C语言(控制台)写个斗地主程序(不需要人机对战)
提示: 作者被禁止或删除 内容自动屏蔽
搜索更多相关主题的帖子: 控制台 斗地主 人机 C语言 
2010-09-10 18:55
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
确定好三人的位置   随机分配51张牌给三个人 把随机发剩的三张牌(地主牌)按位置轮询 此处可加一些逻辑判断或简单处理 为有地主就当 后面就是顺序出牌逻辑判断 over

想象力征服世界
2010-09-10 19:12
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-10 19:15
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:10 
回复 3楼 cacker
出牌很简单啊,我来写一个:
while(1)
{
  int cp=1;//cp指的是优先级,cp=1就是我先出
 if(cp==1)
 {
 //do sth
 cp=2;//变化优先级
 }
  if(cp==2)

  // do sth
 cp=3;

 if (cp==3)
{
//do sth
cp=1;
}
}

通过这些运算就可以实现变换优先级。你明白了吗?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-10 19:43
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-10 19:49
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
想要更合理,可以每个玩家定义一个对象,轮到谁就用操作指针指向那个人,那逻辑代码只需要一份,每次把指针移动到下一个人就行了

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-10 20:05
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-10 20:16
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
你要是会C++的话,那要的是对象指针,不是函数指针,直接用C++实现多态什么的就好了

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-10 21:00
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-10 21:04
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:10 
回 9楼上 :
  ---- 大牛们多提供一些宝贵的意见···· ----
感觉这个论坛上的大牛们基本上都不回答我们这些初学者的问题的。:)

对于您的这个斗地主的编程,由于不需要人机对战,我想应该还是不怎么难的。用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;//不匹配








[ 本帖最后由 Windy0Winll 于 2010-9-11 13:23 编辑 ]

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-11 01:24
快速回复:用C语言(控制台)写个斗地主程序(不需要人机对战)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045445 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved