麻烦循环数组

时间:2015-01-08 11:41:43

标签: c#

我试图遍历数组,如果所有元素都等于或小于零,它将显示获胜者屏幕。此时,它会在单击播放按钮时显示获胜者屏幕。

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();
    }
}

4 个答案:

答案 0 :(得分:4)

这里有一些问题:

  • 你在循环的每次迭代中调用parent.mygame.getplayer(parent.mygame.getpturn()).getmonsterarray()至少效率有点低,并且使代码更难阅读。
  • 您应该考虑使用foreach循环,除非您确实需要i
  • 的值
  • 您当前的数组循环使用<=,它应该使用< - 例如,长度为5的数组包含元素0,1,2,3和4。
  • 您在任何播放器的循环中显示“获胜者”屏幕,而不是所有元素小于0。
  • 所有这些get方法都是非常规命名的(例如getplayer应该是GetPlayer),有些应该是属性或索引器
  • 此级别的间接违反Law of Demeter非常重要。虽然我对这一般不是教条,但我怀疑你可以通过一些工作使这个很多清洁。

只解决数组部分,您可以使用:

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()来执行相同的更短,更高级的...

相关问题