joao_o grande Posted January 6, 2016 at 12:22 AM Report Share #591458 Posted January 6, 2016 at 12:22 AM posso fazer isto??? var comida: Record coordenadasx: array [0..77] of byte; coordenadasy: array [0..23] of byte; n_com:[1..35] of byte; end;Beginfor comida.n_com:=1 to 35 dobegin comida.coordenadasx[comida.n_com]:=Random(74)+3; comida.coordenadasy[comida.n_com]:=Random(19)+3; Gotoxy(comida.coordenadasx[comida.n_com],comida.coordenadasy[comida.n_com]) Writeln(#178);end;[/Code] O meu objetivo é criar cerca de 35 caracteres aleatoriosna tela e que sejam facilmente identificaveis. Ou seja, Se o caracter aleatorio coincidir com outro que eu estou a mover entao a variavel pontos aumenta um valor. Em pascal fica assim: [Code=Pascal]If Jogador.X=comida.coordenadasx[comida.n_com] and Jogador.Y=comida.coordenadasx[comida.n_com] then Pontos:=Pontos+1;[/Code] Eu sei que está um pouco confuso, mas podem-me dizer se estou no bom caminho ou se tem algum erro?? Se quiserem que explique de outra maneira eu explico. Link to comment Share on other sites More sharing options...
nunopicado Posted January 6, 2016 at 12:45 AM Report Share #591460 Posted January 6, 2016 at 12:45 AM (edited) Dividi o tópico porque isto já começa a fugir à dúvida do outro membro. Sim, podes fazer isso. Mas não vai funcionar como estás a pensar. Em coordenadas, criaste um mapa do ecrã, mas depois dentro do FOR, estás a preencher apenas as primeiras 35 colunas (X) e primeiras 35 linhas (Y - que por sinal vai dar erro porque o array só tem até 23). O que queres é capaz de ser uma matriz que te guarde a localização da comida. Sugeria-te algo do género: const MaxX = 77; MaxY = 23; var Comida: Array [0..MaxX, 0..MaxY] of Boolean; x,y, n_com: Integer; begin // Inicializa a matriz: for x := 0 to MaxX do for y := 0 to MaxY do Comida[x,y] := False; // Define as posições da comida Randomize; for n_com := 1 to 35 do Comida[Random(MaxX), Random(MaxY)] := True; // usar: if Comida[Jogador.X, Jogador.Y] then Inc(Pontos); Foi feito de cabeça, pelo que podes ter de fazer ajustes, mas será algo parecido. Por exemplo, aqui não estou a validar se quando ele cria os 35 pontos de comida ele cria em alguma posição que já exista. A matriz do tipo Boolean só te permite um tipo de comida (cada posição ou tem ou não tem comida), mas podes facilmente mudar por outro tipo para outras definições. Edited January 6, 2016 at 12:57 AM 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. Link to comment Share on other sites More sharing options...
joao_o grande Posted January 6, 2016 at 05:02 PM Author Report Share #591497 Posted January 6, 2016 at 05:02 PM (edited) Desculpa a confusão de tópicos e isso tudo. 1º onde está o end dos ciclos for? 2º Eu percebi essa parte de inicializar a matriz, mas qual é o objetivo?? 3º if Comida[Jogador.X, Jogador.Y] then Inc(Pontos); eu quero que ele aumente a variavel pontos quando o qualquer numero aleatorizado do array de Comida[Random(MaxX), Random(MaxY)] coincida com as posições Jogador.X e Jogador.y .Se esta certo, eu não percebi porque. O inc aumenta um ?? Nao sabia Possso fazer isto assim?? Comida: Array [2..MaxX, 2..MaxY] of Boolean; É que os limites do campo vao ser 3,3 a 77,22 E como é que faço para meter essa matriz num Gotoxy?? Posso fazer isto?? coordenadasxy:=coordenadasxy[x_comida,y_comida]; o coordenadasxy é o array das coordenadas Edited January 6, 2016 at 07:49 PM by joao_o grande Link to comment Share on other sites More sharing options...
nunopicado Posted January 6, 2016 at 06:33 PM Report Share #591503 Posted January 6, 2016 at 06:33 PM Desculpa a confusão de tópicos e isso tudo. Era natural, vinha do seguimento dos records. 🙂 Já está resolvido, não há problema. 1º onde está o end dos ciclos for? Não está... Nem o Begin. Dentro do FOR de fora, só há um comando, o FOR de dentro. E dentro do FOR de dentro, só há um comando, o Comida[x,y] := False; Sendo só um comando, não é preciso begin e end. Mas podes por, se achares que se torna mais legível para ti. 😉 2º Eu percebi essa parte de inicializar a matriz, mas qual é o objetivo?? Quando crias um array ele cria-te em memória o espaço equivalente a todas as posições do array, mas tu não sabes à partida qual o valor que cada uma dessas posições tem. Normalmente até mete o False, no caso das variáveis Boolean, mas não tens como ter certeza. Uma variável não inicializada é o suficiente para te baralhar todo o funcionamento do programa. Pelo que qualquer variável deve ser inicializada sempre que o primeiro uso não seja atribuir-lhe um valor. 3º if Comida[Jogador.X, Jogador.Y] then Inc(Pontos); eu quero que ele aumente a variavel pontos quando o qualquer numero aleatorizado do array de Comida[Random(MaxX), Random(MaxY)] coincida com as posições Jogador.X e Jogador.y .Se esta certo, eu não percebi porque. A matriz comida vai ter uma posição por cada caracter possível no ecrã. Imagina uma grelha no ecrã. Aliás, o ecrã é ele próprio uma matriz. Logo que as medidas da matriz correspondam às coordenadas, podes aceder à matriz através delas. Imagina que o jogador A está na posição x=5/y=3: Ao fazeres Comida[Jogador.X, Jogador.Y], é o mesmo que fazeres Comida[5,3], ou seja, estás a aceder a essa posição da matriz. Depois é só testar com o IF se essa posição tem o valor True - se tiver é porque há lá paparoca. E nesse caso, incrementa a variável Pontos. O inc aumenta um ?? Nao sabia Sim. Inc(Pontos) aumenta +1, Inc(Pontos, 5) aumenta 5. Tens ainda o procedimento Dec, que faz o mesmo mas a subtrair. Possso fazer isto assim?? Comida: Array [2..MaxX, 2..MaxY] of Boolean; É que os limites do campo vao ser 3,3 a 77,22 Se fosse a ti até punha mesmo o array assim: const MinX = 3; MaxX = 77; MinY = 3; MaxY = 22; var Comida: Array [MinX..MaxX, MinY..MaxY] of Boolean; Assim não precisas andar a converter posições começadas em 0 ou começadas em 1. A posição da matriz terá exactamente o mesmo valor das coordenadas no ecrã. E podes usar as constantes em tudo onde precises saber os limites da área de jogo, para a qualquer momento se precisares alterar, basta alterar as constantes e o resto ajusta-se sozinho. E como é que faço para meter essa matriz num Gotoxy?? Se tudo corresponder como expliquei no exemplo acima, bastam dois FORs encadeados, iguais ao da inicialização. As variáveis X e Y de controle dos FORs vão servir tanto para as posições da matriz como para o GotoXY. "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. Link to comment Share on other sites More sharing options...
joao_o grande Posted January 6, 2016 at 10:54 PM Author Report Share #591519 Posted January 6, 2016 at 10:54 PM (edited) nuno, muito obrigado pela expicação. Percebi tudo lindamente. Só mais um coisa. Posso fazer isto?, que é muito mais simplex If (Jogador.X=WhereX) and (Jogador.Y=WhereY) then Inc(Pontos);[/Code] Como o compilador guarda em memoria o Jogador.x e jogador.y podemos usar o wherex. Outra duvida: Posso usar WhereX mesmo com o cursoroff?? Outra coisa: Se tudo corresponder como expliquei no exemplo acima, bastam dois FORs encadeados, iguais ao da inicialização. As variáveis X e Y de controle dos FORs vão servir tanto para as posições da matriz como para o GotoXY. eu gostaria mesmo de saber como meto uma matriz dentro de um Gotoxy, no caso de precisar em programas futuros. Edited January 6, 2016 at 10:56 PM by joao_o grande Link to comment Share on other sites More sharing options...
nunopicado Posted January 6, 2016 at 11:16 PM Report Share #591523 Posted January 6, 2016 at 11:16 PM (edited) Posso fazer isto?, que é muito mais simplex If (Jogador.X=WhereX) and (Jogador.Y=WhereY) then Inc(Pontos);[/Code] Como o compilador guarda em memoria o Jogador.x e jogador.y podemos usar o wherex. O WhereX e WhereY retornam a posição actual do cursor (mesmo que esteja em off). Ao andares com o jogador, vais escreve-lo numa qualquer posição (usando o GotoXY), pelo que o WhereX e o Where Y já vão apontar para a posição do jogador (ou melhor dizendo, para o caracter a seguir à posição do jogador). Logo, não podes fazer isso para ver onde está a comida. Mas em que sentido é que isso é mais simples que verificar o valor da posição da matriz? Mais simples do que [code=pascal] if Comida[Jogador.X, Jogador.Y] then Inc(Pontos); não estou a ver possível. 🙂 eu gostaria mesmo de saber como meto uma matriz dentro de um Gotoxy, no caso de precisar em programas futuros. Não metes... Onde foste buscar tal ideia? Um GotoXY é um procedimento que te move o cursor no ecrã. Não há dentro ou fora de um GotoXY. O que há é, por exemplo, usar o GotoXY para escrever no ecrã o que está na matriz. E isso já te mostrei como é. Edited January 7, 2016 at 11:55 PM by nunopicado 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. Link to comment Share on other sites More sharing options...
joao_o grande Posted January 7, 2016 at 12:05 AM Author Report Share #591529 Posted January 7, 2016 at 12:05 AM (edited) posso guardar o whereX numa variável?? posicaoatual:=wherex; por exemplo. Edited January 7, 2016 at 12:18 AM by joao_o grande Link to comment Share on other sites More sharing options...
nunopicado Posted January 7, 2016 at 12:23 AM Report Share #591531 Posted January 7, 2016 at 12:23 AM Sim, podes fazer isso. Tem de ser uma variável Integer. "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. Link to comment Share on other sites More sharing options...
thoga31 Posted January 7, 2016 at 01:00 PM Report Share #591551 Posted January 7, 2016 at 01:00 PM (edited) Tem de ser uma variável Integer. Se quiséssemos ser precisos, variável do tipo Byte. E ainda mais precisos, o verdadeiramente correcto é o tipo tcrtcoord 😄 Edited January 7, 2016 at 01:00 PM by thoga31 Knowledge is free! Link to comment Share on other sites More sharing options...
nunopicado Posted January 7, 2016 at 01:49 PM Report Share #591569 Posted January 7, 2016 at 01:49 PM heheheh Tão preciosistas que estamos hoje! 😛😁 "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. Link to comment Share on other sites More sharing options...
joao_o grande Posted January 7, 2016 at 03:50 PM Author Report Share #591581 Posted January 7, 2016 at 03:50 PM Precisos e preciosos...obrigado aos dois pelo esforço que têm desenvolvido. Estão realmente de parabéns os moderadores...e o forum claro (sempre limpo e organizado). Link to comment Share on other sites More sharing options...
joao_o grande Posted January 7, 2016 at 05:06 PM Author Report Share #591589 Posted January 7, 2016 at 05:06 PM (edited) afinal ainda falta uma coisa: Eu não consigo fazer isto: coordenadasxy[Random(74)+3,Random(19)+3]; a matriz está declarada assim: coordenadasxy: array [3..77,3..22] of integer; o pascalzim dá erro Edited January 7, 2016 at 05:10 PM by joao_o grande Link to comment Share on other sites More sharing options...
thoga31 Posted January 7, 2016 at 05:11 PM Report Share #591592 Posted January 7, 2016 at 05:11 PM Qual erro? Essa linha de código aparece em que contexto? Nós não temos uma bola de cristal, tens de nos dizer exactamente o que se passa. "Um erro" pode ser um entre milahres que existem. Knowledge is free! Link to comment Share on other sites More sharing options...
nunopicado Posted January 7, 2016 at 06:54 PM Report Share #591597 Posted January 7, 2016 at 06:54 PM O Thoga tem razão, mas vou já adiantando que o maior erro é usares o PascalZim. Isso não é Pascal, é uma amostra muito pequenina do que é o Pascal. Muitos dos comandos nem existem aí, outros funcionam de maneira diferente. "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. Link to comment Share on other sites More sharing options...
joao_o grande Posted January 7, 2016 at 07:25 PM Author Report Share #591603 Posted January 7, 2016 at 07:25 PM Pois, já usei o free pascal e em 1º lugar. não da para copiar, cortar e colar e em segundo lugar o ecrã do meu computador é pequeno e por isso as letras aprecem super pequenas, quase que preciso de um microscopio. Como não faço coisas muito complexas acho que compensa (nesta versão que uso acho que eles já integraram 40 funçoes da unit Graph. não sei se é assim tão mau. Outra coisa: recomendam o compilador lazaurus?? O contexto é este: comida[Random(74)+3,Random(19)+3]; não funciona Sugeria-te algo do género: const MaxX = 77; MaxY = 23; var Comida: Array [0..MaxX, 0..MaxY] of Boolean; x,y, n_com: Integer; begin // Inicializa a matriz: for x := 0 to MaxX do for y := 0 to MaxY do Comida[x,y] := False; // Define as posições da comida Randomize; for n_com := 1 to 35 do Comida[Random(MaxX), Random(MaxY)] := True; // usar: if Comida[Jogador.X, Jogador.Y] then Inc(Pontos); Link to comment Share on other sites More sharing options...
thoga31 Posted January 7, 2016 at 07:28 PM Report Share #591604 Posted January 7, 2016 at 07:28 PM (edited) O Free Pascal é um compilador, ou seja, transforma o código-fonte em executáveis. O Free Pascal traz consigo um editor bastante básico que não é prático. Para isso é que existem editores de texto. Recomendo o Notepad++. O @nunopicado publicou um pequeno tutorial que o Notepad++ use o Free Pascal para compilar. Edited January 7, 2016 at 08:32 PM by thoga31 URL corrigido Knowledge is free! Link to comment Share on other sites More sharing options...
joao_o grande Posted January 7, 2016 at 08:05 PM Author Report Share #591608 Posted January 7, 2016 at 08:05 PM não consigo aceder ao url. Deves ter apagado alguma coisa do BB code Link to comment Share on other sites More sharing options...
nunopicado Posted January 7, 2016 at 08:05 PM Report Share #591609 Posted January 7, 2016 at 08:05 PM E podes usar também o Lazarus, que é um editor bem melhor que o de origem do FreePascal, mas que também usa o FreePascal como compilador. Quanto ao "só fazeres coisas pequenas", é pra tu veres... Até em coisas pequenas o PZim falha. É sim, o editor básico do FreePascal dá perfeitamente para fazer Copiar (ctrl + ins) e Colar (shift + ins). Primeira regra do programador: não digas que não dá sem testar. "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. Link to comment Share on other sites More sharing options...
joao_o grande Posted January 7, 2016 at 08:20 PM Author Report Share #591610 Posted January 7, 2016 at 08:20 PM (edited) eu já testei o free pascal, mas as letras ficam muito pequenas por causa da dimensão do meu portatil. Vou ver se gosto do Lazauros (espero q funcione em windows 10) Edited January 7, 2016 at 08:37 PM by joao_o grande Link to comment Share on other sites More sharing options...
joao_o grande Posted January 7, 2016 at 08:37 PM Author Report Share #591612 Posted January 7, 2016 at 08:37 PM tens mesmo de me mostrar esse tutorial de instalar o lazarus porque aparece-me programação em delphi. Link to comment Share on other sites More sharing options...
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