javascript - 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";
}
我知道这编码不好......我只是一个初学者,试图修改网上找到的东西。
解决方案
对于初学者,以下块很可能会返回一个 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";
推荐阅读
- amazon-web-services - 启动 AWS EC2 服务器后 Docker-compose 自动启动
- c - 内存对齐的目的是什么,为什么我需要它?
- sql - 如何在sql中通过引用日期来计数
- javascript - 在Javascript中替换由特定字符包围的多个文本实例
- continuous-integration - Gitlab CI 管道包含模板不起作用(秘密检测)
- vue.js - Vue 创建项目 - 找不到模块'vue-loader-v16/package.json'
- python - 如何使用 Matplotlib/Seaborn 并排绘制两个堆叠的直方图
- python - 在哪里使用二元二元交叉熵损失
- android - kotlin:android.view.InflateException: 二进制 XML 文件行 #24
- php - 在 WooCommerce 中为定义的 $product 或 $variation 对象重新生成瞬态