Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Juego Basic, Problema con un Bucle!

Estas en el tema de Juego Basic, Problema con un Bucle! en el foro de Visual Basic clásico en Foros del Web. Hola, estoy realizando un pequeño "juego" como trabajo para la clase de informática. El caso, es que aunque puede tener un código muy rudimentario, tiene ...
  #1 (permalink)  
Antiguo 14/06/2007, 08:51
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 17 años
Puntos: 1
Exclamación Juego Basic, Problema con un Bucle!

Hola, estoy realizando un pequeño "juego" como trabajo para la clase de informática. El caso, es que aunque puede tener un código muy rudimentario, tiene un pequeño fallo, pero por más que lo reviso no encuentro el porqué:

A continuación les explico un poco y les pongo el códgo para ver si encuentran ustedes el fallo:

Es un programa en el cual se tirarán al principio unos dados y se genera un valor aleatorio para tí y para tu contrincante (el pc, tu enemigo). En función del que saque más alta puntuación, empezará tirando. El valor de la tirada, será restado a la vida total que se nos asigne (en esete caso 100 para nosotros, 150 para el pc). El caso es que te irá pidiendo que cada vez, que pulses los dados para tirar de nuevo.
Ahora bien, el problema surge cuando lo ejecuto. Todo va perfecto, hasta llegar al bucle while, que pareceser que origina un desbordamiento y se queda pillado el programa. Pero por más que busco como cambiarlo o arreglarlo, no lo consigo. Haber si me puediesen ayudar por favor.

Código:

Option Explicit

Dim i As Single
Dim num1
Dim num2
Dim a
Dim vm
Dim vt
Dim dr
Dim dp
Dim h
Dim turno


Private Sub Command1_Click()

i = i + 1
vm = 100
vt = 150

If i = 1 Then

Randomize
num1 = Int((Rnd * 20) + 1)
Text1.Text = "Has sacado: " & num1

Randomize
num2 = Int((Rnd * 20) + 1)
Text1.Text = Text1.Text + vbCrLf + vbCrLf + "Tu enemigo ha sacado: " & num2

If num1 > num2 Then
h = -1
Text1.Text = Text1.Text + vbCrLf + vbCrLf + vbCrLf + " EMPIEZAS ATACANDO: ¡PREPARATE!"
Timer1.Enabled = True
End If

If num2 > num1 Then

Text1.Text = Text1.Text + vbCrLf + vbCrLf + vbCrLf + " TU ENEMIGO EMPIEZA ATACANDO: ¡PREPARATE!"
Timer1.Enabled = True

End If

End If


If i >= 2 Then
If num1 > num2 Then
turno = -1
While vm > 0 Or vt > 0
If turno = -1 Then
Text1.Text = "Tira los Dados:"
h = h * (-1)

If h > 0 Then

Randomize
dp = Int((Rnd * 20) + 1)
Text1.Text = vbCrLf + vbCrLf + "Tu ataque quita " & dp & " de daño."
vt = vt - dp
turno = turno * (-1)
End If
End If


If turno = 1 Then

Randomize
dr= Int((Rnd * 20) + 1)
Text1.Text = "Tu enemigo te quita:" & dr & " de vida."
vm = vm - dr
turno = turno * (-1)
End If

Wend
End If
End If
End Sub




Private Sub Timer1_Timer()

a = a + 1
If a = 3 Then
Text1.Text = vbCrLf + vbCrLf + vbCrLf + vbCrLf + " ¡¡EMPIEZA EL COMBATE!!"
End If

If a = 5 And num2 > num1 Then

Randomize
num2 = Int((Rnd * 20) + 1)
Text1.Text = vbCrLf + vbCrLf + "Tu enemigo ha sacado: " & num2
End If

If a = 5 And num1 > num2 Then
Text1.Text = "Tira los Dados:"
End If
End Sub

Última edición por vrael; 15/06/2007 a las 08:20
  #2 (permalink)  
Antiguo 14/06/2007, 15:02
 
Fecha de Ingreso: septiembre-2005
Mensajes: 76
Antigüedad: 18 años, 7 meses
Puntos: 0
Re: Juego Basic, Problema con un Bucle!

Por mas que intento no puedo arreglar el problema, lo que pasa es que no entiendo cual es el fin al que queres llegar.. lo que vi hasta el momento es que cada vez que apretas el boton se reinicia todo.. tendria que una vez llegado al resultado deseado te avise, o no.. la verdad si me podes explicar mejor te ayudo

Pd: tu codigo esta medio complicado.. pero se entiende..
__________________
Buby Systems
  #3 (permalink)  
Antiguo 15/06/2007, 04:10
 
Fecha de Ingreso: febrero-2007
Mensajes: 450
Antigüedad: 17 años, 2 meses
Puntos: 3
Re: Juego Basic, Problema con un Bucle!

Un poco de formato al código, sino es muy dificil de leer..

Un saludo
  #4 (permalink)  
Antiguo 15/06/2007, 08:13
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 17 años
Puntos: 1
Re: Juego Basic, Problema con un Bucle!

Lo siento, pero estoy empezando en esto de programar y estoy todadavía un poco pez .

Haber si con esto lo aclaro un poco.

Se supone que es un formulario donde voy ha intentar realizar una "lucha" entre el ordenador y el usuario.

En el formulario hay un botón llamado: Dados y un cuadro de texto en el que se van a ir mostrando todo lo que suceda. Primero se pulsa una vez, y se generan dos valores aleatorios que se guardan en las variables num1 y num2. Según el que saque más alta puntuación, empezará tirando nuevamente la máquina o tu (para lo que utilizo: if num1>num2 then...)

Pongamos que somos nosotros los que mepezamos tirando, te aparece un mensaje pidiendo que tieres de nuevo. (para distinguir las veces que pulsas el botón, he definido i, if >= 2 then... "cuando lo pulsas por segunda vez").

La máquina tiene una variable que pongamos será su "vida": vt = 150, y nosotros tendremos nuestra propia "vida": vm = 100, lo que se deberá ir haciendo es restar el número que saque la máquina a mi vida, hasta que esta sea menor o igual que cero, y viceversa, "tirando" para ello una vez cada uno. (para eso he utilizado el bucle while, puesto que no se lo que se tardára en que las vidas lleguen a 0, para difierenciar el turno de cada uno, he definido una variable llamada turno y que irá cambiando de positiva a negativa con cada ejecución del bucle, y en función de ella, se ejecutará que el que tire la máquina, o tire el usuario)

El problema a parte de que el bucle se me queda pillado, es que cuando me toque a mí tirar, tengo que indicar que se tiren los dados y que el bucle no siga ejecutándose hasta que se pulse el botón. (para eso he hecho una cosa extraña, que me parece que está mal, pero bueno: he definido otra variable llamada h que igual que el turno irá cambiando de positivo a negativo, y la introduzco en el bucle, de tal forma que halla a veces que no tenga ninguna condición que se cumpla, y tenga que esperar a que cambie h pulsando el botón)

Espero que esto os aclaré un poco más de que va el asunto.
  #5 (permalink)  
Antiguo 15/06/2007, 10:07
 
Fecha de Ingreso: febrero-2007
Mensajes: 450
Antigüedad: 17 años, 2 meses
Puntos: 3
Re: Juego Basic, Problema con un Bucle!

Ya veo de qué va el tema...

Bueno, antes que nada dejame darte unos consejos para programar:

1. Siempre dale un formato claro al código, si no es un ejercicio sencillo se hace imposible de leer, ya para tí mismo.

2. En lenguajes como Visual Basic, ordenate las diferentes rutinas con un orden "lógico", de esa forma siempre sabrás donde está cada cosa.

3. Los nombres de las variables, deben ser claros para tí

Son consejos para tí mismo, yo soy el primero que si tengo que dar un código lo pongo a proposito dificil de leer (jeje) pero para uno mismo, para poder trabajar eficientemente, y si después de tiempo se necesita volver a tocar un código, es muy importante seguir estos puntos.

---


Ahora vamos al tema en concreto:

1. Veo variables importantes que no tienen sus valores inicializados, si por lo menos especificaras el tipo de dato, alomejor no haria del todo falta (aunque tambien daria problemas muchas veces). Pero aquí no haces ni una cosa ni otra.

Te recomiendo que declares como Integer (entero) num1, num2 y la I.

2. No entiendo como estás utilizando la variable turno, en tu explicacion dices que seria de tipo verdadero o falso, no ? para eso tienes el tipo de dato Boolean (true/false).

3. La misma variable turno tiene que hacer tu ataque, y el del PC, la variable H sobraria, pues la usas para lo mismo.

No debes de usar diferentes condicionales... o es un turno, o es el otro.. es decir algo asi:

Código:
if turnomaquina = true then
  '<...lo que pasa en el turno de la maquina...>
  turnomaquina = false
else
  '<...lo que pasa en el turno del jugador...>
  turnomaquina = true
end if
Fijate que, por lo que decia al principio, cambio el nombre para darle un poco más de lógica y facilitar el asunto. Es todo un mismo condicional, cuando acaba la "jugada" de la máquina, se pone en false para la proxima vez, asi sabemos que la siguiente vez el turno es del jugador.

De la misma forma, cuando acaba la "jugada" del jugador, turnomaquina se pone true de nuevo, para la siguiente vez

4. El WHILE sobra, cada jugada es una tirada de dado, no ? es decir, cada vez que le das al botón. Aqui veo, que quizas me equivoque, es cuestión del funcionamiento del juego y no me ha quedado eso del todo claro. De la forma que yo lo he entendido sobra...

...


En el codigo faltan lineas, no ? hay cosas que no cuadran

Para qué usas un timer ?

No sé, tira un poco de todo lo que te he dicho y , si no te funciona, ponme aqui el nuevo código...

También estaría bien que explicarás la funcion de las otras variables...

Saludos
  #6 (permalink)  
Antiguo 15/06/2007, 11:54
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 17 años
Puntos: 1
Re: Juego Basic, Problema con un Bucle!

Gracias por los consejos, la verdad es que me han sido de bastante ayuda.

¡¡¡Por fín lo he conseguido!!!

Después de bastante tiempo pensando, me dí cuenta que me había complicado la vida, y lo ví todo más sencillo. Conseguí hacer que funcionara, de forma más facil y sencilla.

Como contestación a tu pregunta, los timer los utilizo para animar un poco los textos (que aparezcan al segundo y cosas así) y para hacer visible e invisible el command1

Por si tienes curiosidad, te dejo el código mas abajo que funciona al 100%:
(Todavía no tengo muy pillado lo de dar formato al texto, así que te costará un poco leerlo) , como puedes ver, he quitado el bucle que me daba problemas y con esto consigo una función muy parecida:

Option Explicit
Dim i As Integer
Dim num1 As Integer
Dim num2 As Integer
Dim a
Dim vm
Dim vt
Dim dr
Dim dp
Dim b

Private Sub Command1_Click()

i = i + 1


If i = 1 Then

Randomize
num1 = Int((Rnd * 20) + 1)
Text1.Text = "Has sacado: " & num1
Command1.Visible = False

Randomize
num2 = Int((Rnd * 20) + 1)
Text1.Text = Text1.Text + vbCrLf + vbCrLf + "Tu enemigo ha sacado: " & num2
Command1.Visible = False

If num1 > num2 Then


Text1.Text = Text1.Text + vbCrLf + vbCrLf + " EMPIEZAS ATACANDO: ¡PREPARATE!"
Timer1.Enabled = True
End If

If num2 > num1 Then
Text1.Text = Text1.Text + vbCrLf + vbCrLf + vbCrLf + " TU ENEMIGO EMPIEZA ATACANDO: ¡PREPARATE!"
Timer1.Enabled = True

End If


End If


If i >= 2 And num1 > num2 Then

Randomize
dp = Int((Rnd * 20) + 1)
Text1.Text = "Tu ataque quita: " & dp & " de daño."
vt = vt - dp
Text2.Text = "Vida:" & vt
Command1.Visible = False
b = 0
Timer2.Enabled = True
End If

If i >= 2 And num2 > num1 Then

Randomize
dr = Int((Rnd * 20) + 1)
Text1.Text = "Tu enemigo te quita: " & dr & " de daño."
vm = vm - dr
Text3.Text = "Vida:" & vm
b = 0
Command1.Visible = False
Timer2.Enabled = True

End If



End Sub




Private Sub Form_Load()
vm = 150
vt = 150
Text2.Text = "Vida:" & vt
Text3.Text = "Vida:" & vm
End Sub

Private Sub Text2_Change()

If vt <= 0 Then
Text2.Enabled = False
Text3.Enabled = False
Command1.Visible = False
Command1.Enabled = False
MsgBox "HAS APLASTADO A TU ENEMIGO. PUEDES CONTINUAR TU CAMINO..." + vbCrLf + vbCrLf + " Código: PACPRO", vbOKOnly, "Fight Dragons of War"
Form5.Show
Unload Me
End If
End Sub


Private Sub Text3_Change()

If vm <= 0 Then
Text3.Enabled = False
Text2.Enabled = False
Command1.Visible = False
Command1.Enabled = False
MsgBox "¡¡HAS SIDO DERROTADO!!" + vbCrLf + vbCrLf + "Ya no hay esperanza...", vbOKOnly, "Fight Dragons of War"
Form1.Show
Unload Me
End If
End Sub


Private Sub Timer1_Timer()

a = a + 1
If a = 3 Then
Text1.Text = vbCrLf + vbCrLf + vbCrLf + " ¡¡EMPIEZA EL COMBATE!!"
End If

If a = 5 And num2 > num1 Then

Text1.Text = "Tira los dados para empezar la pelea:"
Command1.Visible = True
Timer1.Enabled = False
End If

If a = 5 And num1 > num2 Then

Command1.Visible = True
Text1.Text = "Tira los Dados:"
Timer1.Enabled = False
End If
End Sub


Private Sub Timer2_Timer()
b = b + 1
If i >= 2 And num1 > num2 And b = 1 Then
Randomize
dr = Int((Rnd * 20) + 1)
Text1.Text = Text1.Text + vbCrLf + vbCrLf + "Tu enemigo te quita:" & dr & " de vida."
vm = vm - dr
Text3.Text = "Vida:" & vm
Command1.Visible = True
End If

If i >= 2 And num1 < num2 And b = 1 Then

dp = Int((Rnd * 20) + 1)
Text1.Text = Text1.Text + vbCrLf + vbCrLf + "Tu ataque quita:" & dr & " de vida."
vt = vt - dp
Text2.Text = "Vida:" & vt
Command1.Visible = True
End If
End Sub



PD: tenías razón, me sobraban algunas variables.

Gracias por la ayuda.
  #7 (permalink)  
Antiguo 15/06/2007, 13:46
 
Fecha de Ingreso: febrero-2007
Mensajes: 450
Antigüedad: 17 años, 2 meses
Puntos: 3
Re: Juego Basic, Problema con un Bucle!

De nada, hombre, me alegro que ya lo hayas sacado.

Con lo de dar formato me refiero también a tabulaciones para tener controlado lo que está dentro de ciertas estructuras y demás..
Con calma.

Saludos
  #8 (permalink)  
Antiguo 16/06/2007, 11:20
 
Fecha de Ingreso: septiembre-2005
Mensajes: 76
Antigüedad: 18 años, 7 meses
Puntos: 0
Re: Juego Basic, Problema con un Bucle!

me gano de mano... un abrazo
__________________
Buby Systems
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:11.