Jump to content

Recommended Posts

Posted

Olá,

Estou com o seguinte problema em um código, e estar a me deixar louco, já tentei várias coisas.. e não consigo resolver, a lógica por trás disso é mesmo absurda! Procurei vários temas que davam soluções para problemas parecidos com o meu, como ordenação e busca binária, mas eu não consigo aplicar elas ao código e por isso estou ficando louco. 

O código é esse:

Procedure VerificaObjeto(); 
Var I, J, K: Integer;
Begin
 (* Verifica se existem objetos na mesma posição *)
  Objeto.Verificado := True;	
  For I := 1 To MaxObjetos Do 
	For J := 1 To MaxObjetos Do
	  If (Objeto.X[J] = Objeto.X[I]) And (Objeto.Y[J] = Objeto.Y[I]) Then Begin
        For K := 1 To MaxObjetos Do
		  If (Objeto.X[K] = Objeto.X[J]) And (Objeto.Y[K] = Objeto.Y[J]) Then Begin
			Objeto.X[K] := 0;
			Objeto.Y[K] := 0;
		  End;
		Objeto.X[J] := 0;
		Objeto.Y[J] := 0;
		Inc(Objeto.DBG[3]);
	  End;
End;

O objetivo desse algoritmo, era apenas, fazer uma varredura atras de objetos com coordenadas X e Y com valores iguais. Por Exemplo:

For I := 1 To MaxObjetos Do 
  For J := 1 To MaxObjetos Do

  Considere: 
    As posições: I = 2, J = 3;
    E os valores, nas suas respectivas posições:
    Objeto.X[I] / Objeto.Y[I]  := 5;
    Objeto.X[J] / Objeto.Y[J]  := 5;
  
	If (Objeto.X[J] = Objeto.X[I]) And (Objeto.Y[J] = Objeto.Y[I]) Then Begin
      RetirarValorRepetido;
    ...

O algoritmo faz isso, mas faz ainda mais. Ele está apagando o valor de todas as posições dessas 2 Array's.

Prints:  como está = K6NvBF8.png..  como deveria estar = 7DBDYz4.png..

Alguém, por gentileza poderia me ajudar a chegar numa solução? 

Agradeço, desde já! 😄

Posted

Eu consegui resolver.. meu deus, estou me sentindo fod* e burro ao mesmo tempo. Basicamente, o que eu fiz foi pegar o procedimento responsável por criar os objetos e dar valores x e y, e adicionar uma verificação no mesmo, para ver se os valores gerados já existiam.

If (I > 1) Then
  For K := 1 To I - 1 Do 
    If (Objeto.X[I - K] = Objeto.X[I]) And (Objeto.Y[I - K] = Objeto.Y[I]) Then Begin
	  Objeto.X[I - K] := 1; // O código não estava compilando aqui por ter valor 0. Então alterei para 1 e funcionou!
	  Objeto.Y[I - K] := 1;
	  Inc(Objeto.DBG[3]);
	End;

Eu sei que isso tem um nome matemático, mas eu cheguei nisso sem querer e não lembro do nome, não sei se é progressão.. não vou procurar isso agora, to com uma dor de cabeça infernal.. enfim, ele funciona assim: 

Vamos supor, que I vale 2. (valor mínimo)

  For K := 1 To I - 1 Do Begin                           2
    -- K vai contar de 1, até I - 1, ou seja, nesse caso I - 1 = 1.
 
  ----------------------- EXEMPLO -----------------------

  If (Objeto.X[I - K] = Objeto.X[I]) And (Objeto.Y[I - K] = Objeto.Y[I]) Then Begin
    -- A contagem sempre será feita assim:
       Se I vale 4, Então irá fazer:
          4 - 1
          4 - 2
          4 - 3
    -- Irá sempre contar de 1 até I - 1.

  -------------------------------------------------------

Não veja esse print: GWdDx12.png

Meu deus, eu consegui. Sério, foi muito tempo pra chegar nisso.. kkkkk 😄 😛

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.