Yamix Posted April 29, 2018 at 06:12 PM Report #610376 Posted April 29, 2018 at 06:12 PM 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á! 😄
Yamix Posted April 29, 2018 at 08:59 PM Author Report #610377 Posted April 29, 2018 at 08:59 PM 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 😄 😛
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