Xna 当使用2d数组表示方块时,如何赢得打破方块游戏

Xna 当使用2d数组表示方块时,如何赢得打破方块游戏,xna,multidimensional-array,Xna,Multidimensional Array,我刚开始学习XNA,开始做一个简单的断块游戏。我使用2d数组来表示屏幕顶部的块 bricks = new Bricks[18,16]; for (int y = 0; y < 16; y++) { for(int x = 0; x < 18; x++) { bricks[x, y] = new Bricks(BrickTexture,

我刚开始学习XNA,开始做一个简单的断块游戏。我使用2d数组来表示屏幕顶部的块

    bricks = new Bricks[18,16];
        for (int y = 0; y < 16; y++)
        {               
            for(int x = 0; x < 18; x++)
            {
                bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Red);
                if (y == 2 || y == 3)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Blue);
                }
                if (y == 4 || y == 5)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Green);
                }
                if (y == 6 || y == 7)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.White);
                }
                if (y == 8 || y == 9)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Pink);
                }
                if (y == 10 || y == 11)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Purple);
                }
                if (y == 12 || y == 13)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Navy);
                }
            }
        }      
在我的更新方法中,我然后对每个循环使用另一个循环,检查球是否与它们中的任何一个碰撞,以及它们是否必须从屏幕上移除砖块。为此,碰撞方法如下所示

    foreach (Bricks brick in bricks)
            {
                brick.CheckBrickBallCollision(ball);

            } 

    public void CheckBrickBallCollision(Ball ball)
    {
        if (isVisible && ball.Ball2.Intersects(position))
        {
            isVisible = false;
            ball.direction.X *= 0.85f;
            ball.direction.Y *= -1;
        }
    }
我的问题是如何使它一旦所有的砖块都没有了,游戏就赢了,然后通过改变游戏状态就会出现一个赢的屏幕


任何想法都会非常有帮助

在不改变任何代码的情况下做到这一点,您只需计算可见砖块的数量即可

int visibleCount = 0;

foreach (Bricks brick in bricks)
{
    brick.CheckBrickBallCollision(ball);

    if (brick.isVisible)
    {
        visibleCount++;
    }
} 

//If there are no visible bricks then the player won!
if (visibleCount == 0)
{
    //Win the Game!
}

作为另一种选择,您可以管理活动砖块的列表,而不是管理它们的可见性。当砖块被击中时,你可以将其从列表中删除。当列表为空时,您就知道玩家已经赢了。

出于某种原因,查看上面的答案,这就是最终有效的结果,我想与大家分享

    foreach (Bricks brick in bricks)
            {
                brick.CheckBrickBallCollision(ball);
                if (brick.isVisible == true)
                {
                    brokenBlocks -= 1;
                }                                     
            }
            if (brokenBlocks == 40)
            {
                currentGameState = GameState.Won;
            }

这些是我在min上的台词,但我真的不喜欢,如果你说放288块(屏幕上的砖块总数),它说你赢了,这是你所期望的,但是它不喜欢的任何其他数字,这表明它在第一次这样运行之后没有添加任何砖块,如果你明白了吗?当你调试时,你确定你最终会进入循环吗?您要么将所有砖块可见性设置为false,要么数组中没有砖块,导致visibleCount++没有机会被击中,visibleCount为0。你需要确保这些检查只发生在玩家真正能够赢的时候(不是在游戏菜单中,不是在游戏暂停时,只是在玩家玩的时候)。我发布了最终有效的东西,我不明白为什么有效,而你没有,但感谢你的帮助,让我走上了正确的轨道,现在是一个梦想。非常感谢
    foreach (Bricks brick in bricks)
            {
                brick.CheckBrickBallCollision(ball);
                if (brick.isVisible == true)
                {
                    brokenBlocks -= 1;
                }                                     
            }
            if (brokenBlocks == 40)
            {
                currentGameState = GameState.Won;
            }