如何防止Math.random()JavaScript或TypeScript中的重复国家/地区?

时间:2019-01-14 21:17:14

标签: javascript angular typescript

我在用angular 4制作的学习型游戏应用程序中添加了一个功能。我有一个功能,该功能可从区域填充countrys数组,并随机显示国家名称,然后要求用户找到它。作为点/值的记录,我想遍历所有国家/地区,即使在第一次迭代中甚至没有纠正用户答案,下一个周期/迭代都应该从用户未纠正答案的地方开始。我想提供帮助,非常感谢!

用户界面 这是一个基于网络的学习查找地图游戏/应用。当用户打开站点时,它将重定向到登录名,如果本地计算机/计算机中不存在该用户名,则会自动创建一个用户名,并显示对___用户名的欢迎!

欢迎

  1. 新游戏
  2. 成就
  3. 高分

选择游戏模式

  1. 学习
  2. 经典
  3. 时间

选择地区

  1. 南欧
  2. 波罗的海
  3. 南美等

根据所选地区开始游戏

然后询问随机国家名称以查找。如果用户单击了正确的国家/地区,则计数并移动到下一个要查找的国家。

注意 所有国家和地区都来自SVG文件,因此,该图像包含所有区域以及具有自己区域的国家。

代码

 populateCountriesArray(): void {
  this.selectedRegions.forEach(region => {
   const randomizedRegion = Array.prototype.slice.call(region.children);
   for (let i = randomizedRegion.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [randomizedRegion[i], randomizedRegion[j]] = [
      randomizedRegion[j],
      randomizedRegion[i]
    ];
  }

  for (let i = 0; i < randomizedRegion.length; i++) {
    this.countries.push({
      name: randomizedRegion[i].id,
      selected: false,
      numCorrect: 0,
      numTries: 0,
      regionID: +randomizedRegion[i].attributes.region_id.nodeValue
    });
  }
});
}

目标应该是这样的:

迭代1: 西班牙-错误(答案) 意大利-对(答案) 葡萄牙-错误(答案)

迭代2: 西班牙:错(答案) 葡萄牙:对(答案)

迭代3: 西班牙:对(答案)

1 个答案:

答案 0 :(得分:0)

我会这样:将县初始化为二维数组([region] [country])。随机分配国家/地区的顺序(就像您已经做过的那样)。从区域数组开始设置第一个国家。 然后,如果用户选择正确,则搜索下一个。如果所有国家都正确,则转到下一个区域。 那是一个局部代码,可能是

currentRegionIndex = 0;
countrySelected = null;
populateCountriesArray() {
  this.counties = this.selectedRegions.map(region => 
    region.children
      .sort(() => Math.random() - 0.5)
      .map(c => ({
        name: c.id,
        correct: false,
        numTries: 0,
        regionID: +c.attributes.region_id.nodeValue
      }))
  );
  this.countrySelected = this.counties[0][0];
}
pick(point) {
  this.countrySelected.numTries++;
  if(checkCorrect(point, this.countrySelected)){
    this.countrySelected.correct = true;
  }
  if(!this.goNextCountry()) {
    this.currentRegionIndex++;
    if(this.countries.length === this.currentRegionIndex) {
      return alert('Finish!');
    }
    this.countrySelected = this.counties[this.currentRegionIndex][0];
  }
}
goNextCountry() {
  const region = this.counties[this.currentRegionIndex];
  const currentIndex = region.indexOf(this.countrySelected);
  // looking next not completed country from current index
  let next = region.find(c => !c.correct, currentIndex);
  if(!next) {
    // looking from array start
    next = region.find(c => !c.correct);
  }
  if(next) {
    this.countrySelected = next;
  }
  return next;
}