Ir para conteúdo
Fórum Script Brasil
  • 0

Ordenação De Valores


Guest Darknnez

Pergunta

Guest Darknnez

Opa, e aí galera?

O negócio é seguinte:

Estou com uma grande dúvida mais especificamente em lógica de programação e não nescessariamente na linguagem Visual Basic.

Partindo do princípio, o que eu pretendo é construir um jogo do estilo manager, para colocar em prática o meu aprendizado em VB6, nada muito sério.

Mas bati de frente com um problema.

Não consigo ordenar valores.

Por exemplo:

No "jogo" teria um form com aproximadamente 20 Labels.

Cada Label.Caption retornaria um valor diferente definido por variáveis.

Vou tentar ser mais específico.

Seria um jogo manager de F1.

Para gerar a corrida, eu teria que definir qual piloto chegou em qual posição.

As posições são representadas por cada um dos Labels.

Então.... como eu faria?

Por que a única maneira com que eu sei trabalhar, seria a seguinte:

(suponham que são apenas 4 Labels e 4 variáveis, para não dar muito trabalho)

Dim a As Integer

Dim b As Integer

Dim c As Integer

Dim d As Integer

Private Sub Command1_Click()

Randomize

a = Int(20 * Rnd) + 1

b = Int(15 * Rnd) + 1

c = Int(10 * Rnd) + 1

d = Int(5 * Rnd) + 1

If (a > B) And (a > c) And (a > d) And (b >c) And (b > d) And (c > d) Then

lbl1.Caption = "valor1"

lbl2.Caption = "valor2"

lbl3.Caption = "valor3"

lbl4.Caption = "valor4"

Endif

E assim vai...

End Sub

Mas agora, imaginem se eu tivesse que fazer isso para cada uma das 20 variáveis que seriam necessárias (lembrando que no exemplo acima eu só usei 4 para facilitar).

Daria um trabalho imenso, certo?

Portanto, eu gostaria de saber se alguém poderia me ensinar aplicar algum algoritmo de ordenação no programa.

Mas que por favor, seja bastante específico de como aplicar, para que eu possa entender.

Espero que possam me ajudar.

Obrigado.

Darknnez

Link para o comentário
Compartilhar em outros sites

  • Respostas 299
  • Created
  • Última resposta

Top Posters For This Question

Top Posters For This Question

Posted Images

Posts Recomendados

  • 0

sim, dava pra fazer assim, mas ai é foda tem que refazer toda a funcao. tipo, tem que ver a logica certinho, talvez ate tenha um jeito simples, mas não ta me entrando na cabeca, por isso falei de fazer a funcao nova, achei que seria mais simples. se você achar algum jeito pode fazer.

alias... tava pensando aqui. se você transformar o pontos2 em decimal da pontuacao principal, deve funcionar sim... tipo, divida a pontuacao2 por 100 e some com a pontuacao principal na hora de comparar. nessa linha:

If Vetor(j).pontuaçao2 < Vetor(min).pontuaçao2 Then min = j

Link para o comentário
Compartilhar em outros sites

  • 0

Olha só o que eu fiz, e acho que deu certo,

Criei um campo novo no Type Equipe:

desempate As Variant
Um campo novo no Type Piloto:
pontos2 As Integer
Mudei o SomaPontos:
Public Sub SomaPontos(i As Integer, pontos As Integer, pontos2 As String)
    Dim j As Integer
    xPiloto(i).pontos = xPiloto(i).pontos + pontos
    xPiloto(i).pontos2 = xPiloto(i).pontos2 + pontos2
    For j = 0 To UBound(xEquipe)
        If xEquipe(j).nome = xPiloto(i).equipe Then
            xEquipe(j).pontuaçao2 = xEquipe(j).pontuaçao2 + pontos
            xEquipe(j).desempate = xEquipe(j).desempate + pontos2
            Exit For
        End If
    Next
End Sub
No Form Corrida, adicionei o valor para pontos2:
SomaPontos 21, 10, 10
     SomaPontos 20, 8, 8
     SomaPontos 19, 6, 6
     SomaPontos 18, 5, 5
     SomaPontos 17, 4, 4
     SomaPontos 16, 3, 3
     SomaPontos 15, 2, 2
     SomaPontos 14, 1, 1
     SomaPontos 13, 0, 0.14
     SomaPontos 12, 0, 0.13
     SomaPontos 11, 0, 0.12
     SomaPontos 10, 0, 0.11
     SomaPontos 9, 0, 0.1
     SomaPontos 8, 0, 0.09
     SomaPontos 7, 0, 0.08
     SomaPontos 6, 0, 0.07
     SomaPontos 5, 0, 0.06
     SomaPontos 4, 0, 0.05
     SomaPontos 3, 0, 0.04
     SomaPontos 2, 0, 0.03
     SomaPontos 1, 0, 0.02
     SomaPontos 0, 0, 0.01
E denovo no Module1, fiz com que a função ordenasse pelo valor do campo desempate, e não do pontuação2:
Public Function ClassificaçãoEquipe2(ByRef Vetor() As equipe, tam)
    Dim i, j, h, k
    Dim min
    Dim aux As equipe

    For i = 0 To tam
        min = i
            For j = i + 1 To tam
                If Vetor(j).desempate < Vetor(min).desempate Then min = j
            Next j

            aux = Vetor(i)
            Vetor(i) = Vetor(min)
            Vetor(min) = aux
    Next i
    
End Function

Só observando que eu fiz com que, a soma do pontos2 dos pilotos que não pontuaram na corrida, nunca seja maior do que a soma do pontos2 dos pilotos que pontuaram.

A questão é, será que isso vai dar certo sempre?

Pelo menos nas minhas tentativas aqui, deu certo.

Link para o comentário
Compartilhar em outros sites

  • 0

a ta, pode ser assim, mas depende do criterio, que eu não sei direito como é.

porque por exemplo, se uma equipe tem um só piloto. e ele fica na frente de só tres pilotos. você soma 0.04 pra ele.

agora uma equipe com dois pilotos, ficam os dois logo atras desse primeiro. ai você soma 0.03 pra um e 0.02 pr outro. da 0.05 no total pra essa equipe.

ou seja, ela vai passar na frente da equipe do outro piloto que ficou com 0.04. mas o do 0.04 não deveria ficar na frente, já que ele acabou na frente dos outros dois??

se for isso, no desempate, você devia guardar so a pontuacao do melhor piloto de cada equipe.

Link para o comentário
Compartilhar em outros sites

  • 0

Até o fim desse tópico você ainda vai aprender a gostar de F1

hahahahaha

Bem, voltando ao projeto, eu estou tentando fazer com que, após cada temporada, as equipes controladas pelo computador possam comprar um motor diferente e melhor.

Aí eu fiz da seguinte forma

Se a EquipeX tiver dinheiro suficiente para comprar o primeiro motor melhor que o que ela já tem, ela compra.

No Form MenuEquipe

If etapa = 4 Then
    Randomize
    
    For j = 0 To UBound(xEquipe)
        h(j) = Int(2 * Rnd) + 1
    Next
    
    For j = 0 To UBound(xEquipe)
        For nMotor(j) = 0 To 7
            If h(j) = 1 Then
                If (nMotor(j) + 1) > 7 Then
                    h(j) = 0
                ElseIf xEquipe(j).finanças > xMotor(nMotor(j) + 1).custo Then
                    xEquipe(j).Motor = xMotor(nMotor(j) + 1).nome
                    xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) + 1).custo
                    nMotor(j) = nMotor(j) + 1
                End If
            End If
        Next
    Next
End If
E defini os valores de nMotor para cada equipe no módulo:
nMotor(0) = 0
nMotor(1) = 1
nMotor(2) = 5
.............

nMotor(10) = 7

De acordo com o motor que cada equipe tem.

Mas não sei por que, uma equipe qualquer, a BMW por exemplo, não compra necessariamente o primeiro motor melhor que o dela, as vezes ela pula o motor seguinte, e compra o segundo melhor que o dela, e isso vale para cada equipe.

Tem como corrigir?

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0

h é uma variável que gera um número aleatório.

nMotor é o número do motor.

Aí ficou assim: Motor(número do motor(de qual equipe) + 1)

Motor(nMotor(j) + 1)

Se h for igual a 1 então

___Se finanças da Equipe(j) for maior que custo do Motor(nMotor(j) + 1) então

______Equipe(j) compra Motor(nMotor(j) + 1)

Ou seja, se o número gerado aleatoriamente for 1, existe a possibilidade da equipe comprar o motor.

Mas ela só vai comprar se suas finanças forem maior que o custo do motor.

Esse motor que ela pode comprar, é o número do motor que ela já tem, mais 1, ou seja, o próximo motor da lista (pior motor = 1; melhor motor = 7)

Deu pra entender?

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0

por causa dessa linha:

For nMotor(j) = 0 To 7
a equipe vai ter sempre motor 0 quando chegar aqui:
ElseIf xEquipe(j).finanças > xMotor(nMotor(j) + 1).custo Then

ou seja, ela vai sempre comprar o motor 1.

ponha uma otra variavel qualquer pra fazer o for. porque no for você ta atribuindo valor pra ela. se o nMotor(j) era 6, por exemplo, você faz For nMotor(j) = 0, ele passa a valer 0 e vai somando ate 7.

mas o mais simples a se fazer era gravar o codigo do motor no proprio xEquipe.

Link para o comentário
Compartilhar em outros sites

  • 0

Pensando bem, eu nem precisava ter colocado essa linha

For nMotor(j) = 0 To 7
Se você for ver direito, tirando essa linha, deveria ter dado certo. Mas não deu. O código ficou assim: No Module1
Public nMotor(21) As Integer
Dentro do Private Sub_Main
nMotor(0) = 6
nMotor(1) = 7
nMotor(2) = 5
...........

nMotor(10) = 0
No MenuEquipe
For j = 0 To UBound(xEquipe)
    If h(j) = 1 Then
        If (nMotor(j) + 1) > 7 Then
            h(j) = 0
        ElseIf xEquipe(j).finanças > xMotor(nMotor(j) + 1).custo Then
            xEquipe(j).Motor = xMotor(nMotor(j) + 1).nome
            xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) + 1).custo
            nMotor(j) = nMotor(j) + 1
        End If
    End If
Next

Por que será que ainda ta dando errado?

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0

e qual erro acontece dessa vez??

sera que não é aquele negocio de novo?? você guarda a equipe x no indice 0, e guarda a equipe y no indice 1. ai você fala que o nMotor(0) tem o motor a e o nMotor(1) tem o motor b.

ate ai, a eqipe x tem o motor a, e a y tem a b.

mas ai a corrida acaba, e o x tem mais pontos que o y. ai você manda ordenar, e o x vai pro indice 1, e o y pro 0.

quando você for ver o motor do indice 0 (nMotor(0)), você vai achar o a. mas agora quem ta no indice 0 é o y. ou seja, eles trocaram de motor. sera que não é isso que ta acontecendo??

Link para o comentário
Compartilhar em outros sites

  • 0

levando em conta que a ordem dos motores nunca vai mudar, em xEquipe(j).Motor em vez de guardar o nome do motor, guarde o indice dele que esta no xMotor. ai se você precisar saber qual o nome, custo ou qualquer outra coisa desse motor é so fazer:

xMotor(xEquipe(x).Motor).nome

Link para o comentário
Compartilhar em outros sites

  • 0

Nenhum outro jeito diferente?

Eu até entendi como evitar aquele erro, mas o problema é que eu teria que mudar muita coisa no programa.

Por exemplo:

Para mostrar o nome do motor de cada equipe, eu fiz:

For i(0) = 0 To 7
    For j = 0 To UBound(xEquipe)
        If xOpção = xEquipe(j).nome Then
            If xEquipe(j).Motor = xMotor(i(0)).nome Then
                lblMotor.Caption = xEquipe(j).Motor & " - " & xMotor(i(0)).potencia
            End If
        End If
    Next
Next

Link para o comentário
Compartilhar em outros sites

  • 0

sim, na funcao que ordena a equipe, adiciona mais uma linha embaxo (tres linhas pra falar a verdade) e troque o motor junto. tipo:

aux1 = xMotor(i)
            xMotor(i) = xMotor(min)
            xMotor(min) = aux1[/code]

mas como você mesmo disse, você ta usando mais de 5 linhas pra mostrar o nome, enquanto podia tar usando uma só. e por mais que você tenha que mudar um mte de coisa no seu programa, isso so vai dexar o codigo mais bem-feito. alem de que essa alteracao na funcao que eu passei agora num é nd mais que uma gambiarra e muito mal-feita.

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, então retomando...

Espero que não tenha nenhum problema mesmo.

Mas se tiver, e tiver que fechar o tópico, não tem erro não, tudo bem pra mim.

Vou só colar o que eu ia postar antes do tópico ser fechado

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

Eu até te entendo, mas e fosse para mudar, teria que refazer o programa todo de uma vez.

O projeto todo está uma gambiarra.

Cada hora eu invento uma coisa nova pra colocar e tenho que sair alterando tudo, todo o código.

Mas voltanto aqui, eu devo adicionar o código na seguinte função, não é?:

Public Function ClassificaçãoEquipe2(ByRef Vetor() As equipe, tam)
    Dim i, j, h, k
    Dim min
    Dim aux As equipe
    Dim aux1 As Motor

    For i = 0 To tam
        min = i
            For j = i + 1 To tam
                If Vetor(j).desempate < Vetor(min).desempate Then min = j
            Next j

            aux = Vetor(i)
            Vetor(i) = Vetor(min)
            Vetor(min) = aux
            
            aux1 = xMotor(i)
            xMotor(i) = xMotor(min)
            xMotor(min) = aux1
    Next i
    
End Function

E se for isso mesmo, não deu certo.

Em um dos testes aqui, a Toyota, que tem o xMotor(3), comprou o xMotor(2), sendo que deveria existir apenas a possibilidade dela compra o xMotor(4).

E nessa mesma ocasião, a McLaren ficou sem motor, acho.

Só sei que no local onde deveria aparecer o nome do motor, não apareceu nada, ficou em branco.

Link para o comentário
Compartilhar em outros sites

  • 0

Vou te mandar o projeto denovo, pode ser?

To com um problema.

Eu estou tentando fazer com que as equipes controladas pelo computador, não só possam contratar um motor diferente, como também contratar qualquer motor que seja melhor que o que já tem, ou se não tiver dinheiro suficiente, contratar um motor pior.

Eu até consegui fazer isso, mas o problema é com a equipe Ferrari.

Como ela já tem o melhor motor, eu fiz com que não fosse necessário contratar outro, a não ser que seja necessário (se não estiver com dinheiro suficiente. Mas não está dando certo. Qualquer equipe, portanto, que chegar a contratar o motor ferrari (o melhor), teria o mesmo problema.

Para isso eu fiz, no MenuEquipe, o seguinte trecho:

b = 7 - nMotor(j)
c = nMotor(j) - 0
 If (nMotor(j) + 1) > 7 Then
    h(j) = 3
ElseIf (nMotor(j) + b) = nMotor(j) Then
    h(j) = 3
ElseIf (nMotor(j) - c) = nMotor(j) Then
    h(j) = 2
ElseIf (nMotor(j) - 1) < 0 Then
    h(j) = 2
E mais embaixo:
ElseIf h(j) = 2 Then
    xEquipe(j).Motor = xMotor(0).nome
    xEquipe(j).finanças = xEquipe(j).finanças - xMotor(0).custo
    nMotor(j) = 0
ElseIf h(j) = 3 Then
    xEquipe(j).Motor = xMotor(7).nome
    xEquipe(j).finanças = xMotor(7).custo
    nMotor(j) = 7

Vou te mandar por MP, assim você pode ver o cósigo todo que está no MenuEquipe.

Para ver o motor e as finanças de cada equipe, é só clicar em Equipes, no mesmo menu.

Assim, você pode notar que ao final de 4 corridas (uma temporada, no caso), a Ferrari permanece com o mesmo motor, mas suas finanças não diminuem como deveriam.

Valeu.

Link para o comentário
Compartilhar em outros sites

  • 0

guenta ai q já olho.

aqui, você tem q fechar o if:

If (nMotor(j) + 1) > 7 Then
                h(j) = 3
            ElseIf (nMotor(j) + b) = nMotor(j) Then
                h(j) = 3
            ElseIf (nMotor(j) - c) = nMotor(j) Then
                h(j) = 2
            ElseIf (nMotor(j) - 1) < 0 Then
                h(j) = 2
            End If[/code] porque aqui é onde você seta o h(). embaixo é onde você testa o h(), não é pra testar no mesmo If, é um If separado. otra coisa, la embaxo você fez:
[code]ElseIf h(j) = 3 Then
                    xEquipe(j).Motor = xMotor(7).nome
                    xEquipe(j).finanças = xMotor(7).custo
                    nMotor(j) = 7
                End If
acho q o certo seria:
ElseIf h(j) = 3 Then
                    xEquipe(j).Motor = xMotor(7).nome
                    xEquipe(j).finanças = xEquipe(j).finanças - xMotor(7).custo
                    nMotor(j) = 7
                End If[/code]

não??

otra coisa... porque os caras são obrigados a comprar otro motor quando acaba a temporada?? se o cara já tem um motor ele pode usa-lo, não pode?? e se eu já tenho o melhor motor, pra q eu vou comprar outro??

alem do mais... você já pensou no q vai fazer se a equipe não tiver dinhero pra comprar nenhum motor??

Link para o comentário
Compartilhar em outros sites

  • 0
aqui, você tem q fechar o if:

If (nMotor(j) + 1) > 7 Then
                h(j) = 3
            ElseIf (nMotor(j) + b) = nMotor(j) Then
                h(j) = 3
            ElseIf (nMotor(j) - c) = nMotor(j) Then
                h(j) = 2
            ElseIf (nMotor(j) - 1) < 0 Then
                h(j) = 2
            End If
porque aqui é onde você seta o h(). embaixo é onde você testa o h(), não é pra testar no mesmo If, é um If separado.
Não entendi bem no que isso influencía. Não ta correndo como devia?
otra coisa, la embaxo você fez:
ElseIf h(j) = 3 Then
                    xEquipe(j).Motor = xMotor(7).nome
                    xEquipe(j).finanças = xMotor(7).custo
                    nMotor(j) = 7
                End If
acho q o certo seria:
ElseIf h(j) = 3 Then
                    xEquipe(j).Motor = xMotor(7).nome
                    xEquipe(j).finanças = xEquipe(j).finanças - xMotor(7).custo
                    nMotor(j) = 7
                End If

não??

Nossa, que estupidez a minha.

Nem percebi.

otra coisa... porque os caras são obrigados a comprar otro motor quando acaba a temporada?? se o cara já tem um motor ele pode usa-lo, não pode?? e se eu já tenho o melhor motor, pra q eu vou comprar outro??

alem do mais... você já pensou no q vai fazer se a equipe não tiver dinhero pra comprar nenhum motor??

Bem, eu obrigo as equipes a comprar motor para dificultar um pouco o jogo.

Caso contrário, a tendência é que depois de muito tempo, todas as equipes teriam todas as melhores peças.

E também por que é uma espécie de contrato.

Você não compra o motor, você faz um contrato com a fornecedora, que te fornece os motores necessários para uma temporada apenas, e depois você pode contratar um motor melhor ou contratar o mesmo.

O difícil mesmo é fazer que as equipes pensem inteligentemente, como por exemplo fazê-las reconhecer quando é a melhor hora para contratar, quando é necessário economizar, etc. Isso é muito difícil, e já foi uma luta pra conseguir fazer isso aí.

E se uma equipe não tiver dinheiro para comprar nenhum motor, sinceramente, eu não sei o que fazer.

Eu fiz com que se uma equipe não tenha dinheiro para contratar o segundo pior motor, ela contrata o pior a qualquer custo.

No caso, se suas finanças forem menor que o custo do pior motor, ficariam com dinheiro negativo.

Mas eu não fiz isso por opção, fiz por que não sei fazer melhor.

EDIT:

Deu certo.

Valeu ai!

EDIT2:

Se bem que eu acho que minha lógica não deu muito certo.

Por algum motivo, a Ferrari, por exemplo, as vezes compra o pior pneu, mesmo tendo dinheiro de sobra para comprar o melhor.

E as equipes com pouco dinheiro as vezes não compram nenhum motor, e com isso, não gastam dinheiro.

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0

ou pra facilitar você podia fazer uma sub q comprasse o motor por exemplo, só passando como parametro o numero da equipe e o motor.

o peneu tem aquele mesmo problema do If q tinha no motor, você já arrumou?? e esse problema continua??

quanto ao problema da equipe não comprar o motor, isso não aconteceu aqui pra mim, mas acho q isso acontece quando for pra equipe comprar o pior motor. olha:

If h(j) = 1 Then
                                        ...
                                        ...
                                        If (nMotor(j) - 6) < 0 Then
                                            h(j) = 0
                                        ElseIf xEquipe(j).finanças > xMotor(nMotor(j) - 6).custo Then
                                            xEquipe(j).Motor = xMotor(nMotor(j) - 6).nome
                                            xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 6).custo
                                            nMotor(j) = nMotor(j) - 6
                                        Else
                                            h(j) = 2 ' <-- ESSE DAQUI!!!
                                        End If
                                        ...
                                        ...
            ElseIf h(j) = 2 Then
                xEquipe(j).Motor = xMotor(0).nome
                xEquipe(j).finanças = xEquipe(j).finanças - xMotor(0).custo
                nMotor(j) = 0
            ElseIf h(j) = 3 Then
                xEquipe(j).Motor = xMotor(7).nome
                xEquipe(j).finanças = xMotor(7).custo
                nMotor(j) = 7
            End If[/code] você passa o valor 2 pro h, acredito q na intencao de ele ir pro ElseIf h(j) = 2 Then. mas na verdade, se ele entrou no primeiro if, ele vai ignorar esse elseif não importa o q aconteca dentro dele. por isso, em vez de por h(j) = 2, copia o q ta no elseif e cola la. outra coisa:
[code]c = nMotor(j) - 0

pra q serve esse - 0??

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.




  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...