Jogo da Cobra

Escreva uma função capaz de simular uma cobra rastejando.

Texto alternativo

Entrada

  • field — Uma matriz retangular, uma lista de listas, composta por números correspondentes a: 0 – célula vazia, 1 – comida, 2 – a cabeça da cobra.
  • moves — Uma lista de tuplas.

Cada tupla representa os seguintes movimentos:

  • (1, 0) — Para baixo
  • (0, 1) — Para a direita
  • (-1, 0) — Para cima
  • (0, -1) — Para a esquerda

Saída

A imagem final do campo, que consiste na cobra como uma coleção de 2 em determinadas células e na comida restante 1 que não foi comida durante os movimentos da cobra.

Regras

A cabeça da cobra se move na direção especificada pelo move fornecido. Se a cabeça se mover para uma célula vazia, todo o corpo se moverá de maneira ordenada (o comprimento da cobra não muda). Se a cabeça se mover para uma célula com comida, o corpo não se moverá, e a nova cabeça ocupará a posição da comida (o comprimento da cobra aumentará em um). Se a cabeça bater em uma parede, ela a atravessa e a cabeça reaparece pela parede oposta (na mesma linha se o movimento for horizontal, na mesma coluna se o movimento for vertical).

Se a cabeça tiver que se mover para o próprio corpo, excluindo a ponta da cauda, a cobra morderá a si mesma e sofrerá um ferimento mortal. Nesse caso, interrompa a execução da função e retorne a string "Game Over".

A cabeça não pode alcançar a cauda. Considera-se, neste jogo, que, quando a cabeça se move, a cauda também se move e desocupa a célula.

A célula de comida só pode ser comida uma vez! Se a cobra rastejar por aí e passar novamente pela célula, essa célula terá se tornado uma célula vazia.

Exemplos

f = [
  [0, 0, 0, 0, 0, 1],
  [0, 2, 0, 0, 1, 0],
  [0, 0, 0, 1, 0, 0],
  [0, 1, 0, 0, 0, 0]
]

m = [
  (0, 1), (0, 1), (0, 1), (-1, 0), (0, 1), (0, 1), (0, 1), (1, 0),
  (1, 0), (1, 0), (0, 1), (0, 1), (-1, 0), (0, 1), (-1, 0)
]

snake(f, m) ➞ [
  [0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 2, 0],
  [0, 0, 0, 2, 2, 0],
  [0, 0, 2, 2, 0, 0]
]

Observações

  • No início do jogo, o corpo da cobra consiste apenas na cabeça (o comprimento total é um).
  • Depois que a cabeça executar a lista de movimentos fornecida, a cobra feliz para e descansa. A saída da função deve exibir a posição final do corpo da cobra no campo.