WEB开发网
开发学院软件开发C语言 C#网络版斗地主——出牌权限的传递 阅读

C#网络版斗地主——出牌权限的传递

 2009-06-08 08:32:26 来源:WEB开发网   
核心提示:本文是对C#网络版斗地主的开发总结,出牌顺序如上图所示,C#网络版斗地主——出牌权限的传递,出牌权限可以用一个bool值表示在Player类中,有一个属性:haveOrder表示玩家是否有权限出牌,还需要考虑到一点,翻倍{DConsole.multiple*=2;}if(DConsole.leadPokers.type

本文是对C#网络版斗地主的开发总结。

C#网络版斗地主——出牌权限的传递

出牌顺序如上图所示。

出牌权限可以用一个bool值表示

在Player类中,有一个属性:haveOrder表示玩家是否有权限出牌。

还需要考虑到一点,当一个玩家出牌后,其他玩家都要不起(pass),该玩家不能自己“要不起”自己,所以还需要一个bool类型的属性“IsBiggest”。

该属性表示自己出的牌最大。怎样保证该值的有效性呢?换句话说,最大的只能有一个。所以,每当自己出牌的时候,只要自己的牌比别人的牌大,就把该值设置为true。当该值为true时,向其他玩家发送信息表明自己的牌比你们的大,其他玩家收到信息后,把自己的IsBiggest属性设置为false;如此一来,就实现了出牌权限的正确传递。

具体实现方法如下:

本文需要Player类中的一些代码:

        private bool _haveOrder;
        public bool haveOrder
        {
            get
            {
                return _haveOrder;
            }
            set
            {
                _haveOrder = value;
            }
        }
        private bool _isBiggest;
        public bool isBiggest //
        {
            get
            {
                return _isBiggest;
            }
            set
            {
                if (value)//给IsBiggest赋值true时
                {
                    if (DConsole.client != null) //当玩家为客户端时
                    {
                        DConsole.client.SendDataForServer("IamIsBiggest");//服务器这边是怎么处理的呢?请看下文.
                        _isBiggest = value;
                    }
                    if (DConsole.server != null)//如果玩家为服务器
                    {
                        DConsole.server.SendDataForClient("NoBiggest", 1);
                        DConsole.server.SendDataForClient("NoBiggest", 2);//告诉客户端,你不是Biggest,客户端如何处理?请看下文
                        _isBiggest = value;
                    }
                }
                else
                {
                    _isBiggest = value;
                }
            }
        }
        public bool lead()//出牌方法
        {
            DConsole.leadPokers = leadPokers;
            this.leadPokers.Clear();
            foreach (int selectPoker in this.selectPokers)  //迭代循环把已选中的牌添加到leadPokers
            {
                this.leadPokers.Add(this.pokers[selectPoker]);
            }//以上代码是将选中的牌构造成一个PokerGroup对象
            if (DConsole.IsRules(this.leadPokers))//验证选中的牌是否符合游戏规则,关于规则在以后的文章中详细讲解
            {
                if (DConsole.player1.isBiggest || DConsole.leadPokers > DConsole.leadedPokerGroups[DConsole.leadedPokerGroups.Count-1]) //玩家能出牌的两种情况是1、自己上轮出的牌是最大的,别人都要不起。2、自己本轮出的牌比别人的大。
                {
                    if (DConsole.leadPokers.type == PokerGroupType.炸弹)//当牌组的类型为炸弹时,翻倍
                    {
                        DConsole.multiple *= 2;
                    }
                    if (DConsole.leadPokers.type == PokerGroupType.双王) //当牌组的类型为双王时,翻三倍
                    {
                        DConsole.multiple *= 3;
                    }
                    DConsole.player1.isBiggest = true;//只要自己的牌出出去了,就假设自己是最大的,一旦自己的牌被别人管上,就会被设置为false,具体请看下文
                    this.BakPoker();  //备份现有pokers,下次出牌时需要用到
                    foreach (int selectPoker in this.selectPokers)  //在pokers里移除已经出过的牌
                    {
                        this.pokers.Remove(this.bakPokers[selectPoker]);
                    }
                    this.selectPokers.Clear();  //清空已选牌
                    return true;
                }
                else
                {
                    this.leadPokers.Clear();
                    return false; //牌组比别人小就返回false
                }
            }
            else
            {
                this.leadPokers.Clear();
                return false; //不符合规则就返回false
            }
        }

1 2 3 4  下一页

Tags:网络 斗地主 权限

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接