我正在做我的作业,而且我坚持一些逻辑(我认为我正确地使用了这个术语?)。我正在编写一个应用程序,显示12个编号为1-12的按钮,2个骰子图片和一个滚动按钮。
玩家掷骰子(2,6双面骰子)和他得到的任何数字,他可以用来“掩盖”12个数字中的一些。例如,假设他掷骰子并获得3和5.他可以选择是否覆盖3和5,或者两个数字的总数 - 8(我是否提到我是数学智商? )。
游戏的目标是使用最少量的卷来覆盖所有数字。
我遇到的问题是,我认为是if语句:
if (die1 == 3 && die2 == 5) {
player can cover 3 and 5, or 8, but not both
}
现在,我认为这是有效的,但如果我把所有这些都写出来,那么if语句就会是36(给予或取零)。有更简单的方法吗?
答案 0 :(得分:5)
根据您的描述,我认为播放器可以选择die1
,die2
或die1 + die2
,以便查看用户是否选择了有效值,只需要一个。
if (cover == die1 or cover == die2 or cover == ( die1 + die2)) {
//valid..
}
答案 1 :(得分:2)
如果需要声明则不。播放器可以涵盖die1
和die2
或die1+die2
答案 2 :(得分:2)
这是使用开关案例IMO的一个很好的例子。 这是2个开关,每个开关有6个。
答案 3 :(得分:1)
在玩家试图掩盖某事之前不要检查。通过仅验证输入,您可以将所有内容简化为一个if
语句。
如果你做需要知道所有可能性(也许是为了向玩家显示可能的动作),那么......你仍然不需要所有那些if
语句。只需突出显示与骰子滚动相匹配的按钮,并仅接受这些按钮作为输入;你想要在数组或地图中按它们的值(例如“1”)索引它们作为检索它们的方法。
答案 4 :(得分:1)
你知道有两个骰子,你总有三种遮盖选择。大概在代码的其他地方,你要将你的覆盖选项与数字进行比较。像
这样的东西int[] covered = { die1, die2, die1+die2 };
// ... other stuff
if (comparisonValue > 6) {
// maybe do special stuff since this uses both dice
if (comparisonValue == covered[2]) {
// covered/coverable behavior
} else {
// not
}
} else {
// maybe do special stuff since this only uses one die
if (comparisonValue == covered[0] || comparisonValue == covered[1]) {
// covered/coverable behavior
} else {
// not
}
}
首先为您提供所涵盖的内容,然后简单地使用它。您还可以在数组上foreach
为覆盖的数字做一些事情,ala
for (int c : covered) {
// do stuff with c because it's covered
}
这是相当脆弱的,但灵活的答案(例如,将结果转储到Collection
)对于6面,整数面部骰子来说方式过度,并且真的< / em>灵活的答案(例如,容纳不同数量的骰子,将面孔特殊组合成结果)就像是针对这一特定问题的核武器。
针对您的特定问题进行编辑,我会执行类似
的操作// start new turn, disable all buttons
// get rolls
int[] coverable = { die1, die2, die1+die2 };
for (int covered : coverable ) {
// enabled covered button
}
如果玩家可以根据新的结果更改前一卷中的1-12中的哪一个,那么你可以根据你想给他们多少帮助来获得一些乐趣。
答案 5 :(得分:0)
我可能会创建2个新对象并将它们与查找表一起使用,如下所示:
class TossResult{
int firstDie;
int secondDie;
}
Class Coverage{
TossResult tossResult;
int getThirdNumber(){
return tossResult.firstDie + tossResult.secondDie;
}
}
然后在应用程序启动时,填充地图:
HashMap<TossResult, Coverage> lookup = new HashMap<>();
for (int i = 0, i < SIDES_ON_DIE; i++){
for (int j = 0, j < SIDES_ON_DIE; j++){
TossResult tempResult = new TossResult(i,j);
Coverage tempCoverage = new Coverage(tempResult);
lookup.put(tempResult, tempCoverage);
}
}
用户掷骰子后,创建一个新的TossResult并执行lookup.get(tossResult)
答案 6 :(得分:0)
您还可以创建一个包含12个int或bool的数组。初始化所有12个元素(比如0或false)。然后,对于每个角色,你可以做一些喜欢的事情:
if (false == myArray[die1Value] && false == myArray[die2Value]) {
myArray[die1Value] = true;
myArray[die2Value] = true;
} else if (false == myArray[die1Value + die2Value]) {
myArray[die1Value + die2Value]
} else if (false == myArray[die1Value] || false == myArray[die2Value]) {
if (false == myArray[die1Value]) {
myArray[die1Value] = true;
}
if (false == myArray[die2Value]) {
myArray[die2Value] = true;
}
} else {
// all 12 covered
}
当然,你可以再修改一下这段代码。 所述目标“游戏的目标是使用最少量的卷来覆盖所有数字。”是不可行的,真的。你可以做的最好的事情是使用概率来知道你是否应该首先覆盖1和2,1和2或3的卷: - )