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

Valeu cara, deu certinho.

Eu tava querendo agora que o BackColor de cada Label do Form Corrida ficasse com a cor das equipes de cada um dos pilotos.

Portanto eu fiz:

For i = 0 To 21
    For j = 0 To 10
        For g = 1 To 22
            If ("lbl" & g).Caption = xPiloto(i).nome Then
                If xPiloto(i).equipe = xEquipe(j).nome Then
                    Me.Controls("lbl" & g).BackColor = xEquipe(j).Cor1
                End If
            End If
        Next
    Next
Next
Mas como você já deve ter percebido, dá um erro devido ao trecho:
("lbl" & g).Caption

Se não da pra fazer dessa maneira, existe alguma outro jeito de fazer?

Link para o comentário
Compartilhar em outros sites

  • 0

tenta assim:

For i = 0 To 21
        For g = 1 To 22
        If Me.Controls("lbl" & g).Caption = xPiloto(i).nome Then
            For j = 0 To 10
                If xPiloto(i).equipe = xEquipe(j).nome Then
                    Me.Controls("lbl" & g).BackColor = xEquipe(j).Cor1
                End If
            Next
        End If
    Next
Next[/code]

Link para o comentário
Compartilhar em outros sites

  • 0

Não deu certo.

Vou postar os códigos, do jeito que estão, para que você possa analisar melhor.

Form Corrida:

Private Sub Timer1_Timer()
For i = 0 To 21
    xPiloto(i).ai = xPiloto(i).ai + Int(xPiloto(i).chance * Rnd) + 1
Next
Colocação xPiloto(), 21
tempo = tempo + 1
For i = 1 To 22
    Me.Controls("lbl" & 22 - (i - 1)).Caption = xPiloto(i - 1).nome & " - " & xPiloto(i - 1).ai
Next

For i = 0 To 21
    For g = 1 To 22
        If Me.Controls("lbl" & g).Caption = xPiloto(i).nome Then
            For j = 0 To 10
                If xPiloto(i).equipe = xEquipe(j).nome Then
                    Me.Controls("lbl" & g).BackColor = xEquipe(j).Cor1
                End If
            Next
        End If
    Next
Next

lblVoltas.Caption = "Volta: " & tempo
If tempo = 70 Then
    Timer1.Enabled = False
End If
End Sub
Module1, dentro do type Equipe:
Cor1 As Variant
Module1, dentro do Private Sub Main:
xEquipe(0).Cor1 = &H0&

para cada equipe uma cor diferente.

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

  • 0

Ok, vou tentar.

Não está dando erro, as labels simplesmente não mudam de cor.

EDIT:

O programa 'lê' até:

For i = 0 To 21
    For g = 1 To 22
        If Me.Controls("lbl" & g).Caption = xPiloto(i).nome Then
E depois disso ele pula o seguinte trecho:
For j = 0 To 10
                If xPiloto(i).equipe = xEquipe(j).nome Then
                    Me.Controls("lbl" & g).BackColor = xEquipe(j).Cor1
                End If
            Next
direto para:
End If
    Next
Next

Ficou confuso?

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

  • 0

não ficou, mas então, ele vai ate o Next mas depois ele vai voltar, se você tivesse continuado você ia ver. porque o q acontece?? ele comparou o label com o nome do piloto mas eles não bateram. então ele não entrou no If. mas o for continua, entendeu?? ele comparou o primeiro label com o primeiro piloto, e agora ele vai comparar o segundo label com primeiro piloto, depois o terceiro ate comprara todos os labels com todos os pilotos.

então tipo, uma hora o primeiro label tem q bater com algum piloto, certo?? então fica de olho. lembra q eu falei q da pra você ver os valores?? tipo, para o mouse em cima de xPiloto(i).nome q ele vai mostrar o nome do piloto do atual indice i. a mesma coisa pro Me.Controls("lbl" & g).Caption. e se ele não mostrar quando você parar o mouse, digita do Immediate Window (Ctrl + G) ? Me.Controls("lbl" & g).Caption por exemplo, q ele mostra. então fica de olho a cada passagem q uma hora vai ter q bater o piloto do label com o do xPiloto. ai nessa hora ele deve entrar no if ai você ve o q acontece. ai se ele não entrar no if, tem q tentar descobrir porque isso acontece.

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, eu fiz isso agora, e o que aconteceu foi o seguinte:

Em todos os casos, o valor de xPiloto(i).nome deram igual a "Button"

Na primeira vez, o valor de xEquipe(j).nome deu igual a "Honda", e no restante deu <Subscript out of range>.

A única coisa que variou em cada tentativa foi o valor de g, crescentemente.

E em todas as vezes aquele mesmo for foi pulado.

Link para o comentário
Compartilhar em outros sites

  • 0

então. ve se você entende. ele entro no primeiro For q é o do i onde ele vai checar todos os xPiloto. ele ainda ta no i = 0. ele chega no segundo For q é o g, q vai checar todos os labels. você entende q ele tem q passar por todos os gs do 1 ao 22 pra poder chegar no i = 1?? ai quando o i tiver 1, ele vai passar pelo g de novo do 1 ao 22 e ai vai pro i = 2 e assim vai.

então, o q acontece? ele entrou no i = 0. o primeiro i é o do Button (isso la é nome de gente?? quando você falou achei q era algum pau fudido do programa, tive q abrir la pra conferir q era o nome do cara haaha). então ele vai comparar todos os labels com o i = 0 pra ver se ele encontra o Button. agora, se todos os labels estao preenchidos com o os nomes de todos os pilotos, então um dos labels ta preenchido com Button, certo?? ele vai percorrer do 1 ao 22 pra encontrar qual é o Button. quando isso acontecer, ele TEM q entrar no If.

entendeu?? então, você tem q esperar ele percorrer os 22 labels pra achar qual é o Button

ta, peraí, esquece isso, vo parar a explicacao no meio, q to vendo otra coisa:

For i = 1 To 22
    Me.Controls("lbl" & 22 - (i - 1)).Caption = xPiloto(i - 1).nome & " - " & xPiloto(i - 1).ai
Next[/code] nesse codigo você ta preenchendo os labels de acordo com o xpiloto certo?? ou seja, você sabe q o piloto 0 ta no label 22 e q o piloto 1 ta no labela 21 e assim por diante. então você não precisaria daqueles dos Fors de cima. e alias, porque você não pode mudar a cor aqui mesmo dentro desse for onde você ta preenchendo os labels?? ficaria tipo assim:
[code]For i = 1 To 22
    Me.Controls("lbl" & 22 - (i - 1)).Caption = xPiloto(i - 1).nome & " - " & xPiloto(i - 1).ai

    For j = 0 To 10
        If xPiloto(i).equipe = xEquipe(j).nome Then
            Me.Controls("lbl" & 22 - (i - 1)).BackColor = xEquipe(j).Cor1
        End If
    Next
Next

nesse caso, se isso funcionar pra você, pode esquecer todo aqueles Fors q você tava fazendo. mas mesmo assim da uma lida na explicacao q eu te dei q se você conseguir fazer esse tipo de debug no seus programas daqui pra frente ce num tem ideia de como as coisa vao ficar mais facil pra você.

mano... ce num sabe o q aconteceu agora, ce num vai acreidtar...

o FireFox salvou sua vida!! a luz acabou quando eu tava na ultima linha, mas o FireFox gravou tdo aqui, nem acreditei.

mano ce tem uma soooooorte, eu num tava cum vontade digitar tudo isso de novo não ahhahaha

mano quase chorei quando a luz acabou hahaha mo explicacao bunita q eu tava dando, eu tava ate emocionado, essa b*** de luz acaba hahaha

mano nem acredito q tava tudo aqui quando o pc ligou de novo hahah o FireFox é fodaaa

Link para o comentário
Compartilhar em outros sites

  • 0
(isso la é nome de gente?? quando você falou achei q era algum pau fudido do programa, tive q abrir la pra conferir q era o nome do cara haaha)
huahuahauhauhauhauahuahahaua

Cara, eu entendi sim.

Eu fiz isso que você falou, desde a primeira vez.

o xPiloto(j).nome tava igual a "Button", eu percorri com o F8 todos os 22 labels, e mesmo assim tava pulando o For. Aí depois disso o valor da Label (acho que é i né?) zerava, e o xPiloto(j).nome mudava para outro piloto qualquer.

Mas bem, deu certo aqui com a sua outra explicação.

Valeu cara.

mano... ce num sabe o q aconteceu agora, ce num vai acreidtar...

o FireFox salvou sua vida!! a luz acabou quando eu tava na ultima linha, mas o FireFox gravou tdo aqui, nem acreditei.

mano ce tem uma soooooorte, eu num tava cum vontade digitar tudo isso de novo não ahhahaha

mano quase chorei quando a luz acabou hahaha mo explicacao bunita q eu tava dando, eu tava ate emocionado, essa b*** de luz acaba hahaha

mano nem acredito q tava tudo aqui quando o pc ligou de novo hahah o FireFox é fodaaa

huahuahauahuahauahau

sorte mesmo

Também uso Firefox, muito melhor que IE.

Mais uma vez, valeu mesmo cara.

EDIT:

Lembra aquele erro que dava antigamente, que as vezes uma equipe qualquer aparecia em último no Form PontosEquipeCorrida, injustamente?

Tipo: os pilotos da EquipeX chegam em 10° e 11°, e os da EquipeY chegam em 17° e 18°.

Nenhuma das equipes pontuou, mas no Form citado acima, a EquipeX aparece atrás da EquipeY.

Deu pra sacar?

Bem, eu tinha corrigido esse erro, e tinha certeza que não precisava mais me preocupar com isso. Bem, até hoje, quando vi que, a Spyker, que chega com os dois pilotos praticamente sempre em último, está ficando no final das contas, à frente de outras equipes.

Lembrando que isso só é um problema por que a posição final de cada equipe define a quantia de dinheiro que vão ganhar.

Eu posso te passar o projeto pelo MP?

EDIT:

Se bem que eu tava vendo agora, e não somente isso que eu te falei está dando errado, como todo o sistema de pontuação está.

Nossa, como assim?

Isso aconteceu de repente.

A pontuação das equipes está sendo distribuida completamente errada.

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

  • 0

então, quanto ao negocio do For, o q acontece, ele não mudou o piloto de nome depois de ler os 22 labels, e sim mudou pro proximo piloto. a variavel q tava em 0 foi pra 1. mas tipo, era pra você ficar de olho nos nomes q tinha no label. tipo você sabia q o xPiloto era o Button. em um dos labels tava escrito Button, certo (q era o ultimo, o 22)?? quando chegasse no Button, ele deveria entrar no For. então você tinha q ver, existe uma hora q ele faz If "Button" = "Button". se existir, ele tem q entrar no For. se não entra no For, é porque não apareceu Button no label. então você devia ficar de olho, o q ele faz na hora q devia aparecer Button??

bom... eu queria q você mesmo tivesse descoberto sem eu precisar explicar (e tb porque so percebi agora), mas se você tivesse olhado, você ia ver q os labels tavam com a pontuacao junto. exemplo, se o caption do label era "Button - 15", signfica q "Button - 15" nunca vai ser igual a "Button". então ele nunca vai entrar no For.

entendeu porque é importante saber debugar o programa?? se você tivesse digitado no Immediate ? Me.Controls("lbl" & g).Caption, você ia ver a pontuacao e o problema tava localizado.

manda la o projeto sim, amanha eu do uma olhada, beleza??

Link para o comentário
Compartilhar em outros sites

  • 0

Hmm.. entendi, valeu cara.

Pô, não pude mandar o projeto ontem (hoje de madrugada).

Como eu disse antes, tenho que acordar cedo todo dia, e portanto, não posso mais ficar enrolando até muito tarde, como fiz nas férias.

Vou tentar sair todos os dias no máximo 12:00.

Mas tudo ok, vou mandar agora, e você analisa quando puder, sem pressa.

Link para o comentário
Compartilhar em outros sites

  • 0
Opa! E ai cara, bom?

Você chegou a receber projeto por MP?

É que eu fiquei sem saber se você recebeu ou não, por que quando eu te passei tava dando alguns erros no fórum e tal, aí eu pensei que talvez não tivesse chegado aí.

opa recebi sim. mas é q aqui ta foda pra eu ver. to dando uma descansada do forum (e de otras coisas tb). explicacoes aqui: http://scriptbrasil.com.br/forum/index.php?showtopic=107122

aqui ta foda, quase morro pra ir na escola. mas ta passando, aguenta um poco q logo eu vejo la.

mas otras duvidas e problemas q você for tendo, pode ir postando ai (talvez melhor em novos topicos) q ai a mulecada vai ajudando como puderem.

Link para o comentário
Compartilhar em outros sites

  • 0

o q aconteceu é q eu to doente da cabeca, só isso.

mas eu tava vendo aqui, o q acontece é q você soma os pontos antes da corrida comecar. tipo, você pos pra somar no click do OK, e so depois de somar você habilita o timer. tipo, logo apos o clique você define o ai de cada piloto, ordena o vetor, soma os pontos e ai você habilita o timer q ordena de novo pra cada volta. e assim q o timer para a corrida simplesmente acaba e os pontos não são somados.

você ta somando os pontos pela colocacao inicial da primera volta. por isso se a corrida acabar com uma classificacao diferente da primera volta (e provavelmente vai acabar) a pontuacao não vai bater com a colocacao.

você devia somar os pontos só depois q o tempo chegar em 70.

e uma dica, uma coisa q enche um poco o saco pra mexer no seu programa é q os forms não aparecem na barra do windows. ai se eu ponho o foco em otra janela, eu não consigo encontrar o seu programa com o mouse, tenho q usar o Alt + TAB ou minimizar todas as janelas q tiverem na frente.

não sei se por algum motivo, você fez isso de proposito, mas se quiser corrigir é so mudar a propriedade ShowInTaskBar de cada Form pra True.

Link para o comentário
Compartilhar em outros sites

  • 0
mas eu tava vendo aqui, o q acontece é q você soma os pontos antes da corrida comecar. tipo, você pos pra somar no click do OK, e so depois de somar você habilita o timer. tipo, logo apos o clique você define o ai de cada piloto, ordena o vetor, soma os pontos e ai você habilita o timer q ordena de novo pra cada volta. e assim q o timer para a corrida simplesmente acaba e os pontos não são somados.

você ta somando os pontos pela colocacao inicial da primera volta. por isso se a corrida acabar com uma classificacao diferente da primera volta (e provavelmente vai acabar) a pontuacao não vai bater com a colocacao.

você devia somar os pontos só depois q o tempo chegar em 70.

Aff... o pior é que eu tinha feito isso antes, mas não esperei chegar na 70° volta pra conferir.

Agora deu certo, valeu.

e uma dica, uma coisa q enche um poco o saco pra mexer no seu programa é q os forms não aparecem na barra do windows. ai se eu ponho o foco em otra janela, eu não consigo encontrar o seu programa com o mouse, tenho q usar o Alt + TAB ou minimizar todas as janelas q tiverem na frente.

não sei se por algum motivo, você fez isso de proposito, mas se quiser corrigir é so mudar a propriedade ShowInTaskBar de cada Form pra True.

Hmm.... com certeza, de propósito eu não fiz isso.

Eu já havia notado que isso acontecia, mas achava que era normal, sei lá.

Vou corrigir isso aqui também.

o q aconteceu é q eu to doente da cabeca, só isso.

Bem... melhoras pra você cara.

Se cuida.

E não se preocupa em responder às minhas dúvidas, não me importo.

Valeu.

EDIT:

Vou deixar aqui minha dúvida, mas não precisa responder agora.

É mais uma vez sobre a questão dos contratos das equipes controladas pelo CPU.

Há um tempo eu dei uma "limpada" naquele código, vê se parece mais coerente pra você agora:


For j = 0 To UBound(xEquipe)
If xEquipe(j).nome = xJogador.equipe Then
h(j) = 0
ElseIf xEquipe(j).nome <> xJogador.equipe Then
b = 7 - nMotor(j)
If (nMotor(j)) = 7 Then
If xEquipe(j).finanças >= xMotor(7).custo Then
xEquipe(j).Motor = xMotor(7).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(7).custo
nMotor(j) = 7
h(j) = 0
Else
h(j) = 1
End If
ElseIf (nMotor(j)) = 0 Then
If xEquipe(j).finanças > xMotor(0).custo Then
h(j) = 1
Else
xEquipe(j).Motor = xMotor(0).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(0).custo
nMotor(j) = 0
h(j) = 0
End If
End If
If xEquipe(j).finanças > 0 Then
If h(j) = 1 Then
If xEquipe(j).finanças > xMotor(nMotor(j)).custo Then
a = Int(b * Rnd) + 1
If xEquipe(j).finanças >= xMotor(nMotor(j) + a).custo Then
xEquipe(j).Motor = xMotor(nMotor(j) + a).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) + a).custo
nMotor(j) = nMotor(j) + a
Else
xEquipe(j).Motor = xMotor(nMotor(j)).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j)).custo
nMotor(j) = nMotor(j)
End If
ElseIf xEquipe(j).finanças < xMotor(nMotor(j)).custo Then
If 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
Else
If (nMotor(j) - 2) < 0 Then
h(j) = 0
ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - 2).custo Then
xEquipe(j).Motor = xMotor(nMotor(j) - 2).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 2).custo
nMotor(j) = nMotor(j) - 2
Else
If (nMotor(j) - 3) < 0 Then
h(j) = 0
ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - 3).custo Then
xEquipe(j).Motor = xMotor(nMotor(j) - 3).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 3).custo
nMotor(j) = nMotor(j) - 3
Else
If (nMotor(j) - 4) < 0 Then
h(j) = 0
ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - 4).custo Then
xEquipe(j).Motor = xMotor(nMotor(j) - 4).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 4).custo
nMotor(j) = nMotor(j) - 4
Else
If (nMotor(j) - 5) < 0 Then
h(j) = 0
ElseIf xEquipe(j).finanças >= xMotor(nMotor(j) - 5).custo Then
xEquipe(j).Motor = xMotor(nMotor(j) - 5).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(nMotor(j) - 5).custo
nMotor(j) = nMotor(j) - 5
Else
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
xEquipe(j).Motor = xMotor(0).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(0).custo
nMotor(j) = 0
End If
End If
End If
End If
End If
End If
End If
End If
ElseIf xEquipe(j).finanças <= 0 Then
xEquipe(j).Motor = xMotor(0).nome
xEquipe(j).finanças = xEquipe(j).finanças - xMotor(0).custo
nMotor(j) = 0
End If
End If
Next
[/codebox]

Esse é só a parte dos motores.

Mas bem, logo no início desse código, você pode notar que eu fiz o seguinte:

[code]If xEquipe(j).nome = xJogador.equipe Then      h(j) = 0 ElseIf xEquipe(j).nome <> xJogador.equipe Then      <comprar motor>[/code]

Ou seja, se o nome da Equipe(j) for diferente do nome da Equipe controlado pelo jogador, ela compra o motor, caso contrário, o código pára.

Isso é o que deveria acontecer, mas não está acontecendo.

Por exemplo: se eu escolho jogar com a McLaren, quando acaba a temporada, a equipe está contratando, automaticamene, um motor diferente.

Por que isso está acontecendo?

É isso aí.

Não precisa ter pressa.

Valeu.

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

  • 0

o q acontece é q ele muda de equipe cada vez q as equipes mudam de lugar. porque tipo, cada vez q ele abre o MenuEquipe, ele passa por essa linha:

If m = 0 Then
xJogador.equipe = xEquipe(0).nome
lblNomeEquipe.Caption = "MCLAREN"[/code]

nem vi o q é esse m, mas selecionei McLaren e ele ficou igual a 0 pra mim. beleza, so q assim q a corrida acaba, a McLaren não é mais a equipe 0, a equipe 0 na verdade é a ultima colocada.

Link para o comentário
Compartilhar em outros sites

  • 0

Corrigi aqui, valeu.

Agora, eu vou te passar o proejto por MP, pode ser?

Tem dois erros acontecendo no mesmo lugar do jogo.

Na qualificação, você vai perceber que passando da 2ª para a 3ª etapa, vai dar o erro, que é o seguinte: os pilotos que no final da 2ª etapa ficaram em 11° e 12°, na etapa final, aparecem duas vezes cada um.

O outro erro também se relaciona à qualificação.

Se você não mudar a velocidade do jogo, quando entrar no form da corrida, antes de apertar qualquer coisa, vão aparecer todos os pilotos, ordenados exatamente como estavam no final da qualificação. Mas se você mudar a velocidade para 'Rápido', isso já não acontece.

Parece que não faz sentido, mas realmente dá esse erro, somente por mudar a velocidade (diminuir o Interval de cada Timer) da corrida.

Bem... vê aí quando puder.

Valeu cara.

Link para o comentário
Compartilhar em outros sites

  • 0

cara, e agora, ce vai tirar a McLaren do seu jogo??

Na qualificação, você vai perceber que passando da 2ª para a 3ª etapa, vai dar o erro, que é o seguinte: os pilotos que no final da 2ª etapa ficaram em 11° e 12°, na etapa final, aparecem duas vezes cada um.

no click do botao q chama a ultima etapa, em vez de:

For i = 0 To 9
        xPiloto(i).Qualificação = 0
    Next[/code] faca:
[code]For i = 0 To 11
        xPiloto(i).Qualificação = 0
    Next
O outro erro também se relaciona à qualificação. Se você não mudar a velocidade do jogo, quando entrar no form da corrida, antes de apertar qualquer coisa, vão aparecer todos os pilotos, ordenados exatamente como estavam no final da qualificação. Mas se você mudar a velocidade para 'Rápido', isso já não acontece. Parece que não faz sentido, mas realmente dá esse erro, somente por mudar a velocidade (diminuir o Interval de cada Timer) da corrida.
esse é o seguinte, olha o codigo de quando você clica no botao ir pra corrida:
If cmbVelocidade.Text = "Lento" Then
    Qualificação.Timer1.Interval = 1500
    Qualificação.Timer2.Interval = 1500
    Qualificação.Timer3.Interval = 1500
    Corrida.Timer1.Interval = 1500 '<-- O PROBLEMA TA AQUI!!!
    cmbVelocidade.Text = "Lento"[/code]

o q acontece é ele monta a colocacao no Load do form Corrida. se ele não seleciona a velocidade, ele só vai chamar o Load do Corrida depois da qualificacao. agora, quando ele seleciona a velocidade, o Form Corrida ta fechado, certo?? então como ele sabe q esse Timer existe?? o programa não sabe o q é o Form Corrida enquanto ele não for carregado. então, assim q você muda a propriedade Interval do Timer, mesmo q você não use Corrida.Show, o Form é carregado pra memoria, mesmo q não seja exibido, e ai ele passa pelo Form_Load.

ou seja, ele ordena os pilotos ANTES da qualificacao. ai quando chegar no Form da qualificacao, quando ele clicar ir para a corrida, você mostra o Corrida com o Corrida.Show. mas no caso de ele ter selecionado a velocidade, o Form Corrida já vai estar carregado, ou seja, ele vai mostrar mas não vai passar pelo Load, pois o Load já foi feito.

pra arrumar isso, o esquema é criar uma variavel public onde você guarde a velocidade a hora q ele selecionar, e tirar esse codigo Corrida.Timer1.Interval = 1500, dexar pra mudar o Timer só no Load do Corrida.

EDITADO:

alias, se a velocidade vai se a mesma nos 4 timers, você usa uma variavel so pros 4 e economiza linhas.

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

  • 0

Valeu cara, deu certinho.

Tipo, agora eu tava querendo fazer com que os tempos de cada volta, de cada piloto, aparecessem.

Mas pra isso eu tenho que inventar um jeito de relacionar o tempo com a AI.

Imagine que o tempo médio de cada volta seja 1min20s (80 segundos).

Se a AI for alta, o tempo é menor que isso, e se for baixa, maior que isso.

Só que eu não tenho a menor idéia de como fazer.

Tem alguma idéia?

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

  • 0

veja de quanto a quanto varia o ia e de estipula qual seria um tempo maximo e um tempo minimo pro cara acabar a volta. tipo se o ai estiver no maximo qual seria o mais rapido q o piloto poderia fazer?? e se estiver no minimo qual o mais lento??

sabendo disso você faz uma regra de tres com proporcao inversa, é ate simples. tipo, faz de conta q o ai varia de 0 a 100 e q o mais rapido q o cara acabaria seria 40 segundos e o mais lento 120 segundos.

ai você tem o quadro de correspondencia:

ia 0 - 120 segundos

ia 100 - 40 segundos

ai o q você faz, você inverte o ia (maximo menos o calculado). exemplo, se o ia der 80, você transforma em 20, já q você vai transformar em tempo. e quanto maior o ia, menor o tempo.

invertendo o ia, a tabela vai ficar assim:

ia inv. 100 - 120 segundos

ia inv. 0 - 40 segundos

tendo o 20, você arranja uma formula pra multiplicar e chegar no tempo, é como calcular mudanca de celsius pra kelvin em fisica, você tem a escala do ia (invertida) e a do tempo. se o cara ta com um ia invertido x e você quer calcular o tempo y, você sabe q ((100 - x) / 100 - 0) = ((120 - y) / 120 - 40)

calculando:

(100 - x) / 100)) = (120 - y) / 80))
8000 - 80x = 12000 - 100y ' tirando MMC
100y = 80x + 4000
5y = 4x + 200
y = 4x + 200 / 5[/code] ta ai, você encontrou sua formula y = 4x + 200 / 5. viu como é simples?? hahhaha deu pra entender?? bom, resumindo, tdo o q você precisa é de uma formula q transforme o ia em tempo, e é seguindo a logica q eu passei q você resolve. tdo o q você precsia é definir o ia minimo e maximo e o tempo minimo e maximo e subsituir os valores nas contas q eu passei. usando esses valores q eu defini, o codigo ficaria tipo assim:
[code]tempo = (4 * piloto(x).ia + 200) / 5
agora você pode se diverti ai criando sua propria formula. beleza?? EDITADO: opa opa opa, esqueci de inverter o ia no codigo, o certo seria tipo assim:
tempo = (4 * (100 - piloto(x).ia) + 200) / 5

Editado por kuroi
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...