Obrigado a Julio Marchi pelo espaço cedido na MSX All |
||||||||||||||||||||||||||||||||||||||||||
English Jogo de quebra cabeças que consiste em ordenar 8 peças em um tabuleiro de 3x3 quadrados, movendo sempre os números para o buraco. Esse jogo é uma variação do N-Puzzle, onde possui diversas versões como o 8-Puzzle, 15-Puzzle, 24-Puzzle etc. O jogo será programado em C, que também serve para o PC. Entretanto, poderá ser facilmente portado para Pascal. Tabuleiro do jogo O tabuleiro do jogo poderá ser feito em uma matriz de 3x3 ou um vetor de 9 posições. Serão apresentadas ambas as soluções.
No caso da matriz de 3x3, devemos armazenar as coordenadas X e Y do buraco em HX e HY, respectivamente. Já no caso do vetor, armazenamos apenas a posição do buraco em pos. A variável moves armazena a quantidade de movimentos gastos pelo jogador para solucionar o jogo. Uma vez que os vetores e matrizes no C variam de 0 a N-1, as coordenadas ou posição do buraco irão também variar de 0 a N-1. Entretanto, os rótulos dos números variam de 1 a 8. Dessa forma, deve-se tomar cuidado quanto a essa questão. Os valores iniciais do jogo não poderão apresentar qualquer seqüência aleatória, pois poderia resultar em um jogo sem solução possível. Dessa forma, a solução para obter uma seqüência inicial válida será a mesma adotada no jogo real: a partir da seqüência ordenada, faremos N movimentos no sentido de embaralhar o jogo. Embaralhando Primeiramente, uma função irá colocar os números de 1 a 8 de forma ordenada, reservando para o buraco o valor 0.
Em seguida, é necessário realizar N movimentos sucessivos para embaralhar os números. Entretanto, é necessário antes ver como analisamos as trocas possíveis para um determinado buraco. Movimentos possíveis A análise dos movimentos possíveis é feita sempre a partir da posição buraco. Para a matriz 3x3, a análise é feita em tempo de execução. A partir de um deslocamento proposto dx e dy da posição do buraco HX e HX, verificamos se:
Para o vetor de 9, armazenaremos em um vetor de strings todos os movimentos possíveis para cada posição do buraco. A troca é feita diretamente entre a posição do buraco e a possível. A ilustração abaixo apresenta os movimentos possíveis (em verde) para cada posição do buraco (vermelho). Assim temos:
Como o C não permite saber o tamanho da string, armazenamos a quantidade de movimentos no vetor total_moves. Os códigos para a troca de posições são:
No array de 9, o movimento possível é obtido através da conversão do código ASCII do caractere da posição para o valor numérico correspondente, na função get_pm_value. De forma a se adequar aos índices dos vetores e matrizes do C, a mesma função também converte o valor da posição para o sistema que varia de 0 até N-1. Exemplo desse processo em Basic: Q = "2" P = ASC(Q) - 48 PRINT P 2 P = P-1 PRINT P 1Para ambos os casos, o parâmetro de entrada é a nova posição do buraco. Após realizar a troca, a posição nova do buraco é atualizada. Código para embaralhar Uma vez visto como se troca uma posição, podemos embaralhar.
No caso da matriz de 3x3 ele sorteia os valores dx e dy e somente segue adiante se o movimento for válido. Senão, tenta novos valores até conseguir. A solução do vetor de 9 é mais inteligente, pois permite escolher diretamente uma dos movimentos válidos para o buraco aramazenados no vetor possible_moves. Inicialização e impressão do jogo Os códigos a seguir completam a primeira etapa, onde uma função chama a inicialização do tabuleiro e outra o imprime.
Esse jogo é para apenas um jogador. Assim, o programa deverá ler do teclado o número da peça que se deseja mover e realizar a troca. Para isso:
Convertendo o número da peça em posição no tabuleiro O dado fornecido pelo jogador é o número da peça e não uma coordenada. Assim, o programa tem que localizá-la no tabuleiro.
Realizando a troca Após localizar a peça requerida, é só fazer a troca.
Caso o movimento seja inválido, a função notifica retornando 0. Verificando o fim de jogo A rotina de verificação se o jogo foi solucionado é bem simples, pois basta constatar que os números estão em ordem no tabuleiro.
Obs: quando a variável num for 9, ele deverá retornar a 0 para comparação com o buraco. Controle do jogo A seguinte rotina controla o jogo para ambos os casos.
Referências: [1]- Inteligência Artificial em Basic, M. James, Editora Campus, 1985. |
||||||||||||||||||||||||||||||||||||||||||