Departamento de Ciência da Computação - IME - USP

Introdução à Computação

Primeiro Semestre de 2017

Primeiro Exercício Programa

Entrega: até 16 de abril de 2017 pelo PACA

JOGO DA COBRINHA

 

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.

1. O jogo (para este EP)

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).

2. O que o seu programa deve fazer

No seu programa, a cobra deverá ser representada por três valores inteiros:

  1. Posição no eixo x da cabeça da cobra no tabuleiro,
  2. Posição no eixo y da cabeça da cobra no tabuleiro,
  3. 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árioSímbolo
Parede#
Cabeça da cobraC
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:

##########
#........#
#..**C...#
#.**.....#
#........#
##########
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.

A cobra x = 9, y = 5, d = 24223222442 de tamanho 12 seria exibida em um tabuleiro 8x16 cercado por paredes como:

##################
#................#
#................#
#................#
#..**.****.......#
#...***..*.......#
#........*C......#
#................#
#................#
##################

2.1 Entradas e saídas do programa

Inicialmente, o programa deve solicitar ao usuário:

  1. número de linhas e número de colunas do tabuleiro,
  2. a posição inicial (x, y) da cabeça da cobra,
  3. 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.

2.2 Funções obrigatórias

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.

3. Dicas

4. Exemplos

Considere os seguintes exemplos de saída do seu programa. Os números em vermelho foram digitados pelo jogador.

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!

 

5. Informações sobre entrega do EP

  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.