3

我在 Scratch 上做一个桨球游戏(只是为了好玩),但我的得分遇到了问题。如果你想看看我已经写的代码,游戏的链接是https://scratch.mit.edu/projects/66541388/。出于某种原因,在玩游戏时,分数变量实际上并不总是变化一。每次我测试它时,它都会改变一个不同的数字。关于问题是什么或如何解决的任何想法?

这是代码的核心:

when green flag clicked
set [Score v] to [0]
set x to (0)
set y to (0)
point in direction (pick random (-90) to (90))
forever
    if <(y position) < [-146]> then
        broadcast [gameOver v]
        stop [all v]
    end
    if <touching [Paddle v]?> then
        change [color v] effect by (pick random (1) to (1000))
        change [Score v] by (1)
        point in direction (pick random (-90) to (90))
    end
    move (10) steps
    if on edge, bounce
end
4

6 回答 6

3

虽然这两个答案都是正确的,但您可以简单地将评分放在不同的代码块中,使用 a wait until <not<touching [Paddle v]>>,如下所示:

when green flag clicked
forever
    if <touching [Paddle v]> {
        change [color v] effect by (pick random (1) to (1000))
        change [Score v] by (1)
        wait until <not<touching [Paddle v]>>
于 2016-08-20T00:32:02.690 回答
0

您的问题是您正在处理竞争条件。当您测试桨和企鹅之间的碰撞时,企鹅离开桨的速度不会像检测被再次调用时那样快,导致它在分数上增加一个以上。您可以添加一些计时代码,以便如果计时器大于一秒,它只能将分数增加 1。然后在每次“合法”命中后重置计时器。

还有其他方法可以处理这些情况,但你必须要有创意。

于 2015-06-16T16:56:03.707 回答
0

urnotsam 的回答在技术上是正确的,但我想给出一些背后的理由和替代解决方案。

问题在于企鹅不是正方形。当你击中桨时,它会转向一个随机方向,并移动 10 步。现在,如果它开始面向侧面,并且随机方向也几乎是侧面,它可以通过这 10 步逃脱。如果两者都是直的,则相同。但如果它从侧面开始并垂直向上结束,它现在比以前更低于该线,即使移动了 10 步后,它的一部分仍然接触到桨。在我看来,让它领先十或二十步应该让它逃脱,而不是弄乱你的得分。

if <touching [Paddle v]?> then
    change [color v] effect by (pick random (1) to (1000))
    change [Score v] by (1)
    point in direction (pick random (-90) to (90))
    move (20) steps
end
于 2015-06-16T19:12:03.717 回答
0

你可以做的第一件事是为计分添加一个短暂的延迟,这样延迟会让企鹅远离桨。那么它就不会被计入分数。

然而,另一个想法是在企鹅得分时重生。不过,您仍然需要短暂的延迟。这样,企鹅就不会妨碍桨。

于 2019-10-04T13:00:41.193 回答
0

避免多次触球的最简单方法是只计算向下而不是向上的球的触球次数。一旦一个球碰到向下的桨,它的方向就会改变为向上,所以它不会被重新计算。

要在您的代码中实现这一点,请扩展该行

if <touching [Paddle v]?> then

经过

if <<touching [Paddle v] ?> and <([abs v] of (direction)) > [90]>> then

这无需额外的变量或等待函数即可工作。

于 2017-01-05T19:43:00.580 回答
-1

当您将分数更改为 1 时,它可能会计数几次,因为它正在触摸桨,因此您必须在随机方向块的点之后添加一个等待块。它看起来像这样:

    if <touching [Paddle v]?> then
    change [color v] effect by (pick random (1) to (1000))
    change [Score v] by (1)
    point in direction (pick random (-90) to (90))
    wait [0.1] sec
end
于 2016-09-09T11:23:31.850 回答