Как двигать черепах на игровом симуляторе? - PullRequest
0 голосов
/ 27 декабря 2018

Я создаю симулятор настольной игры, похожий на монополию, где фигуры движутся по доске.Моя черепаха действует как часть игры пользователя и перемещается по всему миру.Граница устанавливается чередующимися цветами.У меня есть кнопка, которая генерирует количество шагов, которые перемещает черепаха.Эти шаги хранятся в виде dice-num, глобальной переменной.Однако, когда черепаха приземляется на участки перед участком (16-16) (нижний правый угол доски), и количество шагов, которое ей необходимо сделать, превышает 1, я не могу повернуть направление черепахи наполовину, чтобыдвигаться вверх по доске.В результате он возвращается только к началу доски.

Я пытался рассматривать каждый случай отдельно:

     ;if the turtle lands on the patch before the corner
     ask turtle 0 [if pycor = min-pycor and pxcor = max-pxcor - 1 
       [setxy max-pxcor min-pycor
         set dice-num dice-num - 1 
       show dice-num
         ]
       ] 

; число кубов относится к числу шагов, которые черепахаходы

Вот мой код:

    to setup
     board
    end

  to go
   dice-roll
  end 

  to board
  ask patches [if pxcor = max-pxcor or pycor = max-pycor or pxcor = min- 
  pxcor or pycor = min-pycor
  [set pcolor blue]]

ask patches [if pycor = max-pycor or pycor = min-pycor
 [if pxcor mod 2 = 0
   [set pcolor orange]]]

ask patches [if pxcor = max-pxcor or pxcor = min-pxcor
 [if pycor mod 2 = 0
   [set pcolor orange]]]

 ask patch min-pxcor min-pycor [set pcolor green]
end

to dice-roll
  set dice [1 2 3 4 5 6]
  set dice-num one-of dice
  user-message (word "You rolled: " dice-num)
  ask turtle 0 [
  fd dice-num
  ]

 ;allows the turtle to turn if it lands on a corner
 ask turtle 0 [if ycor = min-pycor and xcor = max-pxcor [set heading 0]
  if xcor = max-pxcor and ycor = max-pycor [set heading 270] 
  if xcor = min-pxcor and ycor = max-pycor [set heading 180]
 ;add a statement to end game once player rereaches the green patch
 ]

 ;if the turtle lands on the patch before the corner
 ask turtle 0 [if pycor = min-pycor and pxcor = max-pxcor - 1 
   [setxy max-pxcor min-pycor
 set dice-num dice-num - 1 
 show dice-num
   ]
 ]
 end

Я ожидаю, что на выходе будет черепаха, которая начнет двигаться вверх по правой стороне доски, как только она упадет на патч (15 -16) и получает число кубиков больше 1. Однако, когда черепаха приземляется на пятно (15 -16), а число кубиков больше 1, она просто возвращается к началу доски.

1 Ответ

0 голосов
/ 28 декабря 2018

Хорошо, это было просто слишком долго для комментариев, поэтому мне пришлось сделать некоторые предположения.Я ожидаю, что проблема была в том, что вы пересылали всю сумму броска кубика после проверки местоположения.Это будет означать, что вы должны протестировать все возможные патчи, которые могут дойти до угла.Вместо этого перед перемещением следующего патча легче переместить один патч и проверить местоположение.Это очищенная версия вашего кода, которая реализует этот процесс перемещения и проверки.

to setup
  clear-all
  board
  ask one-of patches with [pcolor = green]
  [ sprout 1
    [ set color white
      set heading 90
      forward 1
    ]
  ]
end

to go
  let die-num dice-roll
  ask one-of turtles [ move die-num ]
end 

to board
  ask patches with [ pxcor = max-pxcor or pxcor = min-pxcor ]
  [ set pcolor ifelse-value (pycor mod 2 = 0) [orange][blue] ]
  ask patches with [ pycor = max-pycor or pycor = min-pycor ]
  [ set pcolor ifelse-value (pxcor mod 2 = 0) [orange][blue] ]
  ask patch min-pxcor min-pycor [set pcolor green]
end

to-report dice-roll
  let dice-num one-of [1 2 3 4 5 6]
  user-message (word "You rolled: " dice-num)
  report dice-num
end

to move [#roll]
  while [ #roll > 0 ]
  [ if pxcor = max-pxcor and pycor = max-pycor [set heading one-of [180 270] ]
    if pxcor = max-pxcor and pycor = min-pycor [set heading one-of [0 270] ]
    if pxcor = min-pxcor and pycor = max-pycor [set heading one-of [180 90] ]
    if pxcor = min-pxcor and pycor = min-pycor [ stop ]
    fd 1
    set #roll #roll - 1
  ]
end

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

...