JavaScript实现国际象棋配对棋手颜色随机化的技术咨询
实现随机执白的国际象棋配对逻辑
嘿,我帮你调整代码来实现每对棋手随机决定执白方的需求!你的思路完全没问题——每取两位棋手,用随机数50%概率调换顺序,这样高评级的棋手不会一直执白。下面是具体的实现步骤和修改后的代码:
核心思路回顾
- 先保持按评级降序排序棋手(这部分你原来的代码是对的,保留这个逻辑)
- 遍历排序后的列表,每次取相邻的两位棋手
- 生成0-1的随机数,若大于0.5则保持原顺序(第一位执白),否则调换顺序(第二位执白)
- 把处理后的配对顺序存入新数组,最后用这个数组填充页面输入框
修改后的完整代码
<script> // input data var toSort = "attaya, james j|blazak, stephen a|larrategui, martin|lionti, michael p|mackenzie, randolph|sassone, richard a|saxby, quinton tyl|trowbridge, james|".split("|"); // 过滤split产生的空字符串 toSort = toSort.filter(name => name.trim() !== ""); // 创建姓名-评级映射 var nameRatingMap = {}; members.forEach(function(element) { nameRatingMap[element.Name] = element.Rating; }); // 按评级降序排序(保留原逻辑) var sorted = toSort.sort(function(a, b) { var ratingA = nameRatingMap[a] || 0; var ratingB = nameRatingMap[b] || 0; return ratingB - ratingA; }); // 生成随机配对顺序的数组 var pairedOrder = []; for (let i = 0; i < sorted.length; i += 2) { let player1 = sorted[i]; let player2 = sorted[i + 1]; if (player2) { // 50%概率调换执白/执黑顺序 if (Math.random() > 0.5) { pairedOrder.push(player1); pairedOrder.push(player2); } else { pairedOrder.push(player2); pairedOrder.push(player1); } } else { // 处理奇数个棋手的情况(可根据规则调整轮空逻辑) pairedOrder.push(player1); } } // 填充页面输入框 for (let i = 0; i < pairedOrder.length; i++) { let playerName = pairedOrder[i]; if (playerName && playerName.length > 0) { let $full = playerName.split(","); let $nick = $full[0]; let displayName = $nick.substr(0, 16) + ", " + $full[1].substr(0, 1) + "."; let rating = nameRatingMap[playerName] || 0; $("#I" + (i + 1)).val(displayName + " " + rating); } } </script>
关键改动说明
- 过滤空元素:
split("|")会在末尾生成空字符串,提前过滤避免后续逻辑报错 - 配对逻辑重构:用
i += 2的循环每次取一对棋手,通过随机数动态调整执白顺序,逻辑更清晰 - 输入框索引修正:输入框ID是
I1、I2这类序列,所以用i+1匹配正确的DOM元素 - 边界情况处理:考虑了奇数个棋手的场景,你可以根据赛事规则调整最后一位棋手的处理方式
这样修改后,既保留了按评级排序的基础,又实现了每对棋手随机决定执白方的需求!
内容的提问来源于stack exchange,提问作者verlager




