.Net Core中如何使用SignalR实现斗地主游戏
发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,本篇内容主要讲解".Net Core中如何使用SignalR实现斗地主游戏",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习".Net Core中如何使用Sig
千家信息网最后更新 2024年11月27日.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安全错误
数据库的锁怎样保障安全
数据库技术三级考试难吗
马化腾网络安全系统
软件开发行业新手入门
大铲湾建设互联网 科技城
计算网络技术学的是什么
jave运行服务器类型
云服务器创建网站
防拐防骗与网络安全黑板报
软件开发招聘中国人
虚拟机上的数据库
湖南长沙互联网服务器虚拟主机
h2数据库创建多个
电信网络安全比赛
性价比高的重庆服务器托管服务器
网络安全专家王文华
中国邮政总行公开招聘软件开发类
国际会议数据库形式
csgo完美世界无法连接服务器
网络安全手抄报图片大全4k纸
腾讯服务器怎么恢复数据
网络技术基础与计算思维试题
iaas服务器
网络安全威胁主体
二维核磁数据库
网络安全板块怎么一直跌
如何制作数据库并发模型
我的世界服务器告示牌
中国联通网络技术大会ppt
租服务器费用能报销吗
泰拉瑞亚怎么开云服务器