蛇游戏,如何让蛇移动?

时间:2011-12-04 10:34:48

标签: java

我正在写一个蛇游戏,具体来说,是一个蜈蚣游戏。它需要我画一条蛇,蛇会自动一行一行。

我画了一条蛇,它可以从左侧移动到右侧。但问题是:

我不能让蛇变换线,如果它完成第一行,我需要它改变到第二行并从右侧开始。

我的代码是这样的:

private void move()
{

    myCentipedes[0] =
        new Centipede(Settings.centipedeStartSize, Settings.RIGHT,
              Settings.DOWN);
    myCentipedes[0].segments = new Point[Settings.centipedeStartSize];
    myCentipedes[0].segments[0] = new Point(0, 0);

    boolean dr = true;

    if (dr == true) {
        if (myCentipedes[0].segments[0].x < 30) {
            System.out.println(myCentipedes[0].segments[0].x +
                       "  " +
                       myCentipedes[0].segments[0].y);
            myCentipedes[0].segments[0] = new Point(x, 0);
            for (int i = 1; i < 10; i++) {
                myCentipedes[0].segments[i] =
                    new Point(myCentipedes[0].segments[i - 1].x - 1,
                          myCentipedes[0].segments[i - 1].y);
            }
            x++;
        }
    }

    if (myCentipedes[0].segments[0].x == 29) {
        x = 29;
        dr = false;
    }

    if (dr == false) {
        if (myCentipedes[0].segments[0].x > 0) {
            myCentipedes[0].segments[0] = new Point(x, 1);

            for (int i = 1; i < 10; i++) {
                myCentipedes[0].segments[i] =
                    new Point(myCentipedes[0].segments[i - 1].x + 1, 1);
            }
            x--;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

在我看来,你在每一步都重新创造了整个蜈蚣:

private void move()
{

    myCentipedes[0] =
        new Centipede(Settings.centipedeStartSize, Settings.RIGHT,
              Settings.DOWN);

每个move()有意重建蜈蚣吗?或者move()是否应该从头到尾完全沿着蜈蚣的方向运行蜈蚣? (如果是这样,您需要在此方法中添加一些循环。)

我认为myCentipedes[0]只是未来扩展的占位符,同时涉及两个或更多蜈蚣。这种过度通用的编程有时会使代码在最初编程时更难以读写,并且几乎肯定无济于事。您始终可以将适用于一个蜈蚣的move()方法重新分解为适用于特定蜈蚣的move(int centipede)方法以及针对每个蜈蚣调用move()的{​​{1}}方法在板上。或者您可能会发现将移动代码放入move(int)类更容易,然后需要删除数组索引并使用类成员存储。

Centipede
此时

boolean dr = true; if (dr == true) { 始终等于dr。您也可以删除变量和测试。

true

由于您正在计算 up ,您实际上会将值从for (int i = 1; i < 10; i++) { myCentipedes[0].segments[i] = new Point(myCentipedes[0].segments[i - 1].x - 1, myCentipedes[0].segments[i - 1].y); } 复制到所有元素,一次一个元素。你不能只为segment[0]个对象分配新的数组索引吗?从Point开始并计算 down ,它看起来更像是这样:

i=centipede.segments.length

您可以简化部分测试:

for (int i=myCentipede[0].segments.length; i > 0; i--) {
    myCentipede[0].segments[i] = myCentipede[0].segments[i-1];
}
myCentipede[0].segments[0] = new Point(...,...);

如果此时if (myCentipedes[0].segments[0].x == 29) { x = 29; dr = false; } if (dr == false) { if (myCentipedes[0].segments[0].x > 0) { ,您可能会改为将其写成:

dr == false

但是显然不需要第二个if (myCentipedes[0].segments[0].x == 29) { x = 29; if (myCentipedes[0].segments[0].x > 0) { - 毕竟,if

当您在这里时,请使用常量(29 > 0)清除所有硬编码的10或查找蜈蚣的实际长度(Settings.centipedeStartSize)。


既然我已经批评了你目前的做法,我想建议一个不同的方法:

退后一步,将问题分解为更小的方法。

您已嵌入两个myCentipedes[0].segments.length循环,通过从for分配segment[i]值,一次移动蜈蚣一个细分。不要复制代码,而是使用segment[i-1]循环的主体编写一个新方法来向前移动蜈蚣。通过函数使每个行程的新第一个元素成为for对象。 (不要忘记让它计算 down 而不是 up 。)

一旦你将Point循环分开,我认为从左到右从右到左进行任何必要的更改都会更容易。您可能希望使用嵌套的for循环编写它 - 一个用于控制垂直维度,并且在其中,可能有一个或两个新的for循环来控制水平维度。使这些循环使用简单的for,而不是您目前获得的复杂表达式。

将较大的功能分解为较小的功能将为您提供更好的机会来隔离测试您的功能 - 手动手动,使用这样的简单测试方法:

Centipede c

慢慢来,在编写时测试每个方法,我认为你会发现这是一个比目前看起来更容易的问题。