1

只是事先给大家做个说明。这是我第一次上编程课,所以当我什么都不懂的时候请多多包涵。

基本上,对于我的课程期末项目,我决定在 c# (visual studio) 中重新创建俄罗斯方块。听起来很容易对吧?出色地....

现在的问题在于移动块。它会移动,但是,当它被移动时会出现问题。当您将其移到右侧时,该块会消失。

这是手头的方法:

if (e.KeyCode == Keys.D)
{
    //run move shape right loop
    for (int i = 0; i < height; i++)
    {
        for (int n = 0; n < width; n++)
        {
            // check to see if movable first and occupied
            if (tetris_grid[n, i, 1] == 0 && tetris_grid[n, i, 0] > 0) //if movable
            {
                if (n == width - 1)  //if at the edge
                {
                    //do nothing
                }
                else if (tetris_grid[n + 1, i, 1] > 0)
                {
                    //do nothing
                }
                else
                {
                    tetris_grid[n + 1, i, 0] = tetris_grid[n, i, 0]; //move the contents over
                    tetris_grid[n, i, 0] = 0;  //set the previous location to empty
                    tetris_grid[n + 1, i, 1] = tetris_grid[n, i, 1];
                    tetris_grid[n, i, 1] = 0;  //set the previous location to empty

                    n = n + 1;  //increment so we don't automatically move to edge
                }
            }
        }
    }

    //redraw
    draw_board();
}

免责声明:我一直在向我的教授寻求帮助,所以移动代码都是他写的。我最初有它,初始数组将其内容移动到另一个数组中,但是他重写了我的代码,使其只是一个 3d 数组,具有一个维度来测量块是否被种植。

我已经查看了堆栈溢出,但其中很多都使用了我以前从未真正学过的代码,我的教授也告诉我不要使用堆栈溢出,但我无能为力,因为我被卡住了。

感谢所有可能的帮助!

4

1 回答 1

0

将您的逻辑移动到方法中(MyLogic(KeyCode kcode)),然后在您使用的 keydown 事件上,调用传递参数 MyLogic(Keys.D)的方法。在您制定了如何在矩阵内移动框的逻辑之后。调用 Invalidate() 方法来刷新你痛苦的板。OnPaint() 事件应该只有画板的逻辑。

OnKeyDown(object sender, EventArgs e){
   MyLogic(e.KeyCode); //I can remember but this is the idea
   myControlBoard.Invalidate();
}

OnPaint(object sender, EventArgs e){
 for(int i = 0; i < mybox.GetLenght(0); i ++)
  for(int j = 0; j < mybox.GetLenght(1); j++)
  { 
     DrawBox(i, j)
  }
}
于 2015-05-11T17:02:25.793 回答