Departamento de Ciência da
Computação - IME - USP
Serpente (Snake, também conhecido como "Jogo da Cobrinha") é um jogo criado em 1976 para fliperamas, do qual foram feitas várias imitações em vídeo games e computadores. No fim dos anos 90, o jogo ficou muito popular devido ao fato de vir instalado em celulares da Nokia.
O jogador controla uma longa e fina criatura que se arrasta pela tela, coletando comida (ou algum outro item), não podendo colidir com seu próprio corpo ou com as paredes que cercam a área de jogo. Cada vez que a serpente come um pedaço de comida, seu rabo cresce, aumentando a dificuldade do jogo. O usuário controla a direção da cabeça da serpente (para cima, para baixo, esquerda e direita) e seu corpo segue. Uma versão online do jogo pode ser encontrada aqui.
Neste EP, a ideia é fazer um programa em Python que permita realizar apenas o movimento da cobra em um tabuleiro (e não o jogo completo). Vamos considerar que a cobra tem um comprimento fixo fornecido pelo usuário, de modo que seu corpo ocupará sempre a mesma quantidade de casas adjacentes no tabuleiro (sua cauda estará portanto sempre a uma distância fixa da cabeça).
No seu programa, a cobra deverá ser representada por três valores inteiros:
- Posição no eixo x da cabeça da cobra no tabuleiro,
- Posição no eixo y da cabeça da cobra no tabuleiro,
- Variável
d
contendo um número inteiro, sendo que cada dígito corresponde a um código de deslocamento assim definido: esquerda = 1, direita = 2, cima = 3, baixo = 4. Do dígito mais significativo (mais à esquerda) ao menos significativo (mais à direita), os códigos indicam a sequência de deslocamentos que levam a posição da cauda da cobra até a sua cabeça.
Para desenhar o tabuleiro e a cobra, o seu programa deve adotar a seguinte convenção:
Elemento do cenário | Símbolo |
Parede | # |
Cabeça da cobra | C |
Corpo da cobra | * |
Posição livre | . |
Exemplos
A cobra x = 4, y = 1, d = 2322 de tamanho 5 seria exibida em um tabuleiro 4x8 cercado por paredes como:
Importante: Observe que, no tabuleiro, a posição do canto superior esquerdo tem coordenadas (0,0), ou seja, o eixo y cresce de cima para baixo.########## #........# #..**C...# #.**.....# #........# ##########
A cobra x = 9, y = 5, d = 24223222442 de tamanho 12 seria exibida em um tabuleiro 8x16 cercado por paredes como:
################## #................# #................# #................# #..**.****.......# #...***..*.......# #........*C......# #................# #................# ##################
Inicialmente, o programa deve solicitar ao usuário:
- número de linhas e número de colunas do tabuleiro,
- a posição inicial (x, y) da cabeça da cobra,
- o tamanho da cobra.
O programa deve então exibir o tabuleiro com a cobra inicialmente na horizontal, com a cabeça na posição dada e com a cauda à esquerda da cabeça.
Depois, o programa deve pedir que o jogador informe o número do próximo movimento a ser realizado, que pode ser um dos seguintes valores: 1 (esquerda), 2 (direita), 3 (cima), 4 (baixo), 5 (sair do programa). Se o jogador escolher o movimento 5, o programa deve ser encerrado. Caso contrário, o programa deve processar o movimento solicitado. Caso o jogador informe um movimento que cause colisão, o programa deve imprimir uma mensagem de erro apropriada (ver exemplos na Seção 4 deste enunciado). Para cada movimento processado, o programa deve imprimir novamente o tabuleiro refletindo a última posição válida da cobra e um novo movimento deve ser solicitado ao jogador na sequência.
Importante: Todas as saídas impressas pelo programa devem ser exatamente iguais às mostradas nos exemplos da Seção 4.Um dos objetivos desse exercício é aprender a usar funções em Python. Para isso, você deve OBRIGATORIAMENTE implementar e utilizar as funções com os seguintes protótipos:
A descrição detalhada de cada uma dessas funções você encontra aqui, no esqueleto do EP1. Configure o seu navegador para trabalhar com caracteres codificados em utf-8. Você deve utilizar esse esqueleto para começar a resolver este exercício, sem modificar os protótipos e comentários. Você deve editar o cabeçalho com suas informações, incluir os seus próprios comentários se desejar e substituir os prints com "vixe!" com as suas soluções.
print
sem incluir uma quebra de linha no final, use o parâmetro end
para substituir a quebra de linha (caracter "\n") por qualquer outra string à sua escolha. Por exemplo, o código Python abaixo
print("Olá", end = ", ")
print("mundo!")
print("Tudo bem?")
gera a seguinte saída:
Olá, mundo! Tudo bem?
devolve três valores. Esta função pode ser chamada da seguinte formadef func(tempo): """(int) -> (int, int, int) Devolve o tempo em horas, minutos e segundos. ENTRADA - tempo: tempo total em segundos. """ h = tempo // 3600 m = (tempo % 3600) // 60 s = (tempo % 3600) % 60 return h, m, s
h,m,s = func(tempo) print("horas: %d, minutos: %d, segundos: %d"%(h,m,s))
Exemplo 1:
================================================= Bem-vindo ao Jogo da Cobrinha! ================================================= Número de linhas do tabuleiro : 3 Número de colunas do tabuleiro: 3 Posição x inicial da cobrinha : 2 Posição y inicial da cobrinha : 2 Tamanho da cobrinha : 4 A COBRINHA NÃO PODE FICAR NA POSIÇÃO INICIAL INDICADA Tchau!
Exemplo 2:
================================================= Bem-vindo ao Jogo da Cobrinha! ================================================= Número de linhas do tabuleiro : 1 Número de colunas do tabuleiro: 3 Posição x inicial da cobrinha : 2 Posição y inicial da cobrinha : 0 Tamanho da cobrinha : 3 ##### #**C# ##### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 2 COLISÃO COM A PAREDE ##### #**C# ##### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 1 COLISÃO COM SI MESMA ##### #**C# ##### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 5 Tchau!
Exemplo 3:
================================================= Bem-vindo ao Jogo da Cobrinha! ================================================= Número de linhas do tabuleiro : 5 Número de colunas do tabuleiro: 5 Posição x inicial da cobrinha : 2 Posição y inicial da cobrinha : 2 Tamanho da cobrinha : 3 ####### #.....# #.....# #**C..# #.....# #.....# ####### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 3 ####### #.....# #..C..# #.**..# #.....# #.....# ####### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 2 ####### #.....# #..*C.# #..*..# #.....# #.....# ####### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 3 ####### #...C.# #..**.# #.....# #.....# #.....# ####### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 2 ####### #...*C# #...*.# #.....# #.....# #.....# ####### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 4 ####### #...**# #....C# #.....# #.....# #.....# ####### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 4 ####### #....*# #....*# #....C# #.....# #.....# ####### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 2 COLISÃO COM A PAREDE ####### #....*# #....*# #....C# #.....# #.....# ####### 1 - esquerda | 2 - direita | 3 - cima | 4 - baixo | 5 - sair do jogo Digite o número do seu próximo movimento: 5 Tchau!
Todo exercício-programa deve seguir as observações contidas aqui, onde estão descritas as diretrizes para forma de entrega do exercício, aspectos importantes na avaliação etc.