unity 实现太空狼人杀排序逻辑

这边按要求需要实现一个排序的算法:
玩家自身站在中间,
如果自己是平民,则以自身为中心,先排右边一个再排左边一个依次直到排完。
如果自己是狼人,则以自身为中心,右边排一个狼人,然后再按照先排右边一个再排左边一个依次直到排完。

因为这里最多只有两狼,所以没有做专门的数组进行存储。

首先将数据按照编号从小到大排序,然后对排序号的数据进行遍历,将需要排在左侧的数据存入栈中,将需要排在右侧的数据存入队列中,如果玩家自身是狼人,则将另一狼人数据单独存储。最后输出成排序好的列表,先出栈,然后存入玩家自身,如果狼人有数据则再存入狼人数据,最后出队列。得到的列表就是已经按照要求所实现的站位列表。

using net;
using System.Collections.Generic;

namespace SocialApp
{
    /// <summary>
    /// 狼人游戏辅助类
    /// </summary>
    class WolfGame_Common
    {
        /// <summary>
        /// 根据玩家编号排列角色分配界面
        /// 编号从小到大排序
        /// 以自身为中心(如果自身是狼人,将狼人玩家优先排在自身右边),先右后左依次排序
        /// </summary>
        /// <param name="infos"></param>
        /// <param name="side"></param>
        public static void SortPlayerIndex(ref List<WolfGamePlayerInfo> infos, CSPlayerSide side = CSPlayerSide.CS_PLAYER_SIDE_CIVILIAN)
        {
            Queue<WolfGamePlayerInfo> m_rightQue = new Queue<WolfGamePlayerInfo>();  //右侧队列
            Stack<WolfGamePlayerInfo> m_leftSta = new Stack<WolfGamePlayerInfo>();  //左侧栈
            WolfGamePlayerInfo m_curInfo = new WolfGamePlayerInfo();  //玩家自身数据
            WolfGamePlayerInfo m_wolfInfo = new WolfGamePlayerInfo();  //其他狼人数据
            int m_index = 0;
            int m_stackCount = 0;
            int m_queueCount = 0;

            //初始列表升序排序
            SortListUp(ref infos);

            #region 数据排序初始化

            for (int i = 0; i < infos.Count; i++)
            {
                //如果是玩家自身,单独取值
                if (infos[i].m_uin == BattleContext.CtrlUin)
                {
                    m_curInfo = infos[i];
                    continue;
                }
                else//其他玩家区分狼人和平民
                {
                    if (infos[i].m_side == CSPlayerSide.CS_PLAYER_SIDE_WOLF)
                    {
                        m_wolfInfo = infos[i];

                        if (side == CSPlayerSide.CS_PLAYER_SIDE_WOLF)  //如果玩家自身是狼,则需要将其他狼人剔除。否则不需要
                        {
                            continue;
                        }
                    }
                }

                //分配玩家数据到栈和队列
                //从右往左排
                //先进队列后进栈  依次
                if (m_index % 2 == 0)  //右侧  进队列
                {
                    m_rightQue.Enqueue(infos[i]);
                }
                else  //左侧  进栈
                {
                    m_leftSta.Push(infos[i]);
                }
                m_index++;
            }

            #endregion

            #region 数据写入列表

            //先出栈再写入玩家自身数据(狼人再写入狼人玩家)最后出队列
            infos.Clear();

            //出栈
            m_stackCount = m_leftSta.Count;
            for (int i = 0; i < m_stackCount; i++)
            {
                infos.Add(m_leftSta.Pop());
            }
            m_leftSta.Clear();

            //写入玩家自身数据(狼人再写入狼人玩家)
            infos.Add(m_curInfo);
            if (side == CSPlayerSide.CS_PLAYER_SIDE_WOLF)
            {
                //排除只有自己一狼的情况下,出现空数据
                if(m_wolfInfo.m_uin != 0)
                {
                    infos.Add(m_wolfInfo);
                }
            }

            //出队列
            m_queueCount = m_rightQue.Count;
            for (int i = 0; i < m_queueCount; i++)
            {
                infos.Add(m_rightQue.Dequeue());
            }
            m_rightQue.Clear();

            #endregion
        }

        /// <summary>
        /// 对玩家编号进行升序排序
        /// </summary>
        /// <param name="infos"></param>
        private static void SortListUp(ref List<WolfGamePlayerInfo> infos)
        {
            List<WolfGamePlayerInfo> tmpInfos = new List<WolfGamePlayerInfo>();  //排序后列表
            int m_count = infos.Count;  //传入列表的长度
            int m_minIndex;  //最小的索引值
            int m_minValue;  //最小的编号

            //数据排序
            for (int i = 0; i < m_count; i++)  //排序循环次数
            {
                m_minIndex = 0;    //当前最小的索引值
                m_minValue = (int)infos[0].m_roleNo;  //当前最小的编号
                for (int j = 0; j < infos.Count; j++)  //查找当前列表中的最小值对应的索引值
                {
                    if ((int)infos[j].m_roleNo < m_minValue)
                    {
                        m_minIndex = j;
                        m_minValue = (int)infos[j].m_roleNo;
                    }
                }

                //将当前最小索引值传入列表
                tmpInfos.Add(infos[m_minIndex]);
                infos.RemoveAt(m_minIndex);
            }

            //数据写入
            infos.Clear();
            infos.AddRange(tmpInfos);

            //清空数据
            tmpInfos.Clear();
        }
    }
}

汉字字库存储芯片扩展实验 # 汉字字库存储芯片扩展实验 ## 实验目的 1. 了解汉字字库的存储原理和结构 2. 掌握存储芯片扩展技术 3. 学习如何通过硬件扩展实现大容量汉字字库存储 ## 实验原理 ### 汉字字库存储基础 - 汉字通常采用点阵方式存储(如16×16、24×24、32×32点阵) - 每个汉字需要占用32字节(16×16)到128字节(32×32)不等的存储空间 - 国标GB2312-80包含6763个汉字,需要较大存储容量 ### 存储芯片扩展方法 1. **位扩展**:增加数据总线宽度 2. **字扩展**:增加存储单元数量 3. **混合扩展**:同时进行位扩展和字扩展 ## 实验设备 - 单片机开发板(如STC89C52) - 存储芯片(如27C256、29C040等) - 逻辑门电路芯片(如74HC138、74HC373等) - 示波器、万用表等测试设备 - 连接线若干 ## 实验步骤 ### 1. 单芯片汉字存储实验 1. 连接27C256 EPROM芯片到单片机系统 2. 将16×16点阵汉字字库写入芯片 3. 编写程序读取并显示汉字 ### 2. 存储芯片字扩展实验 1. 使用地址译码器(如74HC138)扩展多片27C256 2. 将完整GB2312字库分布到各芯片中 3. 编写程序实现跨芯片汉字读取 ### 3. 存储芯片位扩展实验 1. 连接两片27C256实现16位数据总线扩展 2. 优化字库存储结构,提高读取速度 3. 测试并比较扩展前后的性能差异 ## 实验代码示例(单片机部分) ```c #include <reg52.h> #include <intrins.h> // 定义存储芯片控制引脚 sbit CE = P2^7; // 片选 sbit OE = P2^6; // 输出使能 sbit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值