最近在开发计算器以简化游戏(reactoridle)时,我遇到了一个持续存在的问题。问题是,当GUI中的输入数字被更改为某些边界之间的数字时,它会在按Enter键时立即回复到它下方的数字,有时如果再次按下Enter键,它甚至会重复。
我认为代码的一部分在某种程度上与另一部分不一致,即使背后的数学是稳固的。
第一段代码计算热室产生的热量,第二段重新计算每个组件处理热量所需的升级。 所以说你现在正在进行的升级是在代码工作和冲突的边界,如果然后增加升级,它将立即快速恢复。当第一段代码计算出热量时,第二段代码决定你可以用少一点升级来实现热量。
相关的代码位是:
double insulationMultiplier = 1 + insulationPerCell * (insulationUpgrades + 1) * INSULATION_HEAT_MODIFIER;
double upgradeMultiplier = Math.pow(Cell.HEAT_MULTIPLIER, cellUpgrades);
this.heat = cells * insulationMultiplier * upgradeMultiplier * cell.heat * (1 + 0x4p-50d); //???
//avoid trouble when calculating cellUpgrades
this.calculate(START_FROM_HEAT);
double insulationMultiplier = 1 + insulationPerCell * (insulationUpgrades + 1) * INSULATION_HEAT_MODIFIER;
double circulatorMultiplier = circulators ? CIRCULATOR_HEAT_MODIFIER * Math.pow(CIRCULATOR_HEAT_MULTIPLIER, circulatorUpgrades) : 1;
cellUpgrades = (int) ((Math.log(this.heat) - Math.log(insulationMultiplier * cells * cell.heat)) / Math.log(Cell.HEAT_MULTIPLIER));
正如您所看到的,我通过将第一部分中计算出的热量乘以1 + 0x4p-50d
来解决问题,这样可以将热量调整到足以防止算法的第二部分舍入升级再次下降,尽可能小,以避免显示出不同的热值。
同样的问题出现在并行的代码中,与其他两个组件相关,但是规模要大得多,因此它会一次跳过多个数字。我宁愿不像我为第一个组件那样解决它,因为这可能会反过来与其他事情发生冲突。
是否有更严格的方式可以解决这个问题?
提前致谢。