Olá, Gabriel. Como vai?
A sua linha de raciocínio é excelente e faz todo o sentido! O que você propôs é exatamente o pensamento de um programador que busca otimização e legibilidade no código.
Na verdade, se você reparar bem na estrutura que o instrutor montou, ele fez quase a mesma coisa que você pensou: ele criou duas variáveis temporárias (proximox e proximoy) para calcular para onde o Pac-Man quer ir antes de movê-lo de verdade.
A diferença principal entre a sua abordagem e a do instrutor está em como o mapa é desenhado e na segurança do código. Vamos entender os motivos técnicos disso:
1. A barreira dinâmica vs. A barreira fixa
Você sugeriu verificar se a próxima casa é um caractere específico como _ ou |. Essa lógica funciona muito bem se o mapa só tiver esses dois tipos de parede.
Contudo, a abordagem do professor de verificar m.matriz[proximox][proximoy] != '.' é uma lógica invertida muito inteligente. Em vez de perguntar se o caminho é uma parede, ele pergunta: "A próxima casa é um espaço vazio (representado pelo ponto)?".
Se não for um ponto, o programa dá return e impede o movimento. Isso traz uma grande vantagem: se no futuro você quiser colocar outros obstáculos no mapa (como blocos de metal, arbustos ou portas trancadas), você não precisará encher o seu código de novos if para cada caractere diferente. Qualquer coisa que não seja o ponto . funcionará automaticamente como uma barreira.
2. O perigo de olhar para fora do mapa (Segmentation Fault)
Existe um detalhe crucial em C que o código do instrutor trata antes de checar a matriz. São estes dois if aqui:
if (proximox >= m.linhas){
return;
}
if (proximoy >= m.colunas){
return;
}
Se o Pac-Man estiver na última linha da tela e o jogador apertar para andar para baixo, o proximox vai passar do limite do mapa. Se tentarmos verificar m.matriz[proximox][proximoy] direto sem esses if prévios, o programa tentará acessar uma posição de memória que não existe. No C, isso causa o famoso e temido erro de Segmentation Fault (que trava e fecha o jogo na hora).
Por isso, precisamos primeiro garantir que as variáveis estão dentro dos limites do mapa para, só depois, olhar o caractere que está dentro da matriz.
A sua percepção de criar variáveis para prever a próxima jogada mostra que você está pegando o espírito da linguagem C e entendendo como o fluxo do jogo funciona. Continue propondo essas alternativas, pois testar novas abordagens é o que nos torna desenvolvedores melhores!
Espero que possa ter lhe ajudado!