Игра со змеями: Как увеличить длину тела змеи в зависимости от количества съеденной пищи? - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь воссоздать игру со змеями, где змея ест пищу, а ее тело увеличивается на 1 единицу. Однако я несколько раз пытался увеличить длину тела, но ничего не получалось так, как я хочу. Я попытался создать еще одну породу черепах, называемых «хвостами», и вывести ее за змею. Но так как я использую тиков, хвосты появляются очень быстро, и они не создают змеиного эффекта. Вместо этого хвосты собираются вместе на одном пятне позади змеи.

Я пытался раскрасить пятна, на которых была змея, но я не знал, как раскрасить только определенное количество пятен на основе съеденной пищи и постепенно добавлять на нее. Итак, теперь я попробовал использовать хвосты породы, но это не создает форму змеи.

Вот мой код:

breed [snakes snake]
breed [foods food]
breed [tails tail]
tails-own [age]

to game2-setup

  create-snakes 1 [
  set shape "snake"
  set color green
  ]

create-foods 10 [
setxy random-xcor random-ycor
if [pcolor] of patch-here != black [move-to one-of patches with [pcolor = 
black]]
set shape "plant"
set color red]
end

to game2-go

;moves the snake
ask snakes [
if ticks mod 350 = 0 [fd 1]
]

;to kill snake if it bumps into a wall/itself
ask snakes
[if [pcolor] of patch-ahead 1 != black [
user-message "Game over" ]
]

 ;if the snake and food is on the same patch the food is eaten
 ask patches [ if any? snakes-here and any? foods-here
 [ask foods-here [die]
 set points points + 1
 set energy energy + 1
 ]]

 ;grows the tail of the turtle based on the amount of food eaten
 ask tails
 [set age age + 1
 if age = 10 [die]
 ]

 ;regrows the food
 if count foods < 10
 [create-foods 1
 [setxy random-xcor random-ycor
 if [pcolor] of patch-here != black [move-to one-of patches with [pcolor = 
 black]]
 set shape "plant"
 set color red]
 ]
 tick
 end

Я ожидаю, что хвосты змей тянутся за змеиной головой и увеличат количество съеденной пищи.

1 Ответ

0 голосов
/ 07 января 2019

Один удобный подход к такой проблеме - использовать ссылки для соединения сегментов, образующих змею.

Код ниже должен помочь вам начать. Я не буду подробно рассказывать вам об этом, но общий подход заключается в том, чтобы соединить каждый «хвостовой» сегмент с сегментом вперед с помощью направленных ссылок.

При добавлении нового хвостового сегмента мы рекурсивно ищем сегмент, у которого еще нет ссылки "in", выводим оттуда новый хвостовой сегмент и подключаем его к родительскому элементу.

При движении каждый хвостовой сегмент обращен к сегменту, к которому он подключен, и перемещается в пределах одного его участка. Обратите внимание, как мы используем foreach sort tails вместо ask tails, чтобы убедиться, что сегменты перемещены в порядке их создания.

breed [snakes snake]
breed [tails tail]
breed [foods food]

to setup
  clear-all
  create-snakes 1 [ set color green ]
  ask n-of 10 patches [ sprout-foods 1 [ set shape "plant" ] ]
  reset-ticks
end

to go
  ask snakes [
    right random 45
    left random 45
    forward 1
    if any? foods-here [
      ask one-of foods-here [ die ]
      add-tail
    ]
  ]
  foreach sort tails [ t ->
    ask t [
      let segment-ahead one-of out-link-neighbors
      face segment-ahead
      forward max list 0 (distance segment-ahead - 1)
    ]
  ]
  tick
end

to add-tail
  ifelse any? in-link-neighbors [
    ask one-of in-link-neighbors [ add-tail ]
  ] [
    hatch-tails 1 [ create-link-to myself ]
  ]
end
...