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

Cara, você ainda tem o projeto que eu te passei?

Se tiver, da uma olhada pra mim, por favor, em um problema que estou tendo.

Você vai notar que no MenuEquipe, quando roda o programa, aparece o nome e a potência do motor, do pneu, do chassi, etc, da equipe que você escolheu.

Mas eu só fui perceber agora que depois de uma corrida, esses valores estão mudando.

Por exemplo: se eu escolho a equipe McLaren, o motor no início aparece Mercedes, que é o correto, mas logo após uma corrida, ele muda para o motor de alguma outra equipe, como o Toyota.

Se no projeto que eu te passei não tem isso, é por que eu ainda não tinha feito quando te passei, ai é só me avisar.

Mas de qualquer jeito, aí vai o código:

No Form NovoJogo, que é onde se escolhe a equipe

Private Sub optMcLaren_Click()
m = 0
End Sub

Private Sub optFerrari_Click()
m = 1
End Sub

Private Sub optBMW_Click()
m = 2
End Sub

Private Sub optRenault_Click()
m = 3
End Sub

Private Sub optWilliams_Click()
m = 4
End Sub

Private Sub optRedBull_Click()
m = 5
End Sub

Private Sub optToyota_Click()
m = 6
End Sub

Private Sub optHonda_Click()
m = 7
End Sub

Private Sub optToroRosso_Click()
m = 8
End Sub

Private Sub optSuperAguri_Click()
m = 9
End Sub

Private Sub optSpyker_Click()
m = 10
E no Form MenuEquipe, onde acontece o problema
Dim i(4) As Integer

lblNome.Caption = xJogador.nome
lblIdade.Caption = xJogador.idade
lblNacionalidade.Caption = xJogador.nacionalidade

For i(0) = 0 To 7
    If xEquipe(m).Motor = xMotor(i(0)).nome Then
        lblMotor.Caption = xEquipe(m).Motor & " - " & xMotor(i(0)).potencia
    End If
Next
For i(1) = 0 To 2
    If xEquipe(m).Pneu = xPneu(i(1)).nome Then
        lblPneu.Caption = xEquipe(m).Pneu & " - " & xPneu(i(1)).força
    End If
Next
For i(2) = 0 To 4
    If xEquipe(m).Combustível = xCombustível(i(2)).nome Then
        lblCombustível.Caption = xEquipe(m).Combustível & " - " & xCombustível(i(2)).força
    End If
Next
For i(3) = 0 To 21
    If xEquipe(m).piloto(0) = xPiloto(i(3)).nome Then
        lblPiloto1.Caption = xEquipe(m).piloto(0)
    End If
Next
For i(4) = 0 To 21
    If xEquipe(m).piloto(1) = xPiloto(i(4)).nome Then
        lblPiloto2.Caption = xEquipe(m).piloto(1)
    End If
Next

lblChassi.Caption = "Nível: " & xEquipe(m).chassi
lblMecânicos.Caption = "Nível: " & xEquipe(m).mecânicos

Valeu.

Link para o comentário
Compartilhar em outros sites

  • 0

hum, é que você ordena as equipes pela pontuacao, certo?? ai a ordem delas muda, e se o cara selecionar a equipe 2, por exemplo, e ela estiver em primeiro lugar, ela passa a ser a 0.

então você tem varias opcoes:

- em vez de guardar o numero da equipe, guarde o nome na variavel m

- na hora de ordenar a equipe, crie um outro array somente pra ordenacao e copie o conteudo do primeiro pra esse segundo. e ordene o segundo, assim o primeiro sempre vai ter a mesma ordem.

- na hora de ordenar, quando a equipe que ele escolher trocar de lugar, troque junto o valor de m

Link para o comentário
Compartilhar em outros sites

  • 0
Mas cada vez mais eu acho que os códigos estão ficando mais desorganizados.

cara num esquece que esse é o primero programa que você faz. a desorganizacao acontece porque você comeca a fazer uma coisa sem saber o que vai ter que fazer pra frente. ai quando você ve tem que alterar um negocio feito la atras e comeca a ficar zuado mesmo.

mas o esquema é continuar ate compreender certinho o que vai ser usado no programa no geral. ai depois, se você achar necessario você pode dar uma revisada geral no codigo desde o comeco.

mas o esquema pra deixar o codigo organizado é sempre saber direitinho o que faz cada coisa e, principalmente, entnder tdo o que se esta fazendo. você so vai conseguir dexar o codigo organizado se tiver consciencia e controle total de td que se esta fazendo.

Link para o comentário
Compartilhar em outros sites

  • 0

Hmm..

E além de tudo, acho que eu pulei muitas etapas haha.

Já até fiquei de ler um livro de algoritmos e lógica de programação, mas acabei não lendo.

E de repente meu amigo me chamou pra fazer um jogo em Visual Basic.

Mas de qualquer forma... ta indo pra frente.

Bem, agora voltando.

Tem como em um único label ordenar os 22 pilotos, "guardar" os 6 últimos, e depois ordenar apenas os 16 que restaram?

Link para o comentário
Compartilhar em outros sites

  • 0

A qualificação de F1 funciona assim.

Cada um dos 22 pilotos faz a sua volta, os 16 melhores tempos passam pra a próxima fase.

Esses 16 fazem mais uma volta, e desses, 10 passam para a fase final, que funciona do mesmo jeito.

Na fase final é decidido quem faz a pole position.

Agora, se eu mudar na função para 16, aí muda tudo.

Eu não quero mudar tudo, quero apenas fazer com que, dos 22 pilotos, apenas 16 passem para a próxima fase, e desses 16, apenas 10 passem para a fase final.

Entendeu?

Link para o comentário
Compartilhar em outros sites

  • 0

O que eu tentei fazer agora foi o seguinte:

Option Explicit
Dim tempo As Variant
Dim j As Integer

Private Sub Command1_Click()
Dim i As Integer

    For i = 0 To 21
        xPiloto(i).ai = Int(xPiloto(i).chance * Rnd) + 1
    Next
     
    Colocação xPiloto(), 21
    
    Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
    For j = 15 To 21
        xPiloto(j).ai = 0
    Next
    
    Timer2.Enabled = True
End Sub

Private Sub Timer1_Timer()
    tempo = tempo + 1
    Me.Controls("lbl" & 22 - (tempo - 1)).Caption = xPiloto(tempo - 1).nome
    If tempo = 22 Then
            Timer1.Enabled = False
            tempo = 0
    End If
End Sub

Private Sub Timer2_Timer()
    tempo = tempo + 1
    Me.Controls("lbl" & 16 - (tempo - 1)).Caption = xPiloto(tempo - 1).nome
    If tempo = 16 Then
            Timer2.Enabled = False
            tempo = 0
    End If
End Sub

Mas não deu certo

Link para o comentário
Compartilhar em outros sites

  • 0

Tudo! hahahahaha

Bem.... ta ordenando os 22 pilotos, e depois ordena denovo, apenas do 16° label pra frente.

Só que ta ordenando com os mesmos pilotos, e na mesma ordem.

Por exemplo:

No Command1_Click, ele ordena os 22 pilotos, bunitinho, e aparece la:

22°: Piloto1

21° Piloto2

20° Piloto3

.....

1° Piloto22

Aí depois, no Command2_Click, ele ordena, só que os pilotos 1, 2 e 3 é que são os primeiros a aparecer do label16 pra frente?

Deu pra entender? hauhahaha

Minha explicação ficou confusa pra caramba, mas é o que dá pra fazer.

Só um detalhe, eu fiz algumas mudanças, e ficou mais próximo do que quero.

Agora tá assim:

Option Explicit
Dim tempo As Variant
Dim j As Integer
Dim i As Integer

Private Sub Command1_Click()

    Randomize

    For i = 0 To 21
        xPiloto(i).ai = Int(xPiloto(i).força * Rnd) + 1
    Next
     
    Colocação xPiloto(), 21
    
    Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
    For j = 7 To 21
        xPiloto(j).força = 0
    Next

    For i = 0 To 6
        xPiloto(i).ai = Int(xPiloto(i).força * Rnd) + 1
    Next

    Timer2.Enabled = True
End Sub

Private Sub Timer1_Timer()
    tempo = tempo + 1
    Me.Controls("lbl" & 22 - (tempo - 1)).Caption = xPiloto(tempo - 1).nome
    If tempo = 22 Then
            Timer1.Enabled = False
            tempo = 0
    End If
End Sub

Private Sub Timer2_Timer()
    tempo = tempo + 1
    Me.Controls("lbl" & 16 - (tempo - 1)).Caption = xPiloto(tempo - 1).nome
    If tempo = 16 Then
            Timer2.Enabled = False
            tempo = 0
    End If
End Sub

Mas ainda dá o mesmo erro.

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

  • 0
Tudo! hahahahaha

Bem.... ta ordenando os 22 pilotos, e depois ordena denovo, apenas do 16° label pra frente.

Só que ta ordenando com os mesmos pilotos, e na mesma ordem.

depois de zerar o ia dos ultimos, você tem atribuir um novo valor pro ia dos que vao correr e, o mais importante de tudo, chamar a sub colocacao de novo.

Aí depois, no Command2_Click, ele ordena, só que os pilotos 1, 2 e 3 é que são os primeiros a aparecer do label16 pra frente?

pra mostrar tenta assim:

Me.Controls("lbl" & 16 - (tempo - 1)).Caption = xPiloto(tempo + 5).nome

Link para o comentário
Compartilhar em outros sites

  • 0

Deu certo, valeu.

EDIT:

Se bem que eu só reparei agora, mas alguns nomes ainda se repetem no evento click do Command2.

O código ficou assim:

Option Explicit
Dim tempo As Variant
Dim j As Integer
Dim i As Integer

Private Sub Command1_Click()

    Randomize

    For i = 0 To 21
        xPiloto(i).ai = Int(xPiloto(i).força * Rnd) + 1
    Next
     
    Colocação xPiloto(), 21
    
    Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
    For j = 7 To 21
        xPiloto(j).força = 0
    Next

    For i = 0 To 6
        xPiloto(i).ai = Int(xPiloto(i).força * Rnd) + 1
    Next

    Colocação xPiloto(), 21
    
    Timer2.Enabled = True
End Sub

Private Sub Timer1_Timer()
    tempo = tempo + 1
    Me.Controls("lbl" & 22 - (tempo - 1)).Caption = xPiloto(tempo - 1).nome
    If tempo = 22 Then
            Timer1.Enabled = False
            tempo = 0
    End If
End Sub

Private Sub Timer2_Timer()
    tempo = tempo + 1
    Me.Controls("lbl" & 16 - (tempo - 1)).Caption = xPiloto(tempo + 5).nome
    If tempo = 16 Then
            Timer2.Enabled = False
            tempo = 0
    End If
End Sub

Link para o comentário
Compartilhar em outros sites

  • 0

Mudei o código.

Ainda tá dando o mesmo erro, mas o que está agora é só pra representar como funcionaria o sistema de qualificação de F1, com a fase final também.

Option Explicit
Dim tempo As Variant
Dim j As Integer
Dim i As Integer
Dim h As Integer

Private Sub Command1_Click()

    Randomize

    For i = 0 To 21
        xPiloto(i).ai = Int(xPiloto(i).força * Rnd) + 1
    Next
     
    Colocação xPiloto(), 21
    
    Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
    For j = 0 To 5
        xPiloto(j).força = 0
    Next

    For i = 6 To 21
        xPiloto(i).ai = Int(xPiloto(i).força * Rnd) + 1
    Next
    
    For h = 1 To 16
        Me.Controls("lbl" & h).Caption = ""
    Next

    Colocação xPiloto(), 15
    
    Timer2.Enabled = True
End Sub

Private Sub Command3_Click()
    For j = 7 To 11
        xPiloto(j).força = 0
    Next

    For i = 12 To 21
        xPiloto(i).ai = Int(xPiloto(i).força * Rnd) + 1
    Next
    
    For h = 1 To 10
        Me.Controls("lbl" & h).Caption = ""
    Next

    Colocação xPiloto(), 9
    
    Timer3.Enabled = True
End Sub

Private Sub Timer1_Timer()
    tempo = tempo + 1
    Me.Controls("lbl" & 22 - (tempo - 1)).Caption = xPiloto(tempo - 1).nome
    If tempo = 22 Then
            Timer1.Enabled = False
            tempo = 0
    End If
End Sub

Private Sub Timer2_Timer()
    tempo = tempo + 1
    Me.Controls("lbl" & 16 - (tempo - 1)).Caption = xPiloto(tempo + 5).nome
    If tempo = 16 Then
            Timer2.Enabled = False
            tempo = 0
    End If
End Sub

Private Sub Timer3_Timer()
    tempo = tempo + 1
    Me.Controls("lbl" & 10 - (tempo - 1)).Caption = xPiloto(tempo + 5).nome
    If tempo = 10 Then
            Timer3.Enabled = False
            tempo = 0
    End If
End Sub

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

  • 0

OK, vou mandar agora

Só upar no RapidShare

EDIT:

Mandei no seu MP.

Só um detalhe, como eu estou apenas testando ainda, não apliquei a qualificação no resto do jogo.

Então é só rodar o programa, e no MenuEquipe apertar "Qualificação", ignorando o resto do jogo.

E no form da qualificação é só apertar primeiro o Command1 e depois que todos os pilotos forem ordenados, apertar o Command2 para ordenar denovo, dessa vez apenas do 16° label pra frente.

EDIT2:

Ah! Normalmente apenas 1 ou 2 pilotos são repetidos na segunda vez que ordena.

É até um pouco difícil de notar, portanto, é só olhar com um pouco de atenção.

Link para o comentário
Compartilhar em outros sites

  • 0

a ta, olha que você ta fazendo ao contrario:

For j = 7 To 21
        xPiloto(j).força = 0
    Next

    For i = 0 To 6
        xPiloto(i).ai = Int(xPiloto(i).força * Rnd) + 1
    Next[/code] num esquece que o primeiro colocado é o numero 21, o segundo é o 20 e etc. você ta zerando a forca dos 15 primeiros colocados e quem esta correndo na verdade são os 7 ultimos. acho que o que você quer seria isso:
[code]For j = 0 To 5
        xPiloto(j).força = 0
    Next

    For i = 6 To 21
        xPiloto(i).ai = Int(xPiloto(i).força * Rnd) + 1
    Next

Link para o comentário
Compartilhar em outros sites

  • 0

a é, eu tinha esquecido, você zerou a forca mas não zerou o ia. por você ter zerado a forca, o ia, se calculado, vai ser 1 (que também serve), mas você nem chega a calcular pros 6 ultimos. ou você faz assim:

For i = 0 To 21
        xPiloto(i).ai = Int(xPiloto(i).força * Rnd) + 1
    Next[/code] ou você faz assim:
[code]For j = 7 To 21
        xPiloto(j).força = 0
        xPiloto(j).ai = 0
    Next

Link para o comentário
Compartilhar em outros sites

  • 0

Não entendi por que do 7 ao 21.

Eu tenho que zerar a AI dos pilotos que não vão participar da segunda etapa, certo?

Então eu não teria que colocar:

For j = 0 To 5
        xPiloto(j).força = 0
        xPiloto(j).ai = 0
Next

?

EDIT:

É, fiz isso agora e parece que deu certo.

A não ser que eu não tenha notado algum nome repetido.

Valeu

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

  • 0

Olha só, to com um problema.

Se, por exemplo, os pilotos da EquipeX chegaram em 12° e 14°, e os pilotos da EquipeY chegaram em 16° e 18°, nenhum dos quatro pontuaram, certo?

Ou seja, nenhuma das duas equipes pontuou nessa determinada corrida.

Mas teoricamente, é para a EquipeX aparecer na frente da EquipeY no Form que mostra a pontuação de cada equipe na última corrida, já que seus pilotos chegaram na frente dos pilotos da outra equipe.

Mas no programa, até agora, nesse mesmo form, as equipes que não pontuaram na última corrida, ou fizeram a mesma pontuação, são ordenados sem essa razão, ou seja, a equipe que merecia aparecer na frente da outra, mesmo que ambas não tenham pontuado, não aparece.

Como eu faço pra corrigir isso?

Link para o comentário
Compartilhar em outros sites

  • 0

cria um campo novo no type equipe pra guardar a colocacao na ultima corrida. ai você guarda a colocacao do melhor piloto dela (se é esse o critério pra classificacao na f1) e usa como criterio de desempate. ai o esquema é você criar uma nova variacao daquela funcao de ordenacao. a atual recebe o tamanho maximo, certo?? faca uma que receba também o tamanho inicial e ordene pela classificacao. ai você faz um for pra ler as equipes e vai contando qtas tem pontuacao igual (levando em conta que vai estar ordenado por pontuacao). ai você passa pra essa nova funcao o indice inicial e o final.

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,1k
    • Posts
      651,9k
×
×
  • Criar Novo...