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

Eu entendi a sua lógica, mas há um problema.

Eu não planejava estipular um limite para a AI, as equipes poderiam (e já podem) treinar os mecânicos e os pilotos, e desenvolver o chassi.

Mas bem, vou pensar em alguma solução, baseado no seu post acima.

Acho que dá pra fazer sem mudar muita coisa.

Eu posso encontrar uma fórmula, do jeito que você fez, só que supondo uma AI meio que absurda para o tempo de 0 segundos, enquanto a AI mínima, que é zero, equivale a um tempo de, sei lá, 3 minutos, talvez mais.

Bem, vou ver isso aqui.

Se tiver alguma outra idéia, fale ai.

Valeu mesmo cara.

EDIT:

Tipo, eu não sei se tá muito certo não, mas eu consegui fazer aqui.

Só que o tempo está aparecendo como 1,5 minutos, que equivale a 1min30seg.

Eu quero fazer aparecer 1min30seg, e não 1,5minutos. Como eu faço isso?

E como eu devo declarar a variável do tempo?

Obs: eu fiz do jeito que você me ensinou, ou seja, estipulando um valor máximo para a AI de cada piloto, que não é da maneira que eu queria, como disse acima. Se souber como fazer sem ter que estipular esse valo máximo, me ensina por favor.

Valeu.

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

  • 0
Tipo, eu não sei se tá muito certo não, mas eu consegui fazer aqui.

Só que o tempo está aparecendo como 1,5 minutos, que equivale a 1min30seg.

Eu quero fazer aparecer 1min30seg, e não 1,5minutos. Como eu faço isso?

E como eu devo declarar a variável do tempo?

cria a variavel tempo com integer e armazene nela o tempo em segundos. ai pra converter tem q ser na mao. eu costumo usar aqui uma funcao q eu fiz:

Public Function MontaHoraS(Seg As Double) As String
    Dim Hor As Double, Min As Double
    
    Hor = Int(Seg / 3600)
    Seg = Seg - (Hor * 3600)
    
    Min = Int(Seg / 60)
    Seg = Seg - (Min * 60)
    
    MontaHoraS = MontaHoraS & Hor & ":" & _
        IIf(Len(CStr(Min)) = 1, "0", "") & Min & ":" & _
        IIf(Len(CStr(Seg)) = 1, "0", "") & Seg
End Function[/code]

se você não precisa mostrar a hora junto, é so tirar da funcao (se você declarar tempo como Integer, muda tb o parametro Seg.

Obs: eu fiz do jeito que você me ensinou, ou seja, estipulando um valor máximo para a AI de cada piloto, que não é da maneira que eu queria, como disse acima. Se souber como fazer sem ter que estipular esse valo máximo, me ensina por favor.

o numero maximo q eu falei não precisa ser necessariamente maximo, mas é so uma referencia pra você ter, pra você poder comparar o ai com o tempo, mas mesmo q o ai ficar maior do q esse maximo, vai continuar funcionando certinho.

Link para o comentário
Compartilhar em outros sites

  • 0

Como eu relaciono essa função com o resto do projeto?

Tipo, pra transformar a AI em tempo eu fiz, seguindo a sua explicação, da seguinte forma:

y = (10000 - x) / 100

xPiloto(i).tempovolta = ((10000 - (Int(xPiloto(i).chance * Rnd))) / 100)

Que na verdade eu nem sei se está correto, por que acho que a cada vez que essa linha é lida ela gera um número aleatório novamente. E se não tá certo, eu não sei como fazer.

Mas bem, isso não importa agora.

Imagine que o AI de um determinado piloto tenha dado 1000.

Isso equivale a 90 segundos, que dividido por 60, dá 1,5 minutos.

A partir daí, o que eu tenho que fazer, utilizando essa função que você passou, para transformar 1,5 minutos em 1min30seg?

Valeu.

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

  • 0
xPiloto(i).tempovolta = ((10000 - (Int(xPiloto(i).chance * Rnd))) / 100)
Que na verdade eu nem sei se está correto, por que acho que a cada vez que essa linha é lida ela gera um número aleatório novamente. E se não tá certo, eu não sei como fazer.
ele vai fazer um numero aleatorio cada vez q passar ai sim. mas você não gravava o numero aleatorio no ia?? porque você ta calculando de novo, não seria so pegar do proprio ia?? tipo assim:
xPiloto(i).tempovolta = (10000 - xPiloto(i).ia) / 100
Imagine que o AI de um determinado piloto tenha dado 1000. Isso equivale a 90 segundos, que dividido por 60, dá 1,5 minutos. A partir daí, o que eu tenho que fazer, utilizando essa função que você passou, para transformar 1,5 minutos em 1min30seg?
nem perde tempo dividindo por 60, porque a funcao q eu passei monta a string baseada em segundos. tipo, se você declarar o tempovolta como Integer (e alterou o Seg pra Integer tb, como falei), é so fazer assim:
xPiloto(i).tempovolta = (10000 - xPiloto(i).ia) / 100
label1.Caption = MontaHoraS(xPiloto(i).tempovolta)[/code]

Link para o comentário
Compartilhar em outros sites

  • 0
ele vai fazer um numero aleatorio cada vez q passar ai sim. mas você não gravava o numero aleatorio no ia?? porque você ta calculando de novo, não seria so pegar do proprio ia??

Não, por que olha só.

O xPiloto(i).ai, é a soma do número aleatório que é gerado cada volta.

O tempo deveria ser apenas da última volta.

Quanto ao resto, vou tentar aqui.

Valeu.

EDIT:

Eu fiz:

Me.Controls("lbl" & 22 - (i)).Caption = xPiloto(i).nome & " - " & MontaHoraS(xPiloto(i).tempovolta)

que nem você disse, mas aparece a seguinte mensagem de erro:

"ByRef argument type mismatch"

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

  • 0
ele vai fazer um numero aleatorio cada vez q passar ai sim. mas você não gravava o numero aleatorio no ia?? porque você ta calculando de novo, não seria so pegar do proprio ia??

Não, por que olha só.

O xPiloto(i).ai, é a soma do número aleatório que é gerado cada volta.

O tempo deveria ser apenas da última volta.

então crie uma variavel temporaria pra guardar o ultimo. em vez de já somar direto o numero random no ultimo ia, atribua o valor dele a essa variavel e passe ela pra formula do tempo. só depois, some ao ia.

você pode calcular o ia e o tempo no mesmo For, tipo uma linha embaxo da otra, então pode ser uma unica variavel pra todos os pilotos, não precisa ser uma nova propriedade nem um array.

Eu fiz:

Me.Controls("lbl" & 22 - (i)).Caption = xPiloto(i).nome & " - " & MontaHoraS(xPiloto(i).tempovolta)

que nem você disse, mas aparece a seguinte mensagem de erro:

"ByRef argument type mismatch"

como eu disse antes, o tipo da variavel (xPiloto(i).tempovolta) e do parametro Seg tem q bater. ou os dois Integer, ou os dois Double.

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu cara, deu certinho.

EDIT:

Eu fiz:

xPiloto(i).tempovolta = ((10000 - xPiloto(i).ai2) / 100)
pra somar o tempo das voltas de cada piloto, e depois:
Me.Controls("lbl" & 22 - (i)).Caption = xPiloto(i).nome & " - " & MontaHoraS(xPiloto(i).tempovolta)
pra mostrar essa soma, mas não está somando corretamente. Pra cada volta aparece um valor diferente do que deveria aparecer. Por exemplo: uma hora a soma de um determinado piloto está igual a 2:30,00, e na volta seguinte, o tempo desse mesmo piloto aparece igual 1:49,00. Outro problema que está dando é na qualificação. Eu tentei fazer o mesmo que fiz com a corrida, aparecendo o melhor tempo de cada piloto:
For i = 0 To 21
   a = Int(xPiloto(i).chance * Rnd) + 1
   If a > xPiloto(i).Qualificação Then
       xPiloto(i).Qualificação = a
       xPiloto(i).tempovolta = ((10000 - xPiloto(i).Qualificação) / 100)
   End If
Next

Mas também aparece o valor errado.

Por exemplo: uma hora aparece 1:35,42 para um piloto, e na volta seguinte aparece 0:35,42.

Por que será?

Link para o comentário
Compartilhar em outros sites

  • 0

No Command:

For i = 0 To 21
   xPiloto(i).ai2 = Int((xPiloto(i).chance) * Rnd) + 1
   xPiloto(i).ai = xPiloto(i).ai + xPiloto(i).ai2 + xPiloto(i).poslargada
   xPiloto(i).tempovolta = xPiloto(i).tempovolta + ((10000 - xPiloto(i).ai2) / 100)
Next

E no Timer:


Private Sub Timer1_Timer()
For i = 0 To 21
If xPiloto(i).ai > 0 Then
xPiloto(i).ai2 = Int((xPiloto(i).chance) * Rnd) + 1
xPiloto(i).ai = xPiloto(i).ai + xPiloto(i).ai2
xPiloto(i).tempovolta = xPiloto(i).tempovolta + ((10000 - xPiloto(i).ai2) / 100)
End If
If (Int(xPiloto(i).chance * Rnd) + 1) = 1 Then
xPiloto(i).ai = 0
End If
Next
Colocação xPiloto(), 21
tempo = tempo + 1
For i = 0 To 21
If xPiloto(i).ai > 0 Then
Me.Controls("lbl" & 22 - (i)).Caption = xPiloto(i).nome & " - " & MontaHoraS(xPiloto(i).tempovolta)
ElseIf xPiloto(i).ai = 0 Then
Me.Controls("lbl" & 22 - (i)).Caption = xPiloto(i).nome & " - Abandonou"
End If

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

lblVoltas.Caption = "Volta: " & tempo
If tempo = 70 Then
Timer1.Enabled = False

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
End If
End Sub
[/codebox]

Link para o comentário
Compartilhar em outros sites

  • 0

a primeira coisa q eu vi é q ele ta ordenando por tempo errado. tipo, aqui no click do OK no form Corrida, você faz:

For i = 0 To 21
        xPiloto(i).ai = Int(xPiloto(i).chance * Rnd) + 1
    Next
    
    For i = 0 To 21
        xPiloto(i).ai2 = Int((xPiloto(i).chance) * Rnd) + 1
        xPiloto(i).ai = xPiloto(i).ai + xPiloto(i).ai2 + xPiloto(i).poslargada
        xPiloto(i).tempovolta = xPiloto(i).tempovolta + ((10000 - xPiloto(i).ai2) / 100)
    Next[/code] pra q serve o primero For?? porque você calcula o ai nele e depois calcula outro ai e soma no mesmo?? nota q o primeiro ai não é somado no tempo, mas é somado no ai. ai ele ordena pelo ai, mas o tempo não bate com o ai, e parece q ta tudo fora de ordem. outra coisa, tanto o ai como o tempovolta tão vindo com valores do form de Qualificacao, o q vai dexar a ordenacao mais errada ainda. você devia zerar todos antes de fazer qualquer coisa. e uma dica, porque você calcula o ia e ordena uma vez no clique do botao e depois ordena de novo no timer (dessa vez, as outras 69 vezes)?? não seria mais facil deixar tudo no timer?? assim fica menos codigo, e, quando você precisar altera, altera uma vez só. quanto aos problemas, tanto o da qualificacao quanto o da corrida, faz uma alteracao na funcao q eu passei, declare ela assim:
[code]Public Function MontaHoraS(ByVal Seg As Double) As String

e veja se resolve.

Link para o comentário
Compartilhar em outros sites

  • 0

Resolveu, valeu cara.

Tipo, agora eu fiz o seguinte:

For i = 0 To 21
    xPiloto(i).diftempo = xPiloto(21).tempovolta - xPiloto(i).tempovolta
Next
pra determinar a diferença de tempo do primeiro piloto da corrida para os restantes. E para aparecer essa diferença:
Me.Controls("lbl" & 22 - (i)).Caption = xPiloto(i).nome & "  + " & MontaHoraS(xPiloto(i).diftempo)

Só que tá dando um erro.

Não sei muito bem o que é, mas acontece que a diferença do primeiro piloto para o segundo piloto, algumas vezes, aparece como mais de 59minutos, o que é uma coisa absurda. Mas ainda assim, mesmo com essa diferença, as vezes o segundo colocado ultrapassa o primeiro em uma volta.

Esse foi só um exemplo, o restante das diferenças de tempo também estão todas erradas.

Então eu tenho duas perguntas:

Como corrigir isso?

E também como fazer para que apareçam sempre apenas duas 'casas' de mílésimos.

Por exemplo: as vezes aparece 1:30,3666666666666666666

Eu queria fazer aparecer sempre duas casas, ou seja, nem mais nem menos.

Valeu.

Link para o comentário
Compartilhar em outros sites

  • 0

estranho esse primero problema. tenta por um breakpoint (F9) nessa linha dentro do For e quando chegar la da uma estudada nos valores do tempovolta tanto do primeiro como do i, pode ate usar o MontaHoraS no Immediate Window (Ctrl + G). ai você observa o valor da diferenca e veja porque o valor fica estranho.

quanto ao outro problema, arredonde os segundos pra duas casas (e se são duas casas, são os centesimos e não milesimos), tipo assim, no MontaHoraS, substitura a linha

IIf(Len(CStr(Seg)) = 1, "0", "") & Seg
por
IIf(Len(CStr(Int(Seg))) = 1, "0", "") & Round(Seg, 2)

Link para o comentário
Compartilhar em outros sites

  • 0

Eu pensei aqui, e é muito mais lógico se eu fizesse da seguinte maneira:

xPiloto(i).diftempo = xPiloto(i).tempovolta - xPiloto(21).tempovolta

e não da maneira anterior, já que o tempovolta do primeiro piloto é menor que o dos pilotos restantes, e não o contrário.

E quase deu certo.

Ainda tá dando um problema.

Note na imagem abaixo, os tempos dos pilotos Hamilton e do Kubica, 5° e 6° lugares respectivamente. Essa imagem foi tirada no fim da corrida, e o Hamilton terminou na frente do Kubica. Mas o problema é que o tempo final do Hamilton foi maior que o do Kubica, ou seja, como pode o Kubica ter terminado a corrida em menos tempo que o Hamilton, e ter terminado atrás dele?

erronacorridasx5.th.jpg

Pra ficar mais fácil de perceber isso, eu ainda coloquei o valor da AI de cada piloto, do lado do tempo. Mesmo o tempo do Hamilton ter sito maior que o do Kubica, seu AI foi também maior, lembrando que quanto maior o AI menor o tempo.

Se você quiser que eu te mande o projeto, é só avisar.

Ok. Agora quanto ao segundo problema que eu havia falado, trocando aquela linha, deu certo aqui, e aparecem no máximo dois algarismos.

Eu até tava pensando aqui, e acho melhor mostrar os milésimos em vez dos centésimos. Mas bem, o problema não é esse. É que eu queria que, para o caso de dar, por exemplo: 1:30,6 , em vez de aparecer dessa forma, apareceria assim: 1:30,600.

É isso aí.

Valeu.

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

  • 0
Eu pensei aqui, e é muito mais lógico se eu fizesse da seguinte maneira:

xPiloto(i).diftempo = xPiloto(i).tempovolta - xPiloto(21).tempovolta
e não da maneira anterior, já que o tempovolta do primeiro piloto é menor que o dos pilotos restantes, e não o contrário.
é foda, as vezes aparece um negocio besta e a gente se mata pra descobrir. isso era obvio, era so pensar direito na logica, mas a gente num percebe.
Note na imagem abaixo, os tempos dos pilotos Hamilton e do Kubica, 5° e 6° lugares respectivamente. Essa imagem foi tirada no fim da corrida, e o Hamilton terminou na frente do Kubica. Mas o problema é que o tempo final do Hamilton foi maior que o do Kubica, ou seja, como pode o Kubica ter terminado a corrida em menos tempo que o Hamilton, e ter terminado atrás dele? erronacorridasx5.th.jpg Pra ficar mais fácil de perceber isso, eu ainda coloquei o valor da AI de cada piloto, do lado do tempo. Mesmo o tempo do Hamilton ter sito maior que o do Kubica, seu AI foi também maior, lembrando que quanto maior o AI menor o tempo.
isso deve ser em algum momento algum valor errado q você ta passando pro tempovolta, tipo o q eu disse nesse post:
a primeira coisa q eu vi é q ele ta ordenando por tempo errado. tipo, aqui no click do OK no form Corrida, você faz:
For i = 0 To 21
        xPiloto(i).ai = Int(xPiloto(i).chance * Rnd) + 1
    Next
    
    For i = 0 To 21
        xPiloto(i).ai2 = Int((xPiloto(i).chance) * Rnd) + 1
        xPiloto(i).ai = xPiloto(i).ai + xPiloto(i).ai2 + xPiloto(i).poslargada
        xPiloto(i).tempovolta = xPiloto(i).tempovolta + ((10000 - xPiloto(i).ai2) / 100)
    Next[/code] pra q serve o primero For?? porque você calcula o ai nele e depois calcula outro ai e soma no mesmo?? nota q o primeiro ai não é somado no tempo, mas é somado no ai. ai ele ordena pelo ai, mas o tempo não bate com o ai, e parece q ta tudo fora de ordem. outra coisa, tanto o ai como o tempovolta tão vindo com valores do form de Qualificacao, o q vai dexar a ordenacao mais errada ainda. você devia zerar todos antes de fazer qualquer coisa. se você já corrigiu td isso q eu falei, de uma procurada la q deve ter alguma coisa q eu não reparei. mas se não achar, pode mandar la.
Ok. Agora quanto ao segundo problema que eu havia falado, trocando aquela linha, deu certo aqui, e aparecem no máximo dois algarismos. Eu até tava pensando aqui, e acho melhor mostrar os milésimos em vez dos centésimos. Mas bem, o problema não é esse. É que eu queria que, para o caso de dar, por exemplo: 1:30,6 , em vez de aparecer dessa forma, apareceria assim: 1:30,600.
tenta assim:
[code]IIf(Len(CStr(Int(Seg))) = 1, "0", "") & Format(Round(Seg, 3), "#,##0.000")

Link para o comentário
Compartilhar em outros sites

  • 0

Descobri o erro aqui, e já corrigi, agora tá certinho.

Valeu.

Só uma coisa.

Eu estou fazendo assim: o tempo total do primeiro colocado da corrida aparece do lado do seu nome, enquanto os demais pilotos aparece somente a diferença do tempo (xPiloto(i).tempovolta - xPiloto(21).tempovolta).

Mas eu havia tirado as horas daquela função, ou seja, só aparecem os minutos, segundos e milésimos. Eu queria fazer com que, apenas quando tempovolta > 59:59,999, as horas aparecessem. Tem como?

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

  • 0

Notei aqui que aquele código para o contrato das equipes controladas pela CPU ainda não estão certas. Acho que eu que não vinha notando mesmo, mas agora eu fui ver, e a Ferrari, após o término da primeira temporada, mesmo já tendo o melhor motor do jogo, e tendo mais de 40.000 de finanças (o motor mais caro custa 10.000), comprou o 4° melhor motor do jogo.

Na temporada seguinte, a McLaren tendo o melhor motor do jogo também, e com mais de 60.000, comprou o 3° melhor motor.

Olha só o código (apenas dos motores):


'_______________________MOTOR_______________________

Randomize

For j = 0 To UBound(xEquipe)
h(j) = Int(1 * Rnd) + 1
Next

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]

O que será que tem de errado?

Eu também fiz o seguinte:

[code]aux1 = nMotor(i)             nMotor(i) = nMotor(Min)             nMotor(Min) = aux1                          aux2 = nPneu(i)             nPneu(i) = nPneu(Min)             nPneu(Min) = aux2                          aux3 = nCombustível(i)             nCombustível(i) = nCombustível(Min)             nCombustível(Min) = aux3[/code]

como você havia sugerido.

Link para o comentário
Compartilhar em outros sites

  • 0

Mandei.

EDITADO:

Gostaria de pedir então, que você olhasse mais um problema que está dando.

As vezes, durante as corridas, o tempovolta do segundo colocado aparece errado, tipo: 59:59,599

Sendo que era para aparecer a diferença de seu tempo comparado ao tempo do primeiro colocado.

Não necessariamente, os erros que eu falei vão acontecer na primeira corrida ou primeira temporada, mas eles acontecem.

EDIT: ta ok, sem problema.

Valeu.

Editei pra não precisar postar a toa.

Editado por Darknnez
pra eu nao esquecer
Link para o comentário
Compartilhar em outros sites

  • 0

beleza, se eu não olhar hj mais tarde, vejo amanha, mas vo editar o seu post de cima com o seu otro problema pra eu não esquecer.

Gostaria de pedir então, que você olhasse mais um problema que está dando.

As vezes, durante as corridas, o tempovolta do segundo colocado aparece errado, tipo: 59:59,599

Sendo que era para aparecer a diferença de seu tempo comparado ao tempo do primeiro colocado.

Não necessariamente, os erros que eu falei vão acontecer na primeira corrida ou primeira temporada, mas eles acontecem.

esse aqui acontece q você tira a diferenca antes de ordenar, ou seja a diferenca q você ta tirando é do primero colocado na volta anterior mas pode não ser o primero nessa. ai os valores ficam negativos e funcao não ta preparada pra trabalhar com tempo negativo por isso aparece esse valor estranho.

pra corrigir, ordene a colocacao antes de calcular a diferenca

o otro problema to vendo aqui, jaja edito o post.

EDITADO:

Notei aqui que aquele código para o contrato das equipes controladas pela CPU ainda não estão certas. Acho que eu que não vinha notando mesmo, mas agora eu fui ver, e a Ferrari, após o término da primeira temporada, mesmo já tendo o melhor motor do jogo, e tendo mais de 40.000 de finanças (o motor mais caro custa 10.000), comprou o 4° melhor motor do jogo.

Na temporada seguinte, a McLaren tendo o melhor motor do jogo também, e com mais de 60.000, comprou o 3° melhor motor.

tem certeza q isso acontece?? pra mim foi normal aqui. acontece sempre ou de vez em quando?? testei tres vezes aqui e foi sem problemas, olha:

post-9195-1190264991_thumb.jpg

na segunda temporada tb foi sem problemas pra ferrari e mclaren. e olhando seu codigo seu codigo acho meio impossivel isso acontecer já q o primeiro teste q você faz é pras equipes q tem motor 7 recomprarem o 7 e depois disso você já zera o h.

bom se isso realmente acontece com você talvez seja algum problema na ordenacao q acaba trocando os motores de uma equipe pra outra.

mas se isso acontece pra você e não acontece pra mim, deve ser algo q você faz q eu não faco q acaba interferindo. tipo talvez você selecionando uma equipe diferente, velocidade diferente, sei la.

tipo toda vez aqui, eu não escolho equipe (não mexo em nd no form Novo Jogo), ponho velocidade Muito Rapido e já vou pra corrida.

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

  • 0
esse aqui acontece q você tira a diferenca antes de ordenar, ou seja a diferenca q você ta tirando é do primero colocado na volta anterior mas pode não ser o primero nessa. ai os valores ficam negativos e funcao não ta preparada pra trabalhar com tempo negativo por isso aparece esse valor estranho.

pra corrigir, ordene a colocacao antes de calcular a diferenca

Valeu, deu certo.

tem certeza q isso acontece?? pra mim foi normal aqui. acontece sempre ou de vez em quando?? testei tres vezes aqui e foi sem problemas, olha:

Reduzida 81%

Imagem anexada

507 x 490 (34.61KB)

na segunda temporada tb foi sem problemas pra ferrari e mclaren. e olhando seu codigo seu codigo acho meio impossivel isso acontecer já q o primeiro teste q você faz é pras equipes q tem motor 7 recomprarem o 7 e depois disso você já zera o h.

bom se isso realmente acontece com você talvez seja algum problema na ordenacao q acaba trocando os motores de uma equipe pra outra.

mas se isso acontece pra você e não acontece pra mim, deve ser algo q você faz q eu não faco q acaba interferindo. tipo talvez você selecionando uma equipe diferente, velocidade diferente, sei la.

tipo toda vez aqui, eu não escolho equipe (não mexo em nd no form Novo Jogo), ponho velocidade Muito Rapido e já vou pra corrida.

Não tenho certeza se isso acontece, mas aconteceu pelo menos uma vez comigo, que foi quando eu notei. Talvez seja ordenação mesmo.

Eu vou tentar aqui em algumas temporadas, conferindo sempre se dá esse erro.

Eu também não escolho equipe, e a velocidade normalmene eu vario entra Rápido e Muito Rápido.

Valeu.

EDIT: e foi mal aí cara, esqueci de reduzir o número de etapas de uma temporada.

É por que normalmente é 18, mas eu coloco 4 ou menos pra ir pro fim da temporada logo.

Se quiser mudar isso, se é que você já não sabe, é só trocar o número 18 para um outro qualquer na seguinte linha:

If etapa = 18 Then

no form PontosCorridaEquipe.

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

  • 0

Opa! E aí kuroi, tudo bem?

Quanto tempo...

Bem, acabaram as aulas e provas de vestibular, e retomei o projeto.

Não alterei nada de importância ainda, apenas algumas coisas simples no design pra deixar o ambiente do jogo mais agradável. E com certeza ficou muito melhor agora.

Mas bem, queria recomeçar fazendo com que as equipes controladas pelo computador possam contratar pilotos diferentes após o término da temporada. Para isso, seguiria a mesma lógica que fiz para que pudessem contratar motores, pneus e combustíveis diferentes, com algumas pequenas alterações.

Se lembra?


'_______________________MOTOR_______________________

Randomize

For j = 0 To UBound(xEquipe)
h(j) = Int(1 * Rnd) + 1
Next

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]

A diferença, é que, enquanto existem apenas 8 motores, 4 combustíveis e 3 pneus diferentes, existem 22 pilotos no total, o que tornaria esse código muito longo e complicado.

Então queria saber se você conhece uma maneira simplificada de fazer isso.

É isso aí, valeu.

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,8k
×
×
  • Criar Novo...