iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >.Net Core中如何使用SignalR实现斗地主游戏
  • 868
分享到

.Net Core中如何使用SignalR实现斗地主游戏

2023-06-26 03:06:28 868人浏览 八月长安
摘要

本篇内容主要讲解“.net Core中如何使用SignalR实现斗地主游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“.Net Core中如何使用SignalR实现斗地主游

本篇内容主要讲解“.net Core中如何使用SignalR实现斗地主游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“.Net Core中如何使用SignalR实现斗地主游戏”吧!

直接上干货,首先是数据模型:

/// <summary>    /// 用户信息    /// </summary>    public class Customer    {        /// <summary>        /// 唯一ID        /// </summary>        public string? ID { get; set; }        /// <summary>        /// 昵称        /// </summary>        public string? NickName { get; set; }        /// <summary>        /// 卡片        /// </summary>        public List<string> Card { get; set; }    }    /// <summary>    /// 房间    /// </summary>    public class Room    {        /// <summary>        /// 房间名        /// </summary>        public string Name { get; set; }        /// <summary>        /// 房主id        /// </summary>        public string Masterid { get; set; }        /// <summary>        /// 当前出牌人        /// </summary>        public int Curr { get; set; }        /// <summary>        /// 当前卡片        /// </summary>        public List<string> CurrCard { get; set; } = new List<string>();        /// <summary>        /// 当前卡片打出人        /// </summary>        public string ExistinGCardClient { get; set; }        /// <summary>        /// 房间成员列表        /// </summary>        public List<Customer> Customers { get; set; } = new List<Customer>();    }

tips:只是单纯为了斗D主设计的,商用版肯定不能这么搞,参考请慎用。

有了数据模型,自然少不了CRUD:

/// <summary>    /// 用户操作    /// </summary>    public static class CustomerAction    {        /// <summary>        /// 用户列表        /// </summary>        private static List<Customer> cusList = new List<Customer>();        /// <summary>        /// 不存在则新增,存在则修改昵称        /// </summary>        /// <param name="customer"></param>        public static void Create(Customer customer)        {            Customer curr = null;            if (cusList.Count > 0)                curr = cusList.Where(x => x.ID == customer.ID).FirstOrDefault();            if (curr is null)                cusList.Add(customer);            else            {                curr.NickName = customer.NickName;                Up4ID(curr);            }        }        /// <summary>        /// 用户列表        /// </summary>        /// <returns></returns>        public static List<Customer> GetList()        {            return cusList;        }        /// <summary>        /// 获取单个        /// </summary>        /// <param name="id"></param>        /// <returns></returns>        public static Customer GetOne(string id)        {            return cusList.Where(x => x.ID == id).FirstOrDefault();        }        /// <summary>        /// 删除用户        /// </summary>        /// <param name="id"></param>        public static void Delete(string id)        {            cusList.RemoveAll(x => x.ID == id);        }        /// <summary>        /// 增加卡片        /// </summary>        /// <param name="id"></param>        /// <param name="cards"></param>        public static void InCard(string id, List<string> cards)        {            Customer customer = cusList.Where(x => x.ID == id).FirstOrDefault();            if (customer.Card is null)                customer.Card = cards;            else                customer.Card.AddRange(cards);            Up4ID(customer);        }        /// <summary>        /// 扣除卡片        /// </summary>        /// <param name="id"></param>        /// <param name="cards"></param>        /// <param name="group"></param>        /// <returns></returns>        public static bool OutCard(string id, List<string> cards, Room group)        {            Customer client = cusList.Where(x => x.ID == id).FirstOrDefault();            if (client is null)                return false;            //卡片不匹配直接失败            if (client.Card.Where(x => cards.Contains(x)).ToList().Count != cards.Count)                return false;            //不符合出牌规则直接失败            if (!new Game.WithCard().Rule(group.CurrCard, cards, group.ExistingCardClient is null || group.ExistingCardClient == id))                return false;            foreach (var item in cards)            {                client.Card.Remove(item);            }            group.CurrCard = cards;            group.ExistingCardClient = id;            Up4ID(client);            RooMaction.Up4Name(group);            return true;        }        /// <summary>        /// 更新(根据ID)        /// </summary>        /// <param name="customer"></param>        /// <returns></returns>        public static bool Up4ID(Customer customer)        {            if (cusList.Count == 0)                return false;            cusList.RemoveAll(x => x.ID == customer.ID);            cusList.Add(customer);            return true;        }    }    /// <summary>    /// 房间操作    /// </summary>    public static class RoomAction    {        /// <summary>        /// 房间列表        /// </summary>        private static List<Room> roomList = new List<Room>();        /// <summary>        /// 新增房间        /// 如果房间已存在则不新增        /// </summary>        /// <param name="group"></param>        public static void Create(Room group)        {            if (!roomList.Where(x => x.Name == group.Name).Any())                roomList.Add(group);        }        /// <summary>        /// 获取列表        /// </summary>        /// <returns></returns>        public static List<Room> GetList()        {            return roomList;        }        /// <summary>        /// 获取单个        /// </summary>        /// <param name="masterid">房主id</param>        /// <param name="roomName">房间名称</param>        /// <returns></returns>        public static Room GetOne(string masterid = null, string roomName = null)        {            if (roomList.Count == 0)                return null;            if (masterid != null)                return roomList.Where(x => x.Masterid == masterid).FirstOrDefault();            if (roomName != null)                return roomList.Where(x => x.Name == roomName).FirstOrDefault();            return null;        }        /// <summary>        /// 加入房间        /// </summary>        /// <param name="client"></param>        /// <param name="roomName"></param>        public static bool Join(Customer client, string roomName)        {            if (roomList.Count == 0)                return false;            var room = roomList.Where(x => x.Name == roomName).FirstOrDefault();            if (room is null)                return false;            if (room.Customers.Count == 3)                return false;            room.Customers.Add(client);            Up4Name(room);            return true;        }        /// <summary>        /// 删除房间        /// </summary>        /// <param name="masterid">房主id</param>        public static bool Delete(string masterid)        {            if (roomList.Count == 0)                return false;            var room = roomList.Where(x => x.Masterid == masterid).FirstOrDefault();            if (room == null)                return false;            roomList.Remove(room);            return true;        }        /// <summary>        /// 更新(根据房名)        /// </summary>        /// <param name="room"></param>        /// <returns></returns>        public static bool Up4Name(Room room)        {            if (roomList.Count == 0)                return false;            roomList.RemoveAll(x => x.Name == room.Name);            roomList.Add(room);            return true;        }        /// <summary>        /// 更新当前出牌人        /// </summary>        /// <param name="roomName"></param>        /// <param name="index">传入则强制修改,不传按规则走</param>        public static Customer ChangeCurr(string roomName, int index = -1)        {            var room = roomList.Where(x => x.Name == roomName).FirstOrDefault();            if (index != -1)                room.Curr = index;            else                room.Curr = (room.Curr + 1) % 3;            Up4Name(room);            return room.Customers[room.Curr];        }    }

因为所有数据都是通过静态属性保存的,所以大部分都是linq操作(原谅我linq水平有限)。

接下来是游戏逻辑:

/// <summary>    /// 卡片相关    /// </summary>    public class WithCard    {        /// <summary>        /// 黑桃-S、红桃-H、梅花-C、方块-D        /// BG大王,SG小王,14-A,15-2        /// </summary>        readonly List<string> Cards = new List<string>()        {            "S-14","S-15","S-3","S-4","S-5","S-6","S-7","S-8","S-9","S-10","S-11","S-12","S-13",            "H-14","H-15","H-3","H-4","H-5","H-6","H-7","H-8","H-9","H-10","H-11","H-12","H-13",            "C-14","C-15","C-3","C-4","C-5","C-6","C-7","C-8","C-9","C-10","C-11","C-12","C-13",            "D-14","D-15","D-3","D-4","D-5","D-6","D-7","D-8","D-9","D-10","D-11","D-12","D-13",            "BG-99","SG-88"        };        /// <summary>        /// 发牌        /// </summary>        public List<List<string>> DrawCard()        {            List<string> a = new List<string>();            List<string> b = new List<string>();            List<string> c = new List<string>();            Random ran = new Random();            //剩3张底牌            for (int i = 0; i < 51; i++)            {                //随机抽取一张牌                string item = Cards[ran.Next(Cards.Count)];                switch (i % 3)                {                    case 0:                        a.Add(item);                        break;                    case 1:                        b.Add(item);                        break;                    case 2:                        c.Add(item);                        break;                }                Cards.Remove(item);            }            return new List<List<string>>()            {                a,b,c,Cards            };        }        /// <summary>        /// 规则        /// </summary>        /// <param name="existingCard"></param>        /// <param name="newCard"></param>        /// <param name="isSelf"></param>        /// <returns></returns>        public bool Rule(List<string> existingCard, List<string> newCard, bool isSelf)        {            //现有牌号            List<int> existingCardNo = existingCard.Select(x => Convert.ToInt32(x.Split('-')[1])).ToList().OrderBy(x => x).ToList();            //新出牌号            List<int> newCardNo = newCard.Select(x => Convert.ToInt32(x.Split('-')[1])).ToList().OrderBy(x => x).ToList();            //上一手是王炸,禁止其他人出牌            if (existingCardNo.All(x => x > 50) && existingCardNo.Count == 2)            {                if (isSelf)                    return true;                else                    return false;            }            //王炸最大            if (newCardNo.All(x => x > 50) && newCard.Count == 2)                return true;            //单张            if (newCardNo.Count == 1)            {                if (existingCardNo.Count == 0)                    return true;                if ((existingCardNo.Count == 1 && newCardNo[0] > existingCardNo[0]) || isSelf)                    return true;            }            //对子/三只            if (newCardNo.Count == 2 || newCardNo.Count == 3)            {                if (existingCardNo.Count == 0 && newCardNo.All(x => x == newCardNo[0]))                    return true;                if (newCardNo.All(x => x == newCardNo[0]) && (isSelf || newCardNo.Count == existingCardNo.Count && newCardNo[0] > existingCardNo[0]))                    return true;            }            if (newCard.Count == 4)            {                //炸                if (newCardNo.All(x => x == newCardNo[0]))                {                    if (existingCardNo.Count == 0 || isSelf)                        return true;                    if (existingCardNo.All(x => x == existingCardNo[0]) && existingCardNo.Count == 4)                    {                        if (newCardNo[0] > existingCardNo[0])                            return true;                    }                    return true;                }                //三带一                {                    List<int> flagA = newCardNo.Distinct().ToList();                    //超过2种牌直接失败                    if (flagA.Count > 2)                        return false;                    //没有上一手牌,或者上一手是自己出的牌                    if (existingCardNo.Count == 0 || isSelf)                        return true;                    int newCardFlag = 0;                    if (newCardNo.Where(x => x == flagA[0]).ToList().Count() > 1)                    {                        newCardFlag = flagA[0];                    }                    else                        newCardFlag = flagA[1];                    List<int> flagB = existingCardNo.Distinct().ToList();                    //上一手牌不是三带一                    if (flagB.Count > 2)                        return false;                    int existingCardFlag = 0;                    if (existingCardNo.Where(x => x == flagB[0]).ToList().Count() > 1)                    {                        existingCardFlag = flagB[0];                    }                    else                        existingCardFlag = flagB[1];                    if (newCardFlag > existingCardFlag)                        return true;                }            }            if (newCard.Count >= 5)            {                bool flag = true;                for (int i = 0; i < newCardNo.Count - 1; i++)                {                    if (newCardNo[i] + 1 != newCardNo[i + 1])                    {                        flag = false;                        break;                    }                }                //顺子                if (flag)                {                    if (existingCardNo.Count == 0 || (newCardNo[0] > existingCardNo[0] && newCardNo.Count == existingCardNo.Count) || isSelf)                        return true;                }            }            return false;        }    }

单张规则和普通斗D主一样(除了王以外2最大,其次是A),多张规则目前支持:王炸、对子、三只、顺子、三带一。目前只做到这里,各位同学可以拿回去自行扩展。

上一些运行图。房主建房并加入:

.Net Core中如何使用SignalR实现斗地主游戏

新玩家加入:

.Net Core中如何使用SignalR实现斗地主游戏

房间人满以后房主开始游戏,随机分配地主:

.Net Core中如何使用SignalR实现斗地主游戏

出牌特效:

.Net Core中如何使用SignalR实现斗地主游戏

游戏结算:

.Net Core中如何使用SignalR实现斗地主游戏

到此,相信大家对“.Net Core中如何使用SignalR实现斗地主游戏”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: .Net Core中如何使用SignalR实现斗地主游戏

本文链接: https://www.lsjlt.com/news/306607.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • .Net Core中如何使用SignalR实现斗地主游戏
    本篇内容主要讲解“.Net Core中如何使用SignalR实现斗地主游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“.Net Core中如何使用SignalR实现斗地主游...
    99+
    2023-06-26
  • .NetCore使用SignalR实现斗地主游戏
    之前开内部培训,说到实时web应用这一块讲到了SignalR,我说找时间用它做个游戏玩玩,后面时间紧张就一直没安排。这两天闲了又想起这个事,考虑后决定用2天时间写个斗D主,安排了前端...
    99+
    2024-04-02
  • Java中如何实现斗地主游戏
    这篇文章给大家分享的是有关Java中如何实现斗地主游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。题目要求:通过自制54张扑克牌,发给3人,留下3张底牌,分别显示不同人的手牌与底牌达到斗地主的游戏需求算法思想:...
    99+
    2023-06-20
  • 使用java实现一个斗地主游戏
    这期内容当中小编将会给大家带来有关使用java实现一个斗地主游戏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。斗地主案例按照斗地主的规则,完成洗牌发牌的动作。具体规则: 使用54张牌打乱顺序,三个玩家参与...
    99+
    2023-06-06
  • 如何在java中使用ArrayList实现一个斗地主游戏
    本篇文章为大家展示了如何在java中使用ArrayList实现一个斗地主游戏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 准备牌每张扑克牌牌由花色和数字两部分组成。可以使用花色集合与数字集合嵌...
    99+
    2023-06-06
  • Java实现斗地主小游戏
    本文实例为大家分享了Java实现斗地主小游戏的具体代码,供大家参考,具体内容如下 原理图: 斗地主过程:  *  1、组合牌  * &nbs...
    99+
    2024-04-02
  • 怎么用Java实现斗地主小游戏
    这篇文章主要讲解了“怎么用Java实现斗地主小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Java实现斗地主小游戏”吧!本文实例为大家分享了Java实现斗地主小游戏的具体代码,供...
    99+
    2023-06-20
  • 怎么在java中使用HashMap实现一个斗地主游戏
    本篇文章给大家分享的是有关怎么在java中使用HashMap实现一个斗地主游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、准备牌:每张扑克牌牌由花色和数字两部分组成。可以...
    99+
    2023-06-06
  • Eclipse+Java+Swing实现斗地主游戏(代码)
    目录一、系统介绍二、系统展示1.扑克分发2.抢地主3.出牌4.游戏胜利三、系统实现Card.javaCardType.javaCommon.javaModel.javaNewSwin...
    99+
    2024-04-02
  • Java实战项目之斗地主和斗牛游戏的实现
    目录一、前言1.斗地主:1.1运行结果:2.斗地主升级版2.1原理:2.2运行结果:3.斗牛游戏:3.1运行结果:一、前言 练一个斗地主小游戏,只能发看牌 1.斗地主: im...
    99+
    2024-04-02
  • Java高级应用之斗地主游戏的实现示例
    小编给大家分享一下Java高级应用之斗地主游戏的实现示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!斗地主综合案例,供大家参考,具体内容如下运用HashMap、...
    99+
    2023-06-15
  • Java怎么实现斗地主与猜数字游戏
    这篇文章主要介绍了Java怎么实现斗地主与猜数字游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么实现斗地主与猜数字游戏文章都会有所收获,下面我们一起来看看吧。斗地主小游戏之洗牌发牌任务描述编写一个...
    99+
    2023-06-30
  • ASP.NET Core实时库SignalR如何使用
    这篇文章主要讲解了“ASP.NET Core实时库SignalR如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET Core实时库SignalR如何使用...
    99+
    2023-06-26
  • Java实现斗地主与猜数字游戏详细流程
    目录斗地主小游戏之洗牌发牌任务描述运行结果  任务目标实现思路实现代码猜数字游戏任务描述运行结果任务目标实现思路实现代码总结斗地主小游戏之洗牌发牌 任务描述 编写一个斗地主...
    99+
    2024-04-02
  • 基于Python如何实现格斗小游戏
    本文小编为大家详细介绍“基于Python如何实现格斗小游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于Python如何实现格斗小游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、简易版本格斗impor...
    99+
    2023-07-05
  • .NET Core中如何实现或使用对象池?
    目录前言池化策略 对象池的使用 指定对象池容量 在 ASP.NET Core 中使用 总结 前言 池这个概念大家都很熟悉,比如我们经常听到数据库连接池和线程池。它是一种基于使用预先分...
    99+
    2024-04-02
  • java如何实现斗地主发牌功能
    这篇文章给大家分享的是有关java如何实现斗地主发牌功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下问题:参考斗地主的游戏规则,完成一个发牌的功能(54张牌,考虑点数,花色;三名玩家,其中地主比其他...
    99+
    2023-06-20
  • 如何使用JavaSE来模拟斗地主
    本篇内容主要讲解“如何使用JavaSE来模拟斗地主”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用JavaSE来模拟斗地主”吧!Java可以用来干什么Java主要应用于:1. web开发;...
    99+
    2023-06-14
  • .NET Core中RabbitMQ使用死信队列如何实现
    本篇内容介绍了“.NET Core中RabbitMQ使用死信队列如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在.NET ...
    99+
    2023-07-05
  • .Net Core如何使用Logger实现log写入本地文件系统
    这篇“.Net Core如何使用Logger实现log写入本地文件系统”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作