Jump to content
silentvictor

While not eof (ard) loop infinito

Recommended Posts

silentvictor

Alguem pode me ajudar com um bug que está acontecendo com meu código?

Chequei tudo e ele após ler um arquivo continua lendo a ultima linha infinitamente =/

AssignFile(arquivo,ParamStr(1));
    Reset(arquivo);
linha:=1;  // Recebe o arquivo TXT.
while NOT EOF(arquivo) do

begin
 readln(arquivo, jg);
 Writeln(jg);
 if linha =1 then// Para não ter problema de B ou C entrar como jogada.
 Begin
  turno:=0;
  while turno = 0 do
  Begin
  IniciaTabuleiro;//Inicia o tabuleiro no programa principal.

   //Recebe o jogodor que vai começar a jogar.


   If (jg = 'c') or (jg = 'C') then
   begin
   turno:=1;//Define turno do jogador.
   end
   else
    If (jg = 'b') or (jg = 'B') then
    begin
    turno:=2;//Define turno do jogador.
    end
   else
    Writeln('Jogador selecionado invalido.');
  end;
  linha:=2;// Define a linha como 2.
 end

 else// Caso seja linha > 1
 Begin

// TURNO ZERO INDICA FIM DE JOGO. (Apenas quando todas as peças de um jogador forem comidas.)
// inicio do while para continuar as jogadas.
 If turno = 1 then
 begin
  {Jogadas do jogador de cima}
         Traduz;//Pega valor da jogada
  Jogadas;
  Escreve_matriz;// ESCREVE MATRIZ APÓS JOGADA.
  FimJogo;
 end;
 // FIM DO JOGADOR DE CIMA
  if turno = 2 then
  begin
  {Jogadas do jogador de BAIXO}
  Traduz; //Pega valor da jogada
  Jogadas;//Efetua a jogada
  Escreve_matriz; // ESCREVE MATRIZ APÓS JOGADA.
  FimJogo;

  end;

 linha:=linha+1;
 end;//fim do else do if linha

  end;
CloseFile(arquivo);// Fecha arquivo após ler todo o código.

Edited by nunopicado
Adicionada linguagem GeShi

Share this post


Link to post
Share on other sites
nunopicado

Muito possivelmente o erro está no ficheiro que estás a abrir, e não directamente no código.

O EOF funciona em ficheiros de texto normais. No entanto, alguns ficheiros de texto têm caracteres especiais, tipo o #0, que enganam o EOF e fazem com que ele não se aperceba que o ficheiro chegou ao fim.

Ele está a falhar com qualquer ficheiro, ou apenas com alguns em particular?

Se for o caso, experimenta abrir o ficheiro no NotePad++, activando as opções "Mostrar Simbolo --> Mostrar todos os caracteres".

És capaz de encontrar alguma coisa a mais.

Se não puderes resolver do lado do ficheiro, e tiver mesmo de ser do lado do código, então sugiro que descartes o EOF, e leias o ficheiro por outro método.

Se o ficheiro em questão não for confidencial, experimenta colocar um link para um, que se tenta dar uma ajuda mais precisa! ;)

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Só copiar aqui não ajuda... Se tiver os tais caracteres, eles não irão aparecer.

Mete o link para um ficheiro (por exemplo, partilha com a dropbox, ou outro serviço do género)

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Esse ficheiro foi gerado em unix/linux, certo?

As quebras de linha são o caracter #10, enquanto que o "normal" é ser #13#10.

Possivelmente é isso que baralha o EOF.

Podes por exemplo ler o arquivo caracter a caracter (com o read) e cortar a linha de cada vez que encontra um #10.

Outro método para abrires ficheiros de texto: TStringList

uses
  Classes;  // Tens de por esta unit na secção uses.
var
  arquivo:TStringList;  // Defines assim a variável do arquivo
  Linha:integer;  // Vai ser necessária para o ciclo
begin
  arquivo:=TStringList.Create;  // Tens de criar a instância, pois a TStringList é uma classe, e não um tipo de dados comum

  arquivo.LoadFromFile(ParamStr(1));  // Isto irá carregar todo o arquivo em memória

  For Linha:=0 to arquivo.Count-1 do  // percorre todo o arquivo
     begin 
          Writeln(arquivo[Linha]); // dá-te a linha actual

          .
          .
          .


     end;

  arquivo.Free;  // Quanto deixares de precisar do arquivo, não te esqueças de libertar a memória, ou poderás ter problemas 
end.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
silentvictor

Nuno, você pode me mostrar como que faço para pular uma linha sempre que achar "#10" ?

O código em questão é para um trabalho, a correção será feita em Linux, então se o "#10" ocorrer em todo Linux/Unix então não terá probema fazer o que você disse...

Share this post


Link to post
Share on other sites
thoga31

Antes de recomendar as TStringList acho que é importante compreender a leitura de ficheiros caracter a caracter, pois há ficheiros em que isso é mesmo obrigatório e dá sempre jeito saber.

Uma pequena dica para o @silentvictor: em vez de...

 If (jg = 'c') or (jg = 'C') then

... deve-se usar isto...

if upcase(jg) = 'C' then

Quanto à leitura caracter a caracter, faz-se o Read de um Char e quando o Char for #10 sabe-se que se mudou de linha. Exemplo:

var s : string;
   c : char;
// ...
s := '';
while ch <> #10 do begin
   read(ch);
   s := s + ch;
end;
// operações com a linha "s"


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Thoga, e como verifico o fim do ficheiro?

Há muito que não uso esse método, mas salvo erro, lendo caracter a caracter, o EOF funciona bem.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
silentvictor

O problema é que não entendo bem disso e a entrega do trabalho é pra hoje :c

O programa tem que ler o TXT jogada por jogada (AB--XY)

e executar, se tiver erro ele indica e se não tiver ele executa a jogada.

O problema é que quando chega nessa ultima ele fica repetindo infinitamente como se n fosse o fim.

Só queria uma forma de fazer parar na ultima linha =/

Edited by silentvictor

Share this post


Link to post
Share on other sites
Kline777

DE que tipo é o arquivo mesmo?

Depois destas dicas como tens o codigo agora?

Share this post


Link to post
Share on other sites
thoga31

DE que tipo é o arquivo mesmo?

linha:=1;  // Recebe o arquivo TXT.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
pwseo

silentvictor,

Não existe motivo para que isso funcione mal com readln e eof... Tens a certeza que o erro está aí? não será de outras funções que tens por aí? algum ciclo que não estejamos a ver...

nunopicado,

A função eof à partida não se enganará com #0, uma vez que o seu resultado é determinado pela posição do file pointer e não por caracteres lidos pelo ficheiro. Além disso, a eof é polimórfica: há uma versão para ficheiros de texto e outra para ficheiros binários.

Share this post


Link to post
Share on other sites
silentvictor

Obrigado a todos :)

Consegui resolver o problema executando 2x o comando "CloseFile(arquivo);"

Ficou assim.

if ParamCount = 1 then// Verifica se teve parametro dado. Se tiver ele executa.
Begin

AssignFile(arquivo,ParamStr(1));
    Reset(arquivo);
linha:=1;  // Recebe o arquivo TXT.
while not EOF(arquivo) do
begin
 readln(arquivo, jg);
 Writeln(jg);
 if linha =1 then// Para não ter problema de B ou C entrar como jogada.
 Begin
  turno:=0;
  while turno = 0 do
  Begin
  IniciaTabuleiro;//Inicia o tabuleiro no programa principal.

   //Recebe o jogodor que vai começar a jogar.


   If (jg = 'c') or (jg = 'C') then
   begin
    turno:=1;//Define turno do jogador.
   end
   else
   If (jg = 'b') or (jg = 'B') then
   begin
    turno:=2;//Define turno do jogador.
   end
   else
    Writeln('Jogador selecionado invalido.');
  end;
  linha:=2;// Define a linha como 2.
 end

else// Caso seja linha > 1
Begin

// TURNO ZERO INDICA FIM DE JOGO. (Apenas quando todas as peças de um jogador forem comidas.)
// inicio do while para continuar as jogadas.
If turno = 1 then
begin
 {Jogadas do jogador de cima}
               Traduz;//Pega valor da jogada
        Jogadas;
end;
// FIM DO JOGADOR DE CIMA
 if turno = 2 then
 begin
 {Jogadas do jogador de BAIXO}
 Traduz; //Pega valor da jogada
 Jogadas;//Efetua a jogada


 end;

linha:=linha+1;
end;//fim do else do if linha

 end;
CloseFile(arquivo);// Fecha arquivo após ler todo o código.
Escreve_matriz;
FimJogo;
CloseFile(arquivo);
end

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
nunopicado

nunopicado,

A função eof à partida não se enganará com #0, uma vez que o seu resultado é determinado pela posição do file pointer e não por caracteres lidos pelo ficheiro. Além disso, a eof é polimórfica: há uma versão para ficheiros de texto e outra para ficheiros binários.

Razão, não há... Mas já me deu! :)

Não me lembro bem os pormenores, mas era um ficheiro convertido de outra aplicação em que havias NUL's quase a cada linha, e o EOF perdia-se onde estava aquilo.

Na altura resolvi fazendo a leitura caracter a caracter. Nem o TStringList pegou no gajo.

Isto em Delphi XE

Consegui resolver o problema executando 2x o comando "CloseFile(arquivo);"

Isso cheira-me mais a remendo do que a solução... Se só abres uma vez, só fechas uma vez. É assim que deve ser! Ou estás a abrir mais do que uma vez?

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Duas vezes CloseFile? Isso não faz sentido...

Há aí qualquer coisa no teu código que anda a dar a volta a esse trecho do código, e não podemos comentar com grandes certezas sem saber o resto.

Nunca na vida precisei de fazer dois Close's. Abre uma vez, fecha uma vez, and that's that. Os ficheiros não são teimosos para precisarem de duas ordens para o mesmo.

Isso cheira-me mais a remendo do que a solução... Se só abres uma vez, só fechas uma vez. É assim que deve ser! Ou estás a abrir mais do que uma vez?

Abrir mais do que uma vez pode dar razia ao programa. Não tenho a certeza, mas acho que pode mesmo lançar uma excepção.


Knowledge is free!

Share this post


Link to post
Share on other sites
silentvictor

A unica vez que abri foi no código acima...

Vou acabar perdendo pontos por ter feito isso, mas é melhor do que o loop que estava =/

Alem de que tenho outras coisas para melhorar no programa :(

Código todo.

Program Func_jogada ;
{$mode objfpc}
//uses Crt,sysutils;
var
jg:string[6];// String que recebe as jogadas.
lin,new_lin,new_col,col:integer;// Linha, coluna, nova linha, nova coluna da matriz ~Jogadas
Matriz: ARRAY[0..12,0..12] of integer;// Tabuleiro
jogador:string;//Variavel que recebe o valor de B ou C para selecionar o jogador.
turno:integer; {Turno 0 FIM DE JOGO. Turno 1 Jogador CIMA. Turno 2 Jogador BAIXO.}
 i,j,aux,c,c1:integer;// Utilizadas para laço FOR quando for exibir a matriz.
comerpc:boolean;//Variavel utilizada para verificar se existe peça para comer.
TurnoAtual,AtualJogador,DamaAtualJogador:integer;//Variaveis necessárias para melhorar o procedimento Jogadas.
inimigo,DamaInimigo,TurnoInimigo:integer;//Variaveis necessárias para melhorar o procedimento Jogadas.
SubtracaoLinha:integer;//Valor necessário para os calculos quando for comer uma peça(Procedimento Jogadas)
contador_cima,contador_baixo:integer;
arquivo:TextFile;
linha:integer;// Verifica que linha está no programa.
val1,val2,pcinimiga:integer;
procedure turnos;// Procedimento que define as caracteristicas de cada turno.
Begin
If turno = 1 then
Begin
TurnoAtual:=1;
TurnoInimigo:=2;
AtualJogador:= 1; //Caracteristicas do Turno 1.
DamaAtualJogador:=2;
inimigo:=-1;
DamaInimigo:=-2;
SubtracaoLinha:=1;
End
Else
If turno = 2 then
Begin
TurnoAtual:=2;
TurnoInimigo:=1;
AtualJogador:=-1; //Caracteristicas do Turno 2.
DamaAtualJogador:=-2;
inimigo:=1;
DamaInimigo:=2;
SubtracaoLinha:=-1;
End;
end;
procedure ObrigaComer;// Faz uma varredura na Matriz e verifica se existe uma peça que pode comer outra.
Begin
turnos;
comerpc:=false;
for i:= 0 to 9 do//Linha
Begin
For j:=0 to 9 do//Coluna
Begin
If (Matriz[i,j] = AtualJogador) or (Matriz[i,j] = DamaAtualJogador) then
Begin
if ((i+2<10) and (j+2<10))then
Begin


 if ((Matriz[i+1,j+1] = inimigo) and (Matriz[i+2,j+2] = 0) and ((i+2<10) and (j+2<10))) then
 Begin
 comerpc:=true;//Cima ~ Direita
 End
 else
 if ((Matriz[i-1,j+1] = inimigo) and (Matriz[i-2,j+2] = 0) and ((i-2>=0) and (j+2<10))) then
 Begin
 comerpc:=true;//baixo ~ Direita
 End
 else
 if ((Matriz[i-1,j-1] = inimigo) and (Matriz[i-2,j-2] = 0) and ((i-2>=0) and (j-2>=0))) then
 Begin
 comerpc:=true;//baixo ~ esquerda
 End
 else
 if ((Matriz[i+1,j-1] = inimigo) and (Matriz[i+2,j-2] = 0) and ((i+2<10) and (j-2>=0))) then
 Begin
 comerpc:=true;//Cima ~ esquerda
 End;

End;// End do if ((i+2<10) and (j+2<10))then.


End;// ENdo do Matriz[i,j] = AtualJogador... bla bla bla...
End;
End;
End;
procedure FimJogo;//Verifica se existe peça dos jogadores, caso não existam ele termina o programa.
Begin
contador_cima:=0;
contador_baixo:=0;
for i:=0 to 9 do // Linha da matriz
for j:=0 to 9 do // Linha da coluna
Begin
if (Matriz[i,j]=1) or (Matriz[i,j]=2) then
contador_cima:=contador_cima+1;
if (Matriz[i,j]=-1) or (Matriz[i,j]=-2) then
contador_baixo:=contador_baixo+1;
End;
if contador_cima = 0 then// Se não tiver peça do Jogador de cima
begin
turno:=0;
writeln('Parabens Jogador 2! Você venceu a partida.');
writeln('Peças comidas:');
writeln('Jogador 1: ',15-contador_baixo);
writeln('Jogador 2: ',15-contador_cima);
end;
if contador_baixo = 0 then// Se não tiver peça do Jogador de baixo
begin
turno:=0;
writeln('Parabens Jogador 1! Você venceu a partida.');
writeln('Peças comidas:');
writeln('Jogador 1: ',15-contador_baixo);
writeln('Jogador 2: ',15-contador_cima);
end;
End;
procedure Jogadas;// Realiza as jogadas com base nos resultados de procedimentos anteriores.
Begin
ObrigaComer;// Verifica se tem peça a ser comida.
//clrscr;// Limpa a tela.
turnos;// Envia os turnos e caracteristicas.

// Começa calculo das jogadas.
if (Matriz[lin,col] = AtualJogador) and (Matriz[new_lin,new_col] = 0) then
//Verifica se tem uma peça simples do jogador atual e peça em branco.
begin
 //Valida a jogada.

if comerpc then
Begin

 If ((new_col - col= -2) and (new_lin-lin=2)) then// Movimento de comer.
 Begin
 If (Matriz[lin+1,col-1] = inimigo) or (Matriz[lin+1,col-1] = DamaInimigo) then
 begin
 Matriz[lin+1,col-1]:= 0;
 Matriz[lin,col]:= 0;
 Matriz[new_lin,new_col]:= AtualJogador;
 turno := TurnoAtual; // Como houve peça comida fica no turno atual.

 end
 else
 Begin
 writeln('Jogada invalida1.');
 if ParamCount = 1 then
 writeln('Erro na linha: ',linha);
 end;
 End
 else
 If ((new_col - col=2) and (new_lin-lin=2)) then// Movimento de comer.
 Begin
 if (Matriz[lin+1,col+1] = inimigo) or (Matriz[lin+1,col+1] = DamaInimigo) then
 begin
 Matriz[lin+1,col+1]:= 0;
 Matriz[lin,col]:= 0;
 Matriz[new_lin,new_col]:= AtualJogador;
 turno := TurnoAtual; // Como houve peça comida fica no turno atual.


 end
 else
 Begin
 writeln('Jogada invalida2.');
 if ParamCount = 1 then
 writeln('Erro na linha: ',linha);
 end;

 End
 else
 If ((new_col - col= -2) and (new_lin-lin=-2)) then// Movimento de comer.
 Begin
 If (Matriz[lin-1,col-1] = inimigo) or (Matriz[lin-1,col-1] = DamaInimigo) then
 begin
 Matriz[lin-1,col-1]:= 0;
 Matriz[lin,col]:= 0;
 Matriz[new_lin,new_col]:= AtualJogador;
 turno := TurnoAtual;// Como houve peça comida fica no turno atual.

 end
 else
 Begin
 writeln('Jogada invalida3.');
 if ParamCount = 1 then
 writeln('Erro na linha: ',linha);
 end;
 End
 else
 If ((new_col - col=2) and (new_lin-lin=-2)) then// Movimento de comer.
 Begin
 if (Matriz[lin-1,col+1] = inimigo) or (Matriz[lin-1,col+1] = DamaInimigo) then
 begin
 Matriz[lin-1,col+1]:= 0;
 Matriz[lin,col]:= 0;
 Matriz[new_lin,new_col]:= AtualJogador;
 turno := TurnoAtual;// Como houve peça comida fica no turno atual.

 end
 else
 Begin
 writeln('Jogada invalida4.');
 if ParamCount = 1 then
 writeln('Erro na linha: ',linha);
 end;
 End
 else
 Begin
 writeln('Jogada invalida5.');
 if ParamCount = 1 then
 writeln('Erro na linha: ',linha);
 end;//Existe peça a ser comida.

end
Else
// Se não existir peça para ser comida o movimento simples é valido
if ((new_col - col= -1) and (new_lin-lin=SubtracaoLinha)) or ((new_col - col=1) and
(new_lin-lin=SubtracaoLinha)) then
Begin
 Matriz[lin,col] := 0;
 Matriz[new_lin,new_col] := AtualJogador;
 turno:=TurnoInimigo;// Como não houve peça comida, passa para o proximo turno.
End;
end
else
if (Matriz[lin,col] = DamaAtualJogador) and (Matriz[new_lin,new_col] = 0) then// Jogadas da DAMA
Begin
if (abs(lin-new_lin)=abs(col-new_col)) then// Verifica se está andando na diagonal.
begin
 if ((new_lin-lin<0) and (new_col-col>0)) then// VERIFICA O TIPO DE MOVIMENTO ~CIMA DIREITA
 Begin
 for i := 1 to 9 do
 Begin
 if ((lin-i>=0) and (col+i<=9)) then
 if ((Matriz[lin-i,col+i] = inimigo) or (Matriz[lin-i,col+i] = DamaInimigo) and
 (lin-i<>new_lin) and (col+i<>new_col)) then
 Begin
	 pcinimiga:= pcinimiga+1;
	 val1:=lin-i;
	 val2:=col+i;
 end;
 end;
 if pcinimiga = 1 then
 begin
	 Matriz[lin,col]:= 0;
	 Matriz[new_lin,new_col]:= DamaAtualJogador;
	 Matriz[val1,val2]:= 0;
	 turno:=TurnoAtual;
 end
 else
 if pcinimiga = 0 then
 begin
	 Matriz[lin,col]:= 0;
	 Matriz[new_lin,new_col]:= DamaAtualJogador;
	 turno:=TurnoInimigo;
 end
 else
 Begin
 writeln('Jogada invalida7.');
 if ParamCount = 1 then
	 writeln('Erro na linha: ',linha);
 end;
 end
 else
 if ((new_lin-lin<0) and (new_col-col<0)) then// VERIFICA O TIPO DE MOVIMENTO ~CIMA ESQUERDA
 Begin
 for i := 1 to 9 do
 Begin
 if ((lin-i>=0) and (col-i<=9)) then
 if ((Matriz[lin-i,col-i] = inimigo) or (Matriz[lin-i,col-i] = DamaInimigo) and
 (lin-i<>new_lin) and (col-i<>new_col)) then
 Begin
	 pcinimiga := pcinimiga+1;
	 val1:=lin-i;
	 val2:=col-i;
 end;
 end;
 if pcinimiga = 1 then
 begin
	 Matriz[lin,col]:= 0;
	 Matriz[new_lin,new_col]:= DamaAtualJogador;
	 Matriz[val1,val2]:= 0;
	 turno:=TurnoAtual;
 end
 else
 if pcinimiga = 0 then
 begin
	 Matriz[lin,col]:= 0;
	 Matriz[new_lin,new_col]:= DamaAtualJogador;
	 turno:=TurnoInimigo;
 end
 else
 Begin
 writeln('Jogada invalida8.');
 if ParamCount = 1 then
	 writeln('Erro na linha: ',linha);
 end;
 end
 else
 if ((new_lin-lin>0) and (new_col-col>0)) then// VERIFICA O TIPO DE MOVIMENTO ~BAIXO DIREITA
 Begin
 for i := 1 to 9 do
 Begin
 if ((lin+i>=0) and (col+i<=9)) then
 if ((Matriz[lin+i,col+i] = inimigo) or (Matriz[lin+i,col+i] = DamaInimigo) and
 (lin+i<>new_lin) and (col+i<>new_col)) then
 Begin
	 pcinimiga := pcinimiga+1;
	 val1:=lin+i;
	 val2:=col+i;
 end;
 end;
 if pcinimiga = 1 then
 begin
	 Matriz[lin,col]:= 0;
	 Matriz[new_lin,new_col]:= DamaAtualJogador;
	 Matriz[val1,val2]:= 0;
	 turno:=TurnoAtual;
 end
 else
 if pcinimiga = 0 then
 begin
	 Matriz[lin,col]:= 0;
	 Matriz[new_lin,new_col]:= DamaAtualJogador;
	 turno:=TurnoInimigo;
 end
 else
 Begin
 writeln('Jogada invalida9.');
 if ParamCount = 1 then
	 writeln('Erro na linha: ',linha);
 end;
 for i := 1 to 9 do
 end
 else
 if ((new_lin-lin>0) and (new_col-col<0)) then// VERIFICA O TIPO DE MOVIMENTO ~BAIXO ESQUERDA
 Begin
 for i := 1 to 9 do
 Begin
 if ((lin+i>=0) and (col-i<=9)) then
 if ((Matriz[lin+i,col-i] = inimigo) or (Matriz[lin+i,col-i] = DamaInimigo) and
 (lin+i<>new_lin) and (col-i<>new_col)) then
 Begin
	 pcinimiga := pcinimiga+1;
	 val1:=lin+i;
	 val2:=col-i;
 end;
 end;
 if pcinimiga = 1 then
 begin
	 Matriz[lin,col]:= 0;
	 Matriz[new_lin,new_col]:= DamaAtualJogador;
	 Matriz[val1,val2]:= 0;
	 turno:=TurnoAtual;
 end
 else
 if pcinimiga = 0 then
 begin
	 Matriz[lin,col]:= 0;
	 Matriz[new_lin,new_col]:= DamaAtualJogador;
	 turno:=TurnoInimigo;
 end
 else
 Begin
 writeln('Jogada invalida10.');
 if ParamCount = 1 then
	 writeln('Erro na linha: ',linha);
 end;
 end
 else
 Begin
 writeln('Jogada invalida11.');
 if ParamCount = 1 then
 writeln('Erro na linha: ',linha);
 end;
End
else
Begin
writeln('Jogada invalida12.');
if ParamCount = 1 then
 writeln('Erro na linha: ',linha);
end;

End
else
Begin
writeln('Jogada invalida13.');
if ParamCount = 1 then
writeln('Erro na linha: ',linha);
end;
End;

 procedure Escreve_Matriz;// Escreve a matriz com as suas peças.
 begin
c:=9;
c1:=0;
//FIM
	 writeln(' A B C D E F G H I J ');
writeln(' +-+-+-+-+-+-+-+-+-+-+');
	 for i:=0 to 9 do // Linha da matriz
	 begin
		 write(i);
		 for j:=0 to 9 do // Coluna da Matriz
		 begin
				 write('|');
if Matriz[c,j]= 1 then
Matriz [c,j]:=Matriz [c,j]+1;
if Matriz[c1,j]= -1 then
Matriz [c1,j]:=Matriz [c,j]-1;
				 if Matriz[i,j]=0 then
					 write(' ');
				 if Matriz[i,j]=1 then
					 write('o');	 {Reescreve a matriz apos as jogadas.}
if Matriz[i,j]=2 then
					 write('O');
				 if Matriz[i,j]=-1 then
					 write('@');
if Matriz[i,j]=-2 then
					 write('&');
				 if Matriz[i,j]=3 then
					 write('#');
		 end;
		 write('|');
		 write(i);
		 writeln;
	 end;
	 writeln(' A B C D E F G H I J ');
	 writeln;
end;
 procedure Traduz;// Começa procedimento para ler a jogada do jogador e traduzi-la de ASCII para inteiro.
 Begin
if ParamCount = 0 then
 writeln('Entre com a sua jogada. Jogador ',turno);

if ParamCount = 0 then
begin
readln(jg);
end;
col:=(integer(jg[1])-65);// Letra maiuscula
lin:=(integer(jg[2])-48);//Numero
new_col:=(integer(jg[5])-65);// Letra maiuscula
new_lin:=(integer(jg[6])-48);//Numero.
end;


Procedure IniciaTabuleiro;// Inicia o tabuleiro para que o jogo comece.
Begin

for i := 10 to 12 do
begin
for j := 10 to 12 do
begin
 Matriz[i,j]:=3; //Define peças em branco.
end
end;

for i := 0 to 9 do
begin
for j := 0 to 9 do
begin
 Matriz[i,j]:=0; //Define peças em branco.
end
end;
for i:=0 to 2 do
 begin
 for j:=0 to 9 do
 begin
		 Matriz[i,j]:=1;//Define peças do jogador de cima.
 end
 end;
for i:=7 to 9 do
 begin
 for j:=0 to 9 do
 begin
		 Matriz[i,j]:=-1;//Define peças do jogador de baixo.
 end
 end;
for i := 0 to 9 do
begin
for j := 0 to 9 do
begin
if ((i+j)mod 2 = 0) then
 Matriz[i,j]:=3;//Define casas brancas.
end
end ;
	 writeln(' A B C D E F G H I J ');
writeln(' +-+-+-+-+-+-+-+-+-+-+');
	 for i:=0 to 9 do
	 begin
		 write(i);
		 for j:=0 to 9 do
		 begin
				 write('|');
				 if Matriz[i,j]=0 then
				 write(' ');
				 if Matriz[i,j]=1 then
				 write('o'); // Inicia tabuleiro do começo do jogo. Não tem if para dama pq elas ainda não podem existir.
				 if Matriz[i,j]=-1 then
				 write('@');
				 if Matriz[i,j]=3 then
				 write('#');
		 end;
		 write('|');
		 write(i);
		 writeln;
	 end;
	 writeln(' A B C D E F G H I J ');
	 writeln;
End;

Begin//Começa o programa em si.
if ParamCount = 1 then// Verifica se teve parametro dado. Se tiver ele executa.
Begin

AssignFile(arquivo,ParamStr(1));
 Reset(arquivo);
linha:=1; // Recebe o arquivo TXT.
while not EOF(arquivo) do
begin
readln(arquivo, jg);
Writeln(jg);
if linha =1 then// Para não ter problema de B ou C entrar como jogada.
Begin
turno:=0;
while turno = 0 do
Begin
IniciaTabuleiro;//Inicia o tabuleiro no programa principal.

//Recebe o jogodor que vai começar a jogar.


If (jg = 'c') or (jg = 'C') then
begin
 turno:=1;//Define turno do jogador.
end
else
If (jg = 'b') or (jg = 'B') then
begin
 turno:=2;//Define turno do jogador.
end
else
 Writeln('Jogador selecionado invalido.');
end;
linha:=2;// Define a linha como 2.
end

else// Caso seja linha > 1
Begin

// TURNO ZERO INDICA FIM DE JOGO. (Apenas quando todas as peças de um jogador forem comidas.)
// inicio do while para continuar as jogadas.
If turno = 1 then
begin
{Jogadas do jogador de cima}
		 Traduz;//Pega valor da jogada
	 Jogadas;
end;
// FIM DO JOGADOR DE CIMA
if turno = 2 then
begin
{Jogadas do jogador de BAIXO}
Traduz; //Pega valor da jogada
Jogadas;//Efetua a jogada


end;

linha:=linha+1;
end;//fim do else do if linha

end;
CloseFile(arquivo);// Fecha arquivo após ler todo o código.
Escreve_matriz;
FimJogo;
CloseFile(arquivo);
end
else
turno:=0;
while turno = 0 do
Begin
IniciaTabuleiro;//Inicia o tabuleiro no programa principal.

//Recebe o jogodor que vai começar a jogar.
writeln('Insira o jogador que vai começar a jogar.');
Writeln('C para o jogador com ''o'' e B para ''@''');
readln(jogador);


If (jogador = 'c') or (jogador = 'C') then
begin
turno:=1;//Define turno do jogador.
end
else
If (jogador = 'b') or (jogador = 'B') then
begin
turno:=2;//Define turno do jogador.
end
else
writeln('Jogador selecionado é invalido.');
end;
// TURNO ZERO INDICA FIM DE JOGO. (Apenas quando todas as peças de um jogador forem comidas.)
// inicio do while para continuar as jogadas.
	 while turno <> 0 do
 begin
If turno = 1 then
begin
{Jogadas do jogador de cima}
		 Traduz;//Pega valor da jogada
	 Jogadas;
	 Escreve_matriz;// ESCREVE MATRIZ APÓS JOGADA.
FimJogo;
end;
// FIM DO JOGADOR DE CIMA
if turno = 2 then
begin
{Jogadas do jogador de BAIXO}
Traduz; //Pega valor da jogada
Jogadas;//Efetua a jogada
Escreve_matriz; // ESCREVE MATRIZ APÓS JOGADA.
FimJogo;
end;
//fim do while
	 end;
{tratar o fim do jogo}

end.

Edited by silentvictor

Share this post


Link to post
Share on other sites
thoga31

Parece-me que falta uma grande componente de coisas essenciais da programação. Tenho visto imensos maus hábitos criados e suportados nas escolas e universidades que metem medo ao susto, como a modificação de variáveis globais dentro de procedimentos e funções, e este parece-me mais um desses casos em que as boas práticas não são propriamente leccionadas, tendo resultados "interessantes" como a utilização de dois Closes após um único Assign.


Knowledge is free!

Share this post


Link to post
Share on other sites
silentvictor

Curso o 1º semestre de Ciencias da Computação, durante todo o 1º semestre o professor que deveria me ajudar com esse tipo de coisa apenas jogou conteudo na lousa e eu tive que me virar pra fazer do jeito "correto".

Tenho que entregar esse trabalho hoje. foi passado desde o dia 18 de junho e meu grupo (3 pessoas) não conseguiram fazer a sua parte e só uma semana antes de entregar que vieram se dar conta disso.

No fim eu que fiz tudo só e sei que está bem ruim, mas é puro desespero =/

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.