Gatinho
1. Revisão de Conceitos
Matrizes vs. Plano Cartesiano
Como vocês vêm de disciplinas com forte base matemática, é muito comum confundir as coordenadas da matriz com o plano cartesiano $(x, y)$.
- No plano cartesiano, o $y$ cresce para cima e o $x$ para a direita. O ponto $(0,0)$ fica no canto inferior esquerdo.
- Na matriz (programação), nós usamos Linha ($i$) e Coluna ($j$). A linha 0 é a primeira de cima, e ela cresce para baixo. A coluna 0 é a primeira da esquerda, e cresce para a direita. O ponto $(0,0)$ fica no canto superior esquerdo. Portanto, quando o gato vai para o Norte (Cima), a linha diminui ($i - 1$). Quando vai para o Sul (Baixo), a linha aumenta ($i + 1$).
Máquina de Estados (Flags)
O jogo possui “estados”: o gato pode estar ativo jogando, morto ou ter vencido.
Na programação, podemos simular isso utilizando variáveis chamadas flags, como, por exemplo jogo_ativo = True.
A cada leitura, podemos conferir o valor dela para saber o que precisamos fazer em relação aos movimentos do jogo.
Quando o jogo terminar, é só mudar seu valor para False.
2. Dicas de Estruturação (Por onde começar?)
A complexidade deste laboratório não está em um algoritmo difícil, mas em organizar a sequência lógica das ações. Quebre o seu código nestas etapas:
Passo A: Preparação e Leitura
- Leia o mapa e armazene o mapa.
- Crie uma forma de contar as vidas.
- Onde o gato começa? Salve as coordenadas!
Passo B: A Lógica de Um Único Movimento
Esqueça que existem M movimentos por um momento. Pense no que acontece quando você recebe um comando de direção (‘N’, ‘S’, ‘L’, ‘O’).
- Calcule a posição futura (ex: se for ‘N’, a
nova_linhaélinha_gato - 1, e anova_colé igual acol_gato). - Teste a posição futura: Antes de atualizar a posição oficial do gato, verifique:
- Essa nova posição está fora dos limites da matriz?
- Tem um obstáculo (
#) nela? - Se sim para qualquer uma delas, o gato não se move. A posição futura é descartada.
Passo C: Avaliando a Casa Nova Se o movimento for válido, atualize a posição oficial do gato. Agora, olhe para o que tem nessa nova casa do mapa:
- É um
X? Ele perde vida? O jogo pode terminar? E se terminar, o que acontece agora? - É um
C? O que acontece? O jogo pode terminar? - É um
.ou o próprio lugar que ele já estava? Nada acontece.
3. Problemas e Erros Comuns
Se o seu código está travando ou falhando nos testes do SuSy, verifique esta lista:
O erro do break prematuro (Falta de leitura):
O enunciado diz: “Qualquer movimento após o gato vencer ou morrer deve ser ignorado.” Se o gato morrer no 5º movimento de um total de 30, e você usar um break para sair do loop que lê os input()s, os 25 comandos restantes ficarão presos no “buffer”. Quando o programa terminar, o sistema de testes tentará ler a saída e vai falhar, ou o próprio Python dará erro. Solução: Nunca pare de dar o input(). Use um if jogo_ativo: para processar a lógica, e um else: continue para apenas engolir os inputs extras sem fazer nada.
Sair das bordas do mapa (IndexError e Índices Negativos):
- Se o gato tentar ir para uma linha $i \ge N$ ou coluna $j \ge \text{tamanho da linha}$, ocorrerá um
IndexError.
Cuidado extra com o Python:
Se a linha for para $-1$ (passar do topo do mapa), o Python não dá erro, ele acessa o último elemento da lista (de trás para frente)! Você precisa colocar um if explícito proibindo linha < 0 e coluna < 0. Lembre-se: tentar sair do mapa faz o gato ficar parado na mesma posição.
Substituir o ‘G’ original:
O gato se move, mas você não precisa, necessariamente, atualizar a matriz do mapa apagando o ‘G’ e desenhando ele na nova posição. É muito mais fácil e menos suscetível a erros manter as coordenadas do gato em variáveis (linha_gato, col_gato) e apenas “olhar” para os caracteres na matriz para saber o que tem no mapa.
Ordem das verificações:
A ordem importa. Primeiro você calcula a coordenada futura. Depois verifica se ela está fora dos limites. Só depois verifica se é um #. Se você tentar ver se a casa é # antes de saber se ela está dentro dos limites da matriz, vai tomar um erro de índice.
Bom trabalho no desenvolvimento do código! Testem cada comando isoladamente antes de juntar tudo no programa final e podem me mandar as dúvidas por email!