2016-05-14 1 views
1

Я был пойман играть Slither во время класса. Мое наказание заключалось в том, чтобы запрограммировать игру в малой базовой.если заявления странные поведение

Теперь у меня есть ряд шариков, и если первый шар перекатывается над маленькими точками. Точки исчезнут, и вы получите очко. Условное утверждение, что проверяет, если большой шар находится на маленькой точке это:

If (foodX[x] - SnakeHeadX) < precision And (foodX[x] - SnakeHeadX) > -precision And (foodY[x] - SnakeHeadY) < precision And (foodY[x] - SnakeHeadY) > -precision Then 

Это, если утверждение в for loop

For x = 1 To 500 

Так что я получаю мои очки, но когда большой бал его х значение и значение y меньше, чем 20. Я также получаю очки. Что-то, чего не должно быть.

Это сценарий (The @ является большим шаром)

--------------------------------------------------------------------------------------------- 
|@           * 
| 
|       * 
|                  * 
| *         * 
| 
|           * 
--------------------------------------------------------------------------------------------- 

Как вы можете увидеть большой шар не касается маленьких точек. Но я набираю очки. Почему это правда? И как мне это исправить?

+0

Если вы упростите это на 'If Math.Abs ​​(foodX [x] - SnakeHeadX) <точность и математика. (FoodY [x] - SnakeHeadY) <точность Затем', это помогает? Вы не указали ценность или цель «точности», которая может иметь значение. –

+0

Прецизионность - это своего рода трезол. Если вы сделаете это больше, большой шар не должен приближаться к точке, чтобы он исчез. –

ответ

1

Звучит так, будто вы пытаетесь управлять коробками с ударами. Там, где две формы взаимодействуют друг с другом. Кроме того, ваш подход, по-видимому, заключается в вычислении расстояния между этими двумя объектами, и если он находится ниже теневого удержания (ваша прецизионная переменная), вы считаете его ударом.

У меня есть два предложения:

  1. Использование полное расстояние сформулировать. Вы в настоящее время проверяете X и Y отдельно, и я имидж, это вызывает вашу проблему.
  2. Заброшенные дистанции в пользу ударных ящиков. Для этого требуются очень большие длинные и очень сложные операторы If в Small Basic, но это дает вам больше контроля.

Образцы:

'Distance from centers 
distance = Math.SquareRoot(Math.Power(foodX[x] - SnakeHeadX,2) + Math.Power(foodY[x] - SnakeHeadY),2) 
If distance < precision Then 
    'feed the snake 
EndIf 

'Hit boxes 
If SnakeHeadX > foodX[x] And SnakeHeadX < foodX[x] And SnakeHeadY > foodY[x] And SnakeHeadY < foodY[x] Then 'top left corner of snake 
    If 'top right coner of the snake 
    ' Repeat for all four corners of the snake 
    EndIf 
endif 

Если это не поможет прояснить вашу проблему. Чем больше деталей и тем более примерный код вы предоставляете, тем лучше.

+0

1suggestion работает отлично и выглядит намного чище. –

+0

Math.Power действительно принимает 2 аргумента. –

+0

Исправлена ​​опечатка. Спасибо за головы. :-) – codingCat