我试图遍历数组,如果所有元素都等于或小于零,它将显示获胜者屏幕。此时,它会在单击播放按钮时显示获胜者屏幕。
for (int i = 0; i <= parent.mygame.getplayer(parent.mygame.getpturn()).getmonsterarray().Length; i++)
{
if (parent.mygame.getplayer(parent.mygame.getpturn()).getmonsterarray()[i].getMonHealth() <= 0)
{
Winner winners = new Winner();
winners.Show();
this.Hide();
}
}
答案 0 :(得分:4)
这里有一些问题:
parent.mygame.getplayer(parent.mygame.getpturn()).getmonsterarray()
,至少效率有点低,并且使代码更难阅读。foreach
循环,除非您确实需要i
<=
,它应该使用<
- 例如,长度为5的数组包含元素0,1,2,3和4。get
方法都是非常规命名的(例如getplayer
应该是GetPlayer
),有些应该是属性或索引器只解决数组部分,您可以使用:
bool anyHealthyMonsters = false;
// I've assumed the type of Monster here. You could use var, but you should understand
// what that means thoroughly first.
foreach (Monster monster in parent.mygame.getplayer(parent.mygame.getpturn())
.getmonsterarray())
{
if (monster.getMonHealth() > 0)
{
anyHealthyMonsters = true;
break;
}
}
if (!anyHealthyMonsters)
{
Winner winners = new Winner();
winners.Show();
this.Hide();
}
更清洁的解决方案是使用LINQ:
if (parent.mygame.getplayer(parent.mygame.getpturn()).getmonsterarray()
.All(monster => monster.getMonHealth() <= 0)
{
Winner winners = new Winner();
winners.Show();
this.Hide();
}
但是,如果您对C#比较陌生,我会建议您在担心之前之前专注于改进设计。我希望 final 结果看起来像:
if (parent.CurrentGame.CurrentPlayer.HasDefeatedAllMonsters())
{
...
}
其中HasDefeatedAllMonsters()
将是Player
类中的一种方法,类似于:
return monsters.All(monster => monster.Health <= 0);
(即使parent.CurrentGame.CurrentPlayer
部分让我有些紧张,但是在没有更多背景的情况下很难在精神上重新设计整个应用程序。我强烈怀疑你不应该问你的“父母”(无论是什么)对于游戏 - 这个班级应该直接了解它。)
答案 1 :(得分:1)
你可以用LINQ:
做一点清洁if(parent.mygame.getplayer(parent.mygame.getpturn()).getmonsterarray().All(m => m.getMonHealth() <= 0))
{
Winner winners = new Winner();
winners.Show();
this.Hide();
}
All()
将检查数组中所有对象是否满足条件(m => m.getMonHealth() <= 0
)。
但是,您应该确保parent
以下的所有对象都已实际初始化。如果任何列表(例如getmonsterarray
())返回null,那么该代码将失败。
答案 2 :(得分:0)
如果满足任何一个胜利条件,您的代码将显示获胜者屏幕,而不是全部。尝试在循环期间将条件编译为单个布尔值,然后在结束时检查(逻辑AND操作)。
Boolean gameIsWon = true;
foreach(var monster in parent.mygame.getplayer(parent.mygame.getpturn()).getmonsterarray())
{
gameIsWon &= monster.getMonHealth() <= 0;
}
if(gameIsWon)
{
Winner winners = new Winner();
winners.Show();
this.Hide();
}
答案 3 :(得分:0)
使用额外的布尔值var:
bool showWinnerScreeen = true;
然后检查所有 MonHealth是否<0
for (int i = 0; i <= parent.mygame.getplayer(parent.mygame.getpturn()).getmonsterarray().Length; i++)
{
if (parent.mygame.getplayer(parent.mygame.getpturn()).getmonsterarray()[i].getMonHealth() > 0)
{
showWinnerScreen = false;
}
}
finnaly显示你的屏幕
if(showWinnerScreen)
{
Winner winners = new Winner();
winners.Show();
this.Hide();
}
您可以使用LINQ和.Any()来执行相同的更短,更高级的...