首页 > 解决方案 > IF ELSE 语句不适用于图像和性别的循环

问题描述

我有一个取自 github 的代码。它应该从图像中生成随机面孔,工作正常。我现在想在代码中添加一个新的性别。目前它有“男性”和“女性”,我想添加“僵尸”和“外星人”。现在我添加了性别,例如在代码中添加了男性和女性,这也有效。我找不到解决方案的一点是,我添加了一个 else if 条件以使外星人和僵尸比男性和女性更罕见,但这不起作用。该代码仅分配随机性别面孔,性别出现的频率没有区别。

我在下面添加了代码,很抱歉它无法重现。你可以在这里得到工作代码: 主文件,Github

 
 if (ranint > 500 <998) return "Female";
 else if (ranint < 2) return "Zombie";
 else if (ranint > 998) return "Alien";
 else return "Male";
}

async function saveFaceByCode(codeArr, outFile) {
  let images = [];
  for (let i=0; i < partTypes.length; i++) {
    if (codeArr[i] != 0) {
      const img = {
        src: `${partFolder}/${partTypes[i].name}${codeArr[i]}${ext}`,
        offsetX: partTypes[i].offset.x,
        offsetY: partTypes[i].offset.y,
      }
      images.push(img);
    }
  }

  // Generate image
  await mergeImagesToPng(images, outFile);
}


async function generateFaces() {

  // Array that lists all characters
  let characters = [];

  // Save attributes and generate map of attributes to saved array index
  let attrArray = [];
  let attrMap = {};
  let attrFreq = {};
  let attrCount = 0;
  for (let i=0; i < partTypes.length; i++) {
    for (let j=1; j<=partTypes[i].count; j++) {
      if (partTypes[i].attrNames[j-1].length > 0) {
        attrArray.push(partTypes[i].attrNames[j-1]);
        attrMap[partTypes[i].attrNames[j-1]] = attrCount;
        attrFreq[partTypes[i].attrNames[j-1]] = 0;
        attrCount++;
      }
    }
  }
  let attrjs = `const attributes = ${JSON.stringify(attrArray)};`;
  attrjs += "\n\nmodule.exports.attributes = attributes;";
  fs.writeFileSync(outputAttributesJS, attrjs);

  // "Code array" contains the code of current "face"
  // Initialize it to the first "face"
  let codeArr = [];
  for (let i=0; i < partTypes.length; i++) {
    if (partTypes[i].required) 
      codeArr.push(1);
    else
      codeArr.push(0);
  }
  let imgCount = 0;

  // In the loop generate faces and increase the code by one
  let exhausted = false;
  while (!exhausted) {
    // Check if combination is valid
    let gender = detectGender(codeArr);
    let valid = checkAttributeCompatibility(codeArr);

    // Skip faces randomly to get close to desired count
    const r = (getRandomInt(1000)+1)/1200;
    // const r = 0;
    if ((r <= desiredCount/totalFaces) && (gender != "Invalid") && (valid)) {
      // Generate and save current face
      await saveFaceByCode(codeArr, `${outputFolder}/image${imgCount}${ext}`);

      // Add character with accessories
      c = {
        id: imgCount,
        gender: gender,
        attributes: []
      };
      for (let i=0; i < partTypes.length; i++) {
        if (partTypes[i].attrNames.length != 0)
          if (codeArr[i] != 0) {
            let attrName = partTypes[i].attrNames[codeArr[i]-1];
            if (attrName.length > 0) {
              c.attributes.push(attrMap[attrName]);
              attrFreq[attrName]++;
            }
          }
      }
      characters.push(c);

      imgCount++;
    } else {
      // console.log(`Skipping. r = ${r}, gender = ${gender}, codeArr=${codeArr}`);
    }

    // Increate code by 1
    let canIncrease = false;
    for (let i=0; i < partTypes.length; i++) {
      if (codeArr[i] < partTypes[i].count) {
        canIncrease = true;
        codeArr[i]++;
        for (let j=i-1; j>=0; j--) {
          if (partTypes[j].required)
            codeArr[j] = 1;
          else
            codeArr[j] = 0;
        }
        break;
      }
    }
    if (!canIncrease) exhausted = true;
    if (imgCount == desiredCount) break;
  }

  // Save characters' JSON
  fs.writeFileSync(outputCharacterJSON, JSON.stringify(characters));

  console.log("Total generated characters: ", imgCount);
  console.log("Attribute frequencies: ", attrFreq);
}

async function generateManually() {

  // Женин любимый
  code = [1, 5, 2, 3, 1, 1, 5, 1];
  await saveFaceByCode(code, "test.png");

  let punks = require("./generated_faces/characters.json");
  c = {
    id: 10000,
    gender: "Male",
    attributes: [3,7,13,21,29]
  };
  punks.push(c);
  fs.writeFileSync("characters.json", JSON.stringify(punks));
}

async function main() {
  await generateFaces();
  // await generateManually();
}

main();

// function test() {
//   code = [1, 6, 2, 4, 4, 1, 8, 1];
//   console.log(detectGender(code));
// }
// test();

我编辑的部分是:

function detectGender(codeArr) {
  let male = false;
  let female = false;
  let zombie = false;
  let alien = false;
  for (let i=0; i < partTypes.length; i++) {
    if (codeArr[i] != 0) {
      const attrGender = partTypes[i].attrSex[codeArr[i]-1];
      if (attrGender == "m") male = true;
      if (attrGender == "f") female = true;
      if (attrGender == "z") zombie = true;
      if (attrGender == "a") alien = true;
    }
  }

  if (male && female) return "Invalid";
  if (male && zombie) return "Invalid";
   if (male && alien) return "Invalid";
    if (female && alien) return "Invalid";
      if (female && zombie) return "Invalid";
       if (alien && zombie) return "Invalid";
  if (male) return "Male";
  if (female) return "Female";
  if (zombie) return "Zombie";
  if (alien) return "Alien";
    
var ranint = Math.floor(Math.random() * 1000) + 1;
 
 if (ranint > 500 <998) return "Female";
 else if (ranint < 2) return "Zombie";
 else if (ranint > 998) return "Alien";
 else return "Male";
}

我知道这编码不好......我只是一个初学者,试图修改网上找到的东西。

标签: javascriptloopsif-statementgenerator

解决方案


对于初学者,以下块很可能会返回一个 String 类型 - 第一个评估 True:

  if (male && female) return "Invalid";
  if (male && zombie) return "Invalid";
   if (male && alien) return "Invalid";
    if (female && alien) return "Invalid";
      if (female && zombie) return "Invalid";
       if (alien && zombie) return "Invalid";
  if (male) return "Male";
  if (female) return "Female";
  if (zombie) return "Zombie";
  if (alien) return "Alien";

所以之后的随机代码将永远不会运行。

此外,如前所述,以下内容应为(我想)

if (ranint > 500 && ranint < 998) return "Female";

推荐阅读