.Net Core中如何使用SignalR实现斗地主游戏
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解".Net Core中如何使用SignalR实现斗地主游戏",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习".Net Core中如何使用Sig
千家信息网最后更新 2026年11月03日.Net Core中如何使用SignalR实现斗地主游戏
本篇内容主要讲解".Net Core中如何使用SignalR实现斗地主游戏",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习".Net Core中如何使用SignalR实现斗地主游戏"吧!
直接上干货,首先是数据模型:
////// 用户信息 /// public class Customer { ////// 唯一ID /// public string? ID { get; set; } ////// 昵称 /// public string? NickName { get; set; } ////// 卡片 /// public ListCard { get; set; } } /// /// 房间 /// public class Room { ////// 房间名 /// public string Name { get; set; } ////// 房主id /// public string Masterid { get; set; } ////// 当前出牌人 /// public int Curr { get; set; } ////// 当前卡片 /// public ListCurrCard { get; set; } = new List (); /// /// 当前卡片打出人 /// public string ExistingCardClient { get; set; } ////// 房间成员列表 /// public ListCustomers { get; set; } = new List (); }
tips:只是单纯为了斗D主设计的,商用版肯定不能这么搞,参考请慎用。
有了数据模型,自然少不了CRUD:
////// 用户操作 /// public static class CustomerAction { ////// 用户列表 /// private static ListcusList = new List (); /// /// 不存在则新增,存在则修改昵称 /// /// 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); } } ////// 用户列表 /// ///public static List GetList() { return cusList; } /// /// 获取单个 /// /// ///public static Customer GetOne(string id) { return cusList.Where(x => x.ID == id).FirstOrDefault(); } /// /// 删除用户 /// /// public static void Delete(string id) { cusList.RemoveAll(x => x.ID == id); } ////// 增加卡片 /// /// /// public static void InCard(string id, Listcards) { Customer customer = cusList.Where(x => x.ID == id).FirstOrDefault(); if (customer.Card is null) customer.Card = cards; else customer.Card.AddRange(cards); Up4ID(customer); } /// /// 扣除卡片 /// /// /// /// ///public static bool OutCard(string id, List 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; } /// /// 更新(根据ID) /// /// ///public static bool Up4ID(Customer customer) { if (cusList.Count == 0) return false; cusList.RemoveAll(x => x.ID == customer.ID); cusList.Add(customer); return true; } } /// /// 房间操作 /// public static class RoomAction { ////// 房间列表 /// private static ListroomList = new List (); /// /// 新增房间 /// 如果房间已存在则不新增 /// /// public static void Create(Room group) { if (!roomList.Where(x => x.Name == group.Name).Any()) roomList.Add(group); } ////// 获取列表 /// ///public static List GetList() { return roomList; } /// /// 获取单个 /// /// 房主id /// 房间名称 ///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; } /// /// 加入房间 /// /// /// 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; } ////// 删除房间 /// /// 房主id 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; } ////// 更新(根据房名) /// /// ///public static bool Up4Name(Room room) { if (roomList.Count == 0) return false; roomList.RemoveAll(x => x.Name == room.Name); roomList.Add(room); return true; } /// /// 更新当前出牌人 /// /// /// 传入则强制修改,不传按规则走 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水平有限)。
接下来是游戏逻辑:
////// 卡片相关 /// public class WithCard { ////// 黑桃-S、红桃-H、梅花-C、方块-D /// BG大王,SG小王,14-A,15-2 /// readonly ListCards = new List () { "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" }; /// /// 发牌 /// public List> DrawCard() { List
a = new List (); List b = new List (); List c = new List (); 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 >() { a,b,c,Cards }; } ///
/// 规则 /// /// /// /// ///public bool Rule(List existingCard, List newCard, bool isSelf) { //现有牌号 List existingCardNo = existingCard.Select(x => Convert.ToInt32(x.Split('-')[1])).ToList().OrderBy(x => x).ToList(); //新出牌号 List 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 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 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实现斗地主游戏"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
房间
卡片
房主
用户
规则
一手
斗地主
数据
三带
更新
最大
内容
单个
对子
昵称
模型
牌号
学习
更深
少不了
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技公司经营范围
厦门中拓互联网络科技有限公司
科技信息互联网
科技互联网技术
互联网科技排名
深圳齐家互联网科技
顺网科技2021年互联网排名
恒生科技互联网指数分析
广西拼得多互联网科技有限公司
互联网科技创新服务
搜狐科技互联网
济南有互联网科技公司吗
中科明德北京互联网科技
互联网科技实习生岗位
富国互联网科技002692
有人说阿里系是互联网科技企业
云鲸互联网络科技有限公司
兰石爱特工业互联网科技分公司
福仕德教育科技互联网
互联网科技的前景
广州淘业互联网络科技
科技服务与互联网
互联网金融公司科技
互联网 的科技创新
互联网还是高科技吗
玉溪互联网科技怎么选
厦门江牛科技互联网
新氧科技和美国互联网有关系吗
中国科技和美国互联网
前海云享互联网科技