导语

通过编程计算饥荒游戏中,所有农作物可满足肥度自给自足的种植搭配

思路

  1. 穷举出所有农作物,包括生长季节,生长素,堆肥,肥料消耗数值等属性(后续如果版本更新或有MOD农作物需添加,在此处修改添加)
const ALL_CROPS = [{name: '大蒜',season: ['春', '夏', '秋', '冬'],water: 1,auxin: 2,compost: -4,fertilizer: 2},
...
]

2.根据游戏机制可以有两种作物搭配或三种作物搭配,此处涉及到关键算法之一,从所有作物中选择2个或3个的组合,既组合算法中的M选N

/*** 获取作物的所有组合方式 在crops中选取amout个元素* @param crops* @param amount* @returns {*[]|*[]}*/
function cropsCombine (crops, amount) {// TODO
}

3.判断步骤2中的作物搭配,是否可以满足肥料度自给自足。若可以,返回对应的配比系数

/*** 测试作物组合是否满足肥料自给自足* @param crops* @returns {number[]}*/
function test (crops) {// TODO
}

4.对春夏秋冬四个季节,找出适合生长的作物,然后执行算法

下面附上完整代码

const MAP_FERTILIZER = { auxin: '生长素', compost: '堆肥', fertilizer: '肥料' }
const ALL_CROPS = [{name: '大蒜',season: ['春', '夏', '秋', '冬'],water: 1,auxin: 2,compost: -4,fertilizer: 2}, {name: '番茄',season: ['春', '夏', '秋'],water: 3,auxin: -1,compost: -1,fertilizer: 2}, {name: '胡萝卜',season: ['春', '秋', '冬'],water: 1,auxin: -2,compost: 1,fertilizer: 1}, {name: '火龙果',season: ['春', '夏'],water: 2,auxin: 2,compost: 2,fertilizer: -4}, {name: '茄子',season: ['春', '秋'],water: 2,auxin: 1,compost: 1,fertilizer: -2}, {name: '辣椒',season: ['夏', '秋'],water: 1,auxin: 2,compost: 2,fertilizer: -4}, {name: '榴莲',season: ['春'],water: 1,auxin: 2,compost: 2,fertilizer: -4}, {name: '芦笋',season: ['春', '冬'],water: 1,auxin: 1,compost: -2,fertilizer: 1}, {name: '南瓜',season: ['秋', '冬'],water: 2,auxin: -2,compost: 1,fertilizer: 1}, {name: '石榴',season: ['春', '夏'],water: 2,auxin: -4,compost: 2,fertilizer: 2}, {name: '土豆',season: ['春', '秋', '冬'],water: 1,auxin: 1,compost: 1,fertilizer: -2}, {name: '西瓜',season: ['春', '夏'],water: 3,auxin: 2,compost: -1,fertilizer: -1}, {name: '洋葱',season: ['春', '夏', '秋'],water: 2,auxin: -4,compost: 2,fertilizer: 2}, {name: '玉米',season: ['春', '夏', '秋'],water: 1,auxin: 1,compost: -2,fertilizer: 1}
]
// 是否打印肥度
const LOG_FERTILITY = false
// 系数为1是否省略
const OMIT_ONE = true/*** 测试作物组合是否满足肥料自给自足* @param crops* @returns {number[]}*/
function test (crops) {if (!crops || crops.length < 2 || crops.length > 3) returnlet auxin, compost, fertilizerconst crop0 = crops[0]const crop1 = crops[1]const crop2 = crops[2]if (crops.length === 2) {// 两种作物可以是 1:1, 1:2, 2:1, 1:3, 3:1// 1:1auxin = crop0.auxin + crop1.auxincompost = crop0.compost + crop1.compostfertilizer = crop0.fertilizer + crop1.fertilizerif (auxin >= 0 && compost >= 0 && fertilizer >= 0) {return [1, 1]}// 1:2auxin = crop0.auxin + crop1.auxin * 2compost = crop0.compost + crop1.compost * 2fertilizer = crop0.fertilizer + crop1.fertilizer * 2if (auxin >= 0 && compost >= 0 && fertilizer >= 0) {return [1, 2]}// 2:1auxin = crop0.auxin * 2 + crop1.auxincompost = crop0.compost * 2 + crop1.compostfertilizer = crop0.fertilizer * 2 + crop1.fertilizerif (auxin >= 0 && compost >= 0 && fertilizer >= 0) {return [2, 1]}}if (crops.length === 3) {// 三种作物可以是 1:1:1, 2:1:1, 1:2:1, 1:1:2, 1:2:2, 2:1:2, 2:2:1// 1:1:1auxin = crop0.auxin + crop1.auxin + crop2.auxincompost = crop0.compost + crop1.compost + crop2.compostfertilizer = crop0.fertilizer + crop1.fertilizer + crop2.fertilizerif (auxin >= 0 && compost >= 0 && fertilizer >= 0) {return [1, 1, 1]}// 2:1:1auxin = crop0.auxin * 2 + crop1.auxin + crop2.auxincompost = crop0.compost * 2 + crop1.compost + crop2.compostfertilizer = crop0.fertilizer * 2 + crop1.fertilizer + crop2.fertilizerif (auxin >= 0 && compost >= 0 && fertilizer >= 0) {return [2, 1, 1]}// 1:2:1auxin = crop0.auxin + crop1.auxin * 2 + crop2.auxincompost = crop0.compost + crop1.compost * 2 + crop2.compostfertilizer = crop0.fertilizer + crop1.fertilizer * 2 + crop2.fertilizerif (auxin >= 0 && compost >= 0 && fertilizer >= 0) {return [1, 2, 1]}// 1:1:2auxin = crop0.auxin + crop1.auxin + crop2.auxin * 2compost = crop0.compost + crop1.compost + crop2.compost * 2fertilizer = crop0.fertilizer + crop1.fertilizer + crop2.fertilizer * 2if (auxin >= 0 && compost >= 0 && fertilizer >= 0) {return [1, 1, 2]}// 1:2:2auxin = crop0.auxin + crop1.auxin * 2 + crop2.auxin * 2compost = crop0.compost + crop1.compost * 2 + crop2.compost * 2fertilizer = crop0.fertilizer + crop1.fertilizer * 2 + crop2.fertilizer * 2if (auxin >= 0 && compost >= 0 && fertilizer >= 0) {return [1, 2, 2]}// 2:1:2auxin = crop0.auxin * 2 + crop1.auxin + crop2.auxin * 2compost = crop0.compost * 2 + crop1.compost + crop2.compost * 2fertilizer = crop0.fertilizer * 2 + crop1.fertilizer + crop2.fertilizer * 2if (auxin >= 0 && compost >= 0 && fertilizer >= 0) {return [2, 1, 2]}// 2:2:1auxin = crop0.auxin * 2 + crop1.auxin * 2 + crop2.auxincompost = crop0.compost * 2 + crop1.compost * 2 + crop2.compostfertilizer = crop0.fertilizer * 2 + crop1.fertilizer * 2 + crop2.fertilizerif (auxin >= 0 && compost >= 0 && fertilizer >= 0) {return [2, 2, 1]}}
}/*** 获取作物的所有组合方式 在crops中选取amout个元素* @param crops* @param amount* @returns {*[]|*[]}*/
function cropsCombine (crops, amount) {if (!crops || !crops.length) return []return getFlagArrs(crops.length, amount).map(flagArr => flagArr.map((coefficient, index) => coefficient && crops[index]).filter(Boolean))
}function getFlagArrs (m, n) {if (!n || n < 1 || m < n) return []const flagArrs = []const flagArr = new Array(n).fill(1).concat(new Array(m - n).fill(0))flagArrs.push(flagArr.concat())let stop = falsewhile (!stop) {let leftIndex = 0for (let i = 0; i < m - 1; i++) {if (flagArr[i] === 1 && flagArr[i + 1] === 0) {for (let j = 0; j < i; j++) {flagArr[j] = j < leftIndex ? 1 : 0}flagArr[i] = 0flagArr[i + 1] = 1const newFlagArr = flagArr.concat()flagArrs.push(newFlagArr)stop = newFlagArr.slice(-n).join('').indexOf('0') == -1break}flagArr[i] === 1 && leftIndex++}}return flagArrs
}/*** 获取表达式* @param crops* @param amount* @returns {*[]|*[]}*/
function getExpression (combinedCrops) {const scale = test(combinedCrops)if (!scale) returnreturn combinedCrops = scale.map((coefficient, index) => {const crop = combinedCrops[index]const coefficientFormated =  OMIT_ONE ? (coefficient === 1 ? '' : coefficient) : coefficientconst fertility =  LOG_FERTILITY ? `${crop.auxin}, ${crop.compost}, ${crop.fertilizer})` : ''return coefficientFormated + crop.name + fertility}).join(' + ')
};(['春', '夏', '秋', '冬']).forEach(season => {const crops = ALL_CROPS.filter(crop => crop.season && crop.season.indexOf(season) > -1)// 两种作物const double = cropsCombine(crops, 2).map(getExpression).filter(Boolean)// 三种作物const triple = cropsCombine(crops, 3).map(getExpression).filter(Boolean)console.log(`${season}:
两种作物搭配:
${double.join('\n') || '无'}三种作物搭配:
${triple.join('\n') || '无'}`)
})

 输出结果

春:
两种作物搭配:
2番茄 + 火龙果
番茄 + 茄子
2番茄 + 榴莲
番茄 + 土豆
胡萝卜 + 西瓜
石榴 + 2西瓜
2西瓜 + 洋葱

三种作物搭配:
大蒜 + 2胡萝卜 + 火龙果
大蒜 + 2胡萝卜 + 2茄子
大蒜 + 2胡萝卜 + 榴莲
2胡萝卜 + 火龙果 + 2芦笋
胡萝卜 + 茄子 + 芦笋
2胡萝卜 + 榴莲 + 2芦笋
大蒜 + 火龙果 + 石榴
大蒜 + 2茄子 + 石榴
大蒜 + 榴莲 + 石榴
火龙果 + 2芦笋 + 石榴
2茄子 + 2芦笋 + 石榴
榴莲 + 2芦笋 + 石榴
大蒜 + 2胡萝卜 + 2土豆
2番茄 + 茄子 + 土豆
胡萝卜 + 芦笋 + 土豆
大蒜 + 石榴 + 2土豆
2芦笋 + 石榴 + 2土豆
大蒜 + 火龙果 + 洋葱
大蒜 + 2茄子 + 洋葱
大蒜 + 榴莲 + 洋葱
火龙果 + 2芦笋 + 洋葱
2茄子 + 2芦笋 + 洋葱
榴莲 + 2芦笋 + 洋葱
大蒜 + 2土豆 + 洋葱
2芦笋 + 2土豆 + 洋葱
2胡萝卜 + 火龙果 + 2玉米
胡萝卜 + 茄子 + 玉米
2胡萝卜 + 榴莲 + 2玉米
火龙果 + 石榴 + 2玉米
2茄子 + 石榴 + 2玉米
榴莲 + 石榴 + 2玉米
胡萝卜 + 土豆 + 玉米
石榴 + 2土豆 + 2玉米
火龙果 + 洋葱 + 2玉米
2茄子 + 洋葱 + 2玉米
榴莲 + 洋葱 + 2玉米
2土豆 + 洋葱 + 2玉米

夏:
两种作物搭配:
2番茄 + 火龙果
2番茄 + 辣椒
石榴 + 2西瓜
2西瓜 + 洋葱

三种作物搭配:
大蒜 + 火龙果 + 石榴
大蒜 + 辣椒 + 石榴
大蒜 + 火龙果 + 洋葱
大蒜 + 辣椒 + 洋葱
火龙果 + 石榴 + 2玉米
辣椒 + 石榴 + 2玉米
火龙果 + 洋葱 + 2玉米
辣椒 + 洋葱 + 2玉米

秋:
两种作物搭配:
番茄 + 茄子
2番茄 + 辣椒
番茄 + 土豆

三种作物搭配:
大蒜 + 2胡萝卜 + 2茄子
大蒜 + 2胡萝卜 + 辣椒
大蒜 + 2茄子 + 2南瓜
大蒜 + 辣椒 + 2南瓜
大蒜 + 2胡萝卜 + 2土豆
2番茄 + 茄子 + 土豆
大蒜 + 2南瓜 + 2土豆
大蒜 + 2茄子 + 洋葱
大蒜 + 辣椒 + 洋葱
大蒜 + 2土豆 + 洋葱
胡萝卜 + 茄子 + 玉米
2胡萝卜 + 辣椒 + 2玉米
茄子 + 南瓜 + 玉米
辣椒 + 2南瓜 + 2玉米
胡萝卜 + 土豆 + 玉米
南瓜 + 土豆 + 玉米
2茄子 + 洋葱 + 2玉米
辣椒 + 洋葱 + 2玉米
2土豆 + 洋葱 + 2玉米

冬:
两种作物搭配:

三种作物搭配:
大蒜 + 2胡萝卜 + 2土豆
胡萝卜 + 芦笋 + 土豆
大蒜 + 2南瓜 + 2土豆
芦笋 + 南瓜 + 土豆

编程计算饥荒所有农作物搭配(JavaScript版)相关推荐

  1. 《OpenGL编程指南(原书第8版)》——计算着色器

    原文  http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...

  2. 【Python】有红、黄、绿三种颜色的球,编程计算摸出球的各种颜色搭配

    Python三色球问题 题目 代码 结果 题目 有红.黄.绿三种颜色的球,其中红球 3 个, 黄球 3 个,绿 球 6 个.先将这 12 个球混合放在一个盒子中,从中任意摸 出 8 个球,编程计算摸出 ...

  3. 【C语言基础练习】有红、绿、蓝三种颜色的球各3个。现在将着9个球混合放在一个盒子中,从中任意摸出6个,编程计算摸出球的各种颜色搭配。

    有红.绿.蓝三种颜色的球各3个.现在将着9个球混合放在一个盒子中,从中任意摸出6个,编程计算摸出球的各种颜色搭配. 1 #include<stdio.h>2 int main()3 {4 ...

  4. 有红、黄、绿三种颜色的球,其中红球 3 个, 黄球 3 个,绿球 6 个。先将这 12 个球混合放在一个盒子中,从中任意摸出 8 个球,编程计算摸出球的各种颜色搭配。1. 输出情况总数;2.输出摸取情

    内容1:有红.黄.绿三种颜色的球,其中红球 3 个, 黄球 3 个,绿球 6 个.先将这 12 个球混合放在一个盒子中,从中任意摸出 8 个球,编程计算摸出球的各种颜色搭配.1. 输出情况总数;2.输 ...

  5. OpenGL深入探索——《OpenGL编程指南(原书第8版)》——计算着色器

    转载自 <OpenGL编程指南(原书第8版)>--计算着色器 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊人的器件.过去,这种处理器主要被设计用于承担实时图形渲 ...

  6. C语言练习题:三色球分组,编程计算三色球问题。若一个口袋中放有12个球,其中有3个红色的,3个白色的,6个黑色的,从中任取8个球,问共有多少种不同的颜色搭配?请用穷举法编程求解。

    编程计算三色球问题.若一个口袋中放有12个球,其中有3个红色的,3个白色的,6个黑色的,从中任取8个球,问共有多少种不同的颜色搭配?请用穷举法编程求解. **输入格式:无 **输出格式:"i ...

  7. c语言程序设计第三版 孩子身高,C语言的那些题(三) ―― 编程计算身高问题

    今天,再和大家分享一道关于编程计算身高的问题. 每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后身高的因素有遗传.饮食习惯与坚持体育锻炼等.小孩成人后身高与 ...

  8. 大数求乘法逆元c语言,乘法逆元(编程计算)+两道版题

    前言 看到这里的小盆友们千万不要以为这个东西很难,其实就是个1+1->1(1个定义+1个定理->1坨乘法逆元).Let's begin.web 有关乘法逆元定义 这个咱们就不要玩笑了,来, ...

  9. DNF史诗计算机最新版,DNF100级史诗搭配计算器(dnf史诗组合计算工具)V2020.9.19 正式版...

    DNF100级史诗搭配计算器(dnf史诗组合计算工具)是一款很优秀好用的为DNF100级史诗组合推出的计算助手.使用小编带来的这款DNF100级史诗搭配计算器可以帮助玩家更轻松的计算DNF100级史诗 ...

最新文章

  1. c 取地址 虚拟地址 物理地址_通过linux0.11源码理解进程的虚拟地址、线性地址、物理地址...
  2. Java Magic. Part 5: SecurityManager
  3. MySQL || 结果排序--聚集函数讲解
  4. 如何在CRM WebClient UI里使用HANA Live Report
  5. mycli到底有多好用?
  6. 自然语言处理 —— 2.1 词汇表征
  7. 苹果电脑 不能使用服务器发送邮件,解决Mac上无法使用的邮件问题的技术
  8. 数据竞赛入门-金融风控(贷款违约预测)二、EDA
  9. 洛谷P2732 商店购物 Shopping Offers
  10. 数据持久层框架Mybatis
  11. 九度oj 题目1029:魔咒词典
  12. 计算机除数的时候怎么会有分数,在做除法运算时,为什么0不能做除数?
  13. php接入阿里云OOS
  14. Ubuntu 下的磁盘管理
  15. 《Slice-to-volume medical image registration: A survey》论文阅读
  16. gnuplot常用技巧
  17. 一元多项式因式分解的唯一性定理
  18. CentOS 8.1安装MySQL 8.0详解
  19. 清华2020计算机系张晨,清华公布2020特奖候选人名单!平均21岁,还有一姚班大神...
  20. 微信公众号项目开发笔记 一

热门文章

  1. 曾经有个故事,叫西游记 2006-10-05
  2. emWin专题——emWin简介及模拟器的使用
  3. if:听说,你很勇哦?
  4. TGame游戏新篇:1.4 环境配置相关
  5. 北京地铁16号线下月起开建 投资366亿2016年完工 (zz)
  6. 安装facenet环境及N卡GPU驱动
  7. PyQT5 之 Qt Designer 介绍
  8. 2019.4.30 WAGV CF Team replay
  9. 三维重建工具001-——正确安装kaolin库并在SMR上运行
  10. 安兰德写作竞赛可以获得多少奖金?