.Net Core中如何使用SignalR实现斗地主游戏
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本篇内容主要讲解".Net Core中如何使用SignalR实现斗地主游戏",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习".Net Core中如何使用Sig
千家信息网最后更新 2025年11月08日.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安全错误
数据库的锁怎样保障安全
陈磊网络技术有限公司
cpno数据库表示什么
关系数据库代表什么
加工中心如何转数据库
滁州软件开发文档
中学网络安全活动周
游戏服务器老是卡死重启
创意软件开发工作室家具
网站多个服务器
我的世界黑曼君玩的服务器
什么是服务器机箱加工厂家
大话西游2无底洞服务器联赛史
大数据网络安全概念股
新六艺互联网科技有限公司
计算机网络安全本质
数据库与网络技术哪个实用
怎么退出服务器我的世界电脑版
服务器机房托管费用
交友软件开发要多少钱
为链接上服务器
ue4服务器连接失败
国内我的世界电脑版小游戏服务器
苏州手机软件开发定做
manet网络技术
外商直接投资限制指数数据库
服务器攻击防护
厦门专业软件开发公司哪个好
国防科大图书馆数据库
网络安全培训的目的是什么
vcu策略软件开发