找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 166|回复: 4

[经验分享探讨] 关于DTA玩家所属色选择互斥

[复制链接]
发表于 2026-3-19 16:23:56 | 显示全部楼层 |阅读模式
本帖最后由 ruanhuhu 于 2026-3-19 16:42 编辑

仅遭遇战下简单测试 不知道是否有其它问题

效果就是已经被选中的颜色 其它玩家/AI不能再使用它

如果可行的话 位置选择也应该同样的原理 加上同样的互斥效果
因为不可能两个玩家选择一个位置开始游戏 大概就是这个效果


在GameLobbyBase类中 新增一个方法
最后在CopyPlayerDataToUI()的最后调用它

/// <summary>
/// 刷新所有玩家颜色下拉框 —— 禁用已被其他玩家选中的颜色
/// </summary>
private void RefreshAllPlayerColors()
{
    // 收集所有已被占用的颜色ID(排除Random=0)
    HashSet<int> usedColorIds = new HashSet<int>();
    foreach (var player in Players)
    {
        if (player.ColorId > 0)
            usedColorIds.Add(player.ColorId);
    }

    // 2. 加入AI玩家已选颜色(新增这一段)
    foreach (var aiPlayer in AIPlayers)
    {
        if (aiPlayer.ColorId > 0)
            usedColorIds.Add(aiPlayer.ColorId);
    }

    // 遍历所有玩家颜色下拉框
    for (int i = 0; i < ddPlayerColors.Length; i++)
    {
        var ddColor = ddPlayerColors;
        //var currentPlayerColorId = Players.Count > i ? Players.ColorId : -1;
        int currentColorId = -1;

        // 判断当前控件对应的是人类玩家还是AI玩家
        if (i < Players.Count)
        {
            currentColorId = Players.ColorId;
        }
        else if (i < Players.Count + AIPlayers.Count)
        {
            int aiIndex = i - Players.Count;
            currentColorId = AIPlayers[aiIndex].ColorId;
        }
        // 遍历颜色项(0=Random,永远可选)
        for (int c = 0; c < ddColor.Items.Count; c++)
        {
            bool isRandom = c == 0;
            bool isOwnColor = (c == currentColorId);
            bool isColorUsed = usedColorIds.Contains(c);

            // 规则:
            // Random 永远可用
            // 自己当前选中的颜色永远可用
            // 别人/AI占用的颜色禁用
            bool canSelect = isRandom || isOwnColor || !isColorUsed;

            ddColor.Items[c].Selectable = canSelect;
            ddColor.SetItemColorEnabled(c, canSelect);
        }
    }
}

还有就是关于鼠标滚动选择下拉框内容
建议加上一个循环跳转和跳过不可选的项
向上滚动的时候判定是否是第一个 如果是则跳转最后一个
向下滚动的时候判定是否是最后一个 如果是则跳转第一个
滚动的时候判定下下一个是否是可选的 不能选则跳到下一个




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2026-3-19 23:07:55 | 显示全部楼层
话说能否在随机颜色的时候,尽量避免同时随机到两个很相似的颜色?
比如,能否定义颜色A与颜色B为同一色族,随机的时候尽量不会让A和B同时被随机到?
回复

使用道具 举报

 楼主| 发表于 2026-3-20 07:29:12 来自手机 | 显示全部楼层
flactine 发表于 2026-3-19 23:07
话说能否在随机颜色的时候,尽量避免同时随机到两个很相似的颜色?
比如,能否定义颜色A与颜色B为同一色族 ...

按你的想法添加代码就行啊
随机的时候做一下筛选
回复

使用道具 举报

 楼主| 发表于 2026-3-20 09:07:08 来自手机 | 显示全部楼层
flactine 发表于 2026-3-19 23:07
话说能否在随机颜色的时候,尽量避免同时随机到两个很相似的颜色?
比如,能否定义颜色A与颜色B为同一色族 ...

简单写了一下 实现起来容易 但是很蠢
可选的色系不够分 就会炸
更合理的是写颜色的时候就不要用相近色
回复

使用道具 举报

发表于 2026-3-20 14:04:40 | 显示全部楼层
DTA里选颜色只是一个映射表,实际控制的是ini配置里的颜色配置,想要不相近,首先你颜色表要做好,然后按照你做好的颜色表的index去做权重分配就好了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|Archiver|手机版|管理员邮箱|红警DIY论坛 |网站地图

GMT+8, 2026-4-21 16:37 , Processed in 0.607101 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表