Duda ejercicio basico de programacion

Iniciado por arts, 24 Enero 2013, 21:07 PM

0 Miembros y 2 Visitantes están viendo este tema.

arts

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 ?.

Código (vbnet) [Seleccionar]

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


arts

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.

Danyfirex

#2
Prueba a así.


Código (vbnet) [Seleccionar]
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

arts

Muchas gracias! ya veo lo que me faltaba !
;-)

$Edu$

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:

Código (vbnet) [Seleccionar]

   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.

Código (vbnet) [Seleccionar]

if NUM = NUM_ACERTAR Then

     select case: C_INTENTOS

               case 1:
                     T_PUNTOS_J1 = T_PUNTOS_J1 + 10
                     .....
                     .....


arts

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