Muy buenas, estaba haciendo un ejercicio en visual sobre un juego de adivinar un nº que se introduce por pantalla y no se como hacer una de las partes. Exactamente la parte de los acumuladores de los puntos, por no querer rescribir todo el código lo he ido haciendo de una manera y al final me esta dando mas problemas que otra cosa.
El problema dice así: se desea realizar un programa donde se tienen a 2 jugadores y un arbitro, el arbitro introduce un nº por teclado y los 2 jugadores intenta averiguarlo. El nº debe estar entre el 1 y 100. Como máximo tienen 5 intentos y juegan de manera alternada. El que acierta a la primera obtendra 10 pts, si es a la 2ª 8puntos, 3ª 6puntos, 4ª 4 puntos 5ª 2puntos 6ª pierden el juego.
Hay que darles pistas a los jugadores si el nº introducido se encuentra a + o - 3 del nº a acertar mostrar "quemando", si es + o - 7 caliente, si es + o - 15 mostrar templado, resto frio.
Se acumulan los puntos, de forma que se muestren siempre los puntos aun terminando una partida, poner un botón de inicio y otro de finalizar.
Por ahora me sale todo bien, excepto que siempre se me mete por la misma sentencia en puntos acumulados y gane quien gane se los da siempre al jugador 1.
¿ De que otra forma debería haberlo hecho o que tengo que cambiar ?, por otra parte como hago un botón finalizar que interactue en el código del sub_button1 que es el botón de iniciar ?.
Public Class Form1
Dim T_PUNTOS_J1 As Short
Dim T_PUNTOS_J2 As Short
Dim I As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim NUM_ACERTAR As Short
Dim NUM As Short
Dim PISTAS As Short
Dim B As Boolean = False
Dim C_INTENTOS As Short = 0
Dim C_INTENTOS_J2 As Short = 0
For Me.I = 0 To 999
NUM_ACERTAR = InputBox("Que el arbitro introduzca un nº entre 1 y 100")
Do Until NUM_ACERTAR >= 1 And NUM_ACERTAR <= 100
NUM_ACERTAR = InputBox("Introduzca un nº entre 1 y 100")
Loop
Do
If B = False Then
B = True
C_INTENTOS = C_INTENTOS + 1
NUM = InputBox("Turno del Jugador 1, intento nº: " & C_INTENTOS, "Turno Jugador 1", 0)
TextBox4.Text = TextBox4.Text & " Numero: " & NUM & Chr(13) & Chr(10)
Else
B = False
C_INTENTOS_J2 = C_INTENTOS_J2 + 1
NUM = InputBox("Turno del Jugador 2, intento nº: " & C_INTENTOS_J2, "Turno Jugador 2", 0)
TextBox4.Text = TextBox4.Text & " Numero: " & NUM & Chr(13) & Chr(10)
End If
'MENSAJES DE TEXTO PISTAS
If NUM_ACERTAR > NUM Then
PISTAS = NUM_ACERTAR - NUM
ElseIf NUM_ACERTAR < NUM Then
PISTAS = NUM - NUM_ACERTAR
ElseIf NUM = NUM_ACERTAR Then
PISTAS = 0
End If
If PISTAS <= 3 Then
TextBox1.Text = "QUEMANDO"
ElseIf PISTAS <= 7 Then
TextBox1.Text = "CALIENTE"
ElseIf PISTAS <= 15 Then
TextBox1.Text = "TEMPLADO"
Else
TextBox1.Text = "FRIO"
End If
'RECUENTOS DE LOS PUNTOS ACUMULADOS
If C_INTENTOS = 1 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 10
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 2 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 8
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 3 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 6
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 4 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 4
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 5 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 2
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS_J2 = 1 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 10
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 2 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 8
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 3 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 6
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 4 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 4
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 5 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 2
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
End If
TextBox2.Text = T_PUNTOS_J1
TextBox3.Text = T_PUNTOS_J2
Loop Until C_INTENTOS >= 5
I = 99999
Next
End Sub
End Class
Encuentro una posible solución diferenciando el numero que entre el jugador 1 y el jugador 2, pero me parece mal hecho porque duplico código y lo que es peor, saldría bien porque son 2 jugadores, pero si fueran 23 jugadores queda completamente descartada esa opción.
Prueba a así.
Public Class Form1
Dim T_PUNTOS_J1 As Short
Dim T_PUNTOS_J2 As Short
Dim I As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim NUM_ACERTAR As Short
Dim NUM As Short
Dim PISTAS As Short
Dim B As Boolean = False
Dim C_INTENTOS As Short = 0
Dim C_INTENTOS_J2 As Short = 0
For Me.I = 0 To 999
NUM_ACERTAR = InputBox("Que el arbitro introduzca un nº entre 1 y 100")
Do Until NUM_ACERTAR >= 1 And NUM_ACERTAR <= 100
NUM_ACERTAR = InputBox("Introduzca un nº entre 1 y 100")
Loop
Do
If B = False Then
B = True
C_INTENTOS = C_INTENTOS + 1
NUM = InputBox("Turno del Jugador 1, intento nº: " & C_INTENTOS, "Turno Jugador 1", 0)
TextBox4.Text = TextBox4.Text & " Numero: " & NUM & Chr(13) & Chr(10)
Else
B = False
C_INTENTOS_J2 = C_INTENTOS_J2 + 1
NUM = InputBox("Turno del Jugador 2, intento nº: " & C_INTENTOS_J2, "Turno Jugador 2", 0)
TextBox4.Text = TextBox4.Text & " Numero: " & NUM & Chr(13) & Chr(10)
End If
'MENSAJES DE TEXTO PISTAS
If NUM_ACERTAR > NUM Then
PISTAS = NUM_ACERTAR - NUM
ElseIf NUM_ACERTAR < NUM Then
PISTAS = NUM - NUM_ACERTAR
ElseIf NUM = NUM_ACERTAR Then
PISTAS = 0
End If
If PISTAS <= 3 Then
TextBox1.Text = "QUEMANDO"
ElseIf PISTAS <= 7 Then
TextBox1.Text = "CALIENTE"
ElseIf PISTAS <= 15 Then
TextBox1.Text = "TEMPLADO"
Else
TextBox1.Text = "FRIO"
End If
'RECUENTOS DE LOS PUNTOS ACUMULADOS
'///AQUI VERIFICAMOS QUIEN ESTA JUGANDO
If B = True Then
If C_INTENTOS = 1 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 10
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 2 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 8
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 3 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 6
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 4 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 4
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 5 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 2
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
End If
Else
If C_INTENTOS_J2 = 1 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 10
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 2 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 8
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 3 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 6
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 4 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 4
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 5 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 2
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
End If
End If
TextBox2.Text = T_PUNTOS_J1
TextBox3.Text = T_PUNTOS_J2
Loop Until C_INTENTOS >= 5
I = 99999
Next
End Sub
End Class
saludos
Muchas gracias! ya veo lo que me faltaba !
;-)
Yo te aconsejaria que una vez que lo hayas terminado, empezar de nuevo, no es muy largo como para que demores mucho. Al empezar de nuevo lo pensaras mejor en un papel con lapicera para poder organizarte mejor en el codigo y para que te sea mas facil entenderlo en el futuro y hacerle cambios.
Digo porque hay cosas como esta:
If B = True Then
If C_INTENTOS = 1 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 10
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 2 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 8
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 3 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 6
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 4 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 4
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
ElseIf C_INTENTOS = 5 And NUM = NUM_ACERTAR Then
T_PUNTOS_J1 = T_PUNTOS_J1 + 2
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J1"
End If
Else
If C_INTENTOS_J2 = 1 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 10
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 2 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 8
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 3 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 6
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 4 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 4
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
ElseIf C_INTENTOS_J2 = 5 And NUM = NUM_ACERTAR Then
T_PUNTOS_J2 = T_PUNTOS_J2 + 2
C_INTENTOS = 6
TextBox1.Text = "HAS GANADO J2"
End If
End If
Donde se repite siempre And NUM = NUM_ACERTAR y se podria mejorar para hacer menos verificaciones y que sea mas rapido el codigo y sea mas claro.
if NUM = NUM_ACERTAR Then
select case: C_INTENTOS
case 1:
T_PUNTOS_J1 = T_PUNTOS_J1 + 10
.....
.....
Justo es este tipo de cosas las que me fallan :), yo mismo he visto muy raro tanto if... y elseif junto y repetido, lo que no me he dado cuenta es que justo como dices con un select case puedo usarlo para todas las opciones :).
Gracias de nuevo :D