You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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是I1I2这类序列,所以用i+1匹配正确的DOM元素
  • 边界情况处理:考虑了奇数个棋手的场景,你可以根据赛事规则调整最后一位棋手的处理方式

这样修改后,既保留了按评级排序的基础,又实现了每对棋手随机决定执白方的需求!

内容的提问来源于stack exchange,提问作者verlager

火山引擎 最新活动