Este post foi criado a partir de uma pergunta do internauta Ulissss, que um dia procurava pelo google como programar um jogo da velha em Fortran.

Resolvi dar destaque para a pergunta dele por dois motivos. Primeiro que programação de jogos tende a ser um dos principais temas deste blog. O outro motivo é para defender a minha preferência de não me tornar um especialista em nenhuma linguagem específica mas entender os estilos de linguagens e lógica de programação e utilizar uma linguagem apenas como um instrumento. Tenho em minha maleta uma gama de instrumentos como Java, PHP, ASP, .NET, Visual Basic, C#, C, C++… E posso escolher entre elas a melhor para resolver um determinado problema ou, até mesmo, utiliza-las em conjunto.

Fato é que eu nunca, em toda minha vida, programei em Fortran. Mas, conhecendo algumas outras linguagens imperativas, programar um jogo da velha mesmo em Fortran passa a ser trivial.

Então vou mostrar a estrutura de um jogo da velha e depois algumas dicas de como ‘traduzi-lo’ para Fortran.

Grande parte dos jogos programados numa linguagem imperativa, e um jogo da velha em Fortran não é uma excessão, tem uma estrutura principal bem parecida. Eles funcionam dentro de um loop infinito executando algumas rotinas básicas:

Código:
Enquanto(verdade) Faça
   DesenharJogo()
   ObterMovimentoJogador()
   ObterMovimentoInimgo()
   ProcessarMovimentos()
   Se ExisteVencedor() Então
      DesenharFinalJogo()
      Sair()
   Fim Se
Fim Enquanto
Esta estrutura acima costuma apresentar umas poucas variações dependendo do estilo de jogo, se é contra o computador ou um humano, se é necessário um feedback entre o movimento do jogador e do inimigo, etc.

Se o jogo da velha fosse contra o computador poderíamos utilizar a estrutura acima tal qual. Mas como imagino que deve ser um jogo para duas pessoas, farei uma pequena modificação:

Código:
Turno=1
Enquanto(verdade) Faça
DesenharJogo()
   ObterMovimentoJogador(Turno)
   ProcessarMovimentos()
   Se ExisteVencedor() Então
      DesenharFinalJogo()
      Sair()
   Fim Se
   TrocarTurno()
Fim Enquanto
Esta então será a rotina básica do nosso jogo, seja em C, Lua ou Fortran. O próximo passo será modelarmos nosso mundo, ou melhor o nosso tabuleiro. Quem tem alguma experiência em programação invariavelmente acha o jogo da velha muito parecido com uma matriz. Então vamos pelo mais simples, usaremos uma matriz para modelarmos o nosso tabuleiro. Veja se não parece:

tictactoe.jpg =
1 0 1
2 1 2
2 0 1

Com isso evoluiremos um pouco com o nosso roteiro:

Código:
Tabuleiro[3][3]
Turno=1
Enquanto(verdade) Faça
   DesenharJogo(Tabuleiro)
   casa=ObterMovimentoJogador(Turno)
   linha=ObterLinhadeCasa(casa)
   coluna=ObterColunadeCasa(casa)
   Tabuleiro[linha][coluna] = Turno
   Se ExisteVencedor(Tabuleiro) Então
      DesenharFinalJogo(Tabuleiro)
      Sair()
   Fim Se
   Turno = TrocarTurno(Turno)
Fim Enquanto
Perceba que o antigo ProcessarMovimentos() deu lugar à outras 4 linhas. Fiz isso para mostrar bem esta parte mas pode-se manter a função ProcessarMovimentos() e realizar estas operações dentro da função.

A função ObterMovimentoJogador deve perguntar para o jogador indicado por ‘Turno’ em que casa ele gostaria de jogar (1-9). Sugiro aqui que seja apresentado para o usuário final casas numeradas de 1-9 para ele escolher uma delas. Acho mais simples do que ficar brincando de batalha naval pedindo linha e coluna.

Mas depois precisamos transformar este único numero da casa em linha e coluna da nossa matriz. Existem várias formas de fazer isso. Eu sugiro a seguinte:
Em ObterLinhadeCasa:

Código:
Linha = inteiro((casa-1)/3)+1
Em ObterColunadeCasa:
Código:
Coluna = resto(casa-1/3)+1
Nota: A existência deste +1 no final das fórmulas depende da linguagem de programação. Depende se a linguagem trata sua matriz com indices de 0 à 2 ou de 1 à 3. Em C, por exemplo os indices iriam de 0 à 2 enquanto em Fortran de 1 à 3. Na realidade em Fortran você pode especificar o indice de uma matriz ou vetor com o comando dimension.

Bem a rotina principal do programa é esta mesmo. Agora para termos um jogo da velha real, em Fortran ou C ainda temos que criar as rotinas internas e traduzir este pseudocódigo para a linguagem desejada.

Por exemplo em Fortran:
Pseudocódigo Fortran
Código:
Tabuleiro[3][3] 	Tabuleiro(3,3)
Enquanto(Verdade) Faça
(…)
Fim Enquanto 	do while(1)
(…)
end do
Se 	if
E por aí vai.

A rotina TrocarTurno pode ser algo do tipo
Se turno = 1 então retorna 2
Senão retorna 1

Como é um trabalho de final de curso, não vou dar tudo tão mastigado. Paro então por aqui. Fica ainda o trabalho de realmente passar isso para Fortran e estrever as demais rotinas.

Se a fluência na linguagem não for grande, sugiro tentar resolver a lógica em pseudocódigo como fiz aqui e depois dar uma lida num tutorial qualquer buscando os recursos da linguagem para resolver aquele seu pseudo-código.

Como última ajuda encontrei este tutorial aqui que, embora nunca tenha programado uma linha em Fortran, me pareceu bem legal.

Agora palavras minhas..lol

Esse tuto eu vi e achei bacana..pq muitas vezes o cara vai fazer algo e pode ter noção da programação..mas nao tem projeto..nao sabe nem por onde começar...

ai achei bacana colocar aqui para vocês!!

Fonte: http://blog.renatolouro.com/?p=100

Esse tuto foi todo feito por Renato Louro!!