我正在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
答案 0 :(得分:1)
你的问题是你正在处理竞争状况。当你测试你的桨和企鹅之间的碰撞时,企鹅不会像检测被再次调用一样快地离开桨,导致它在分数上添加多个。您可以添加一些计时代码,这样如果计时器大于1秒,它只能将得分增加1。然后在每次“合法”命中后重置计时器。
还有其他方法可以解决这些问题,但你必须要有创意。
答案 1 :(得分:1)
虽然两个答案都是正确的,但您可以简单地将评分放在不同的代码块中,使用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]>>
答案 2 :(得分:0)
this question在技术上是正确的,但我想在其背后给出一些推理和替代解决方案。
问题在于企鹅不是正方形。当你击中桨时,它会转向一个随机方向,并移动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
答案 3 :(得分:0)
当您将分数改为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
答案 4 :(得分:0)
避免在球拍上进行多次触球的最简单方法是仅计算向下而不是向上的球的触碰。一旦球接触桨向下,其方向就会变为向上,所以不会重新计算。
要在代码中实现此目的,请扩展行
if <touching [Paddle v]?> then
通过
if <<touching [Paddle v] ?> and <([abs v] of (direction)) > [90]>> then
这没有额外的变量或等待函数。
答案 5 :(得分:0)
您可以做的第一件事是为得分增加一个短暂的延迟,以使延迟可使企鹅远离球拍。那么它将不会被计为分数。
但是,另一个想法是在得分时重生企鹅。不过,您仍然需要短暂的延迟。这样,企鹅就不会碰到桨了。