Jump to content

[Resolvido] Array dentro de Record


joao_o grande
 Share

Recommended Posts

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;
Begin
for comida.n_com:=1 to 35 do
begin
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

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 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

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??

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 by joao_o grande
Link to comment
Share on other sites

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

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 by joao_o grande
Link to comment
Share on other sites

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 by nunopicado
  • 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.

Link to comment
Share on other sites

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

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

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 by thoga31
URL corrigido

Knowledge is free!

Link to comment
Share on other sites

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

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
 Share

×
×
  • 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.