silentvictor Posted July 16, 2013 at 04:38 PM Report #518966 Posted July 16, 2013 at 04:38 PM (edited) 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 July 16, 2013 at 04:43 PM by nunopicado Adicionada linguagem GeShi
nunopicado Posted July 16, 2013 at 04:47 PM Report #518967 Posted July 16, 2013 at 04:47 PM (edited) 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 July 16, 2013 at 04:48 PM 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.
silentvictor Posted July 16, 2013 at 04:50 PM Author Report #518968 Posted July 16, 2013 at 04:50 PM (edited) O arquivo txt é esse: Não sei um outro modo de ler linha por linha =/ *Editado https://www.dropbox.com/s/jyo12t38mg0ne4l/jogadas.txt Edited July 16, 2013 at 04:53 PM by silentvictor
nunopicado Posted July 16, 2013 at 04:51 PM Report #518969 Posted July 16, 2013 at 04:51 PM 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) 1 Report "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.
silentvictor Posted July 16, 2013 at 04:58 PM Author Report #518970 Posted July 16, 2013 at 04:58 PM https://www.dropbox.com/s/jyo12t38mg0ne4l/jogadas.txt
nunopicado Posted July 16, 2013 at 05:07 PM Report #518972 Posted July 16, 2013 at 05:07 PM 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.
silentvictor Posted July 16, 2013 at 05:47 PM Author Report #518978 Posted July 16, 2013 at 05:47 PM 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...
thoga31 Posted July 16, 2013 at 05:54 PM Report #518979 Posted July 16, 2013 at 05:54 PM 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!
silentvictor Posted July 16, 2013 at 08:45 PM Author Report #519001 Posted July 16, 2013 at 08:45 PM Thoga, e como verifico o fim do ficheiro?
nunopicado Posted July 16, 2013 at 08:46 PM Report #519002 Posted July 16, 2013 at 08:46 PM 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.
silentvictor Posted July 16, 2013 at 09:07 PM Author Report #519008 Posted July 16, 2013 at 09:07 PM (edited) 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 July 16, 2013 at 09:10 PM by silentvictor
Kline777 Posted July 16, 2013 at 09:26 PM Report #519013 Posted July 16, 2013 at 09:26 PM DE que tipo é o arquivo mesmo? Depois destas dicas como tens o codigo agora?
thoga31 Posted July 16, 2013 at 09:28 PM Report #519014 Posted July 16, 2013 at 09:28 PM (edited) DE que tipo é o arquivo mesmo? linha:=1; // Recebe o arquivo TXT. Edited July 16, 2013 at 09:29 PM by thoga31 Knowledge is free!
pwseo Posted July 16, 2013 at 09:33 PM Report #519016 Posted July 16, 2013 at 09:33 PM 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.
silentvictor Posted July 16, 2013 at 09:49 PM Author Report #519021 Posted July 16, 2013 at 09:49 PM (edited) 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 July 16, 2013 at 09:50 PM by thoga31 GeSHi
nunopicado Posted July 16, 2013 at 09:50 PM Report #519022 Posted July 16, 2013 at 09:50 PM (edited) 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 July 16, 2013 at 09:51 PM 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.
thoga31 Posted July 16, 2013 at 09:52 PM Report #519023 Posted July 16, 2013 at 09:52 PM 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!
silentvictor Posted July 16, 2013 at 09:54 PM Author Report #519024 Posted July 16, 2013 at 09:54 PM (edited) 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 July 16, 2013 at 09:56 PM by silentvictor
thoga31 Posted July 16, 2013 at 09:57 PM Report #519025 Posted July 16, 2013 at 09:57 PM 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!
silentvictor Posted July 16, 2013 at 10:04 PM Author Report #519027 Posted July 16, 2013 at 10:04 PM 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 =/
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now