Sto scrivendo un programma per una amica, che gestisca l'iniziativa in D&D o mondo di tenebra. Quello che dovrebbe fare è prendere un nome e un modificatore di iniziativa, sommarci il tiro random di un dado a 20 facce e mostrare in una textbox le iniziative, ordinate (dalla maggiore alla minore). Premettendo che non sono un esperto di vb, gradirei non venissero contestate le scelte di codici fatte, perché probabilmente la mia conoscenza arriva fin li (anche se consigli per snellire sono sempre ben accetti)

ecco un immagine della facciata



ora vi copio l'intero codice


queste sono le variabili globali
codice:
     Dim lungharray As Short = 5
     Dim nomeglob(30) As String
     Dim inizglob(30) As Byte
     Dim modifglob(30) As Byte
     Dim numerodado As Byte
     Dim boxtesto As String
questo inizializza le variabili globali che mi servono
codice:
Private Sub frminiziativa_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim zero As Byte
       For zero = 0 To 29
           nomeglob(zero) = ""
           inizglob(zero) = 0
           modifglob(zero) = 0
       Next zero
   End Sub
questo è quello che fanno i bottoni d&d e vampire
codice:
SPOILER (clicca per visualizzare)
CODICE
Private Sub dungeon_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dungeon.CheckedChanged
       If dungeon.Checked = True Then
           numerodado = 19
           boxtesto = "Il programma tira automaticamente il D" & numerodado + 1 & ", inserisci il modificatore di iniziativa"
       End If
   End Sub
------------------------------------------------------------
   Private Sub vampire_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles vampire.CheckedChanged
       If vampire.Checked = True Then
           numerodado = 9
           boxtesto = "Il programma tira automaticamente il D" & numerodado + 1 & ", inserisci il modificatore di iniziativa"
       End If
   End Sub
questo è il tasto acquisisci
codice:
Private Sub cmdiniziativa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdiniziativa.Click
       Dim nome As String
       Dim modif As Byte
       Dim iniz As Byte
       Dim nometemp(30) As String
       Dim modiftemp(30) As Byte
       Dim iniztemp(30) As Byte
       Dim memo As Byte
       Dim cont1 As Byte
       Dim cont2 As Byte
       Dim cont3 As Byte
       Dim controlloin As String
       Dim ris As String
       Randomize()
       For cont1 = 0 To 29
           nometemp(cont1) = ""
       Next
       nome = InputBox("Inserisci il nome", "Acquisizione Dati")
line1:
       controlloin = InputBox(boxtesto, "Acquisizione Dati")
       If IsNumeric(controlloin) = True Then
           modif = CSByte(controlloin)
           iniz = modif + Rnd() * numerodado + 1
       Else
           MsgBox("Devi inserire un numero")
           GoTo line1
       End If
       For cont1 = 0 To 29
           If nomeglob(cont1) = "" Then
               nometemp(cont1) = nome
               iniztemp(cont1) = iniz
               modiftemp(cont1) = modif
               cont1 = 29
           Else
               nometemp(cont1) = nomeglob(cont1)
               iniztemp(cont1) = inizglob(cont1)
               modiftemp(cont1) = modifglob(cont1)
           End If
       Next
       For cont2 = 0 To 29
           For cont3 = 0 To 29
               If inizglob(cont2) < iniztemp(cont3) Then
                   inizglob(cont2) = iniztemp(cont3)
                   modifglob(cont2) = modiftemp(cont3)
                   nomeglob(cont2) = nometemp(cont3)
                   memo = cont3
               ElseIf inizglob(cont2) = iniztemp(cont3) Then
                   If modifglob(cont2) < modiftemp(cont3) Then
                       inizglob(cont2) = iniztemp(cont3)
                       modifglob(cont2) = modiftemp(cont3)
                       nomeglob(cont2) = nometemp(cont3)
                       memo = cont3
                   End If
               End If
           Next
           iniztemp(memo) = 0
           modiftemp(memo) = 0
           nometemp(memo) = ""
       Next
       ris = ""
       For cont1 = 0 To 29
           If nomeglob(cont1) <> "" Then
               ris = ris + nomeglob(cont1) + " - " + CStr(inizglob(cont1)) + "(" + CStr(modifglob(cont1)) + ")" & vbCrLf
           End If
       Next
       txtris.Text = ris
   End Sub
non mi da errori o warnings di sorta e quando lo si esegue sembra funzionare.
per non starvi a far leggere l'intero codice vi dico brevemente quello che (almeno per me) dovrebbe fare:

acquisisce un nome e un modificatore iniziativa, a questo modificatore somma un numero random compreso tra 1 e 20 e lo aggiunge questi 3 valori (nome, iniziativa e mod iniziativa) nelle variabili temp (che poi verranno copiati nelle variabili globali). se le variabili globali contengono già dei valori, questi vengono copiati nelle variabili temp e poi riordinati nelle variabili globali. teoricamente è tutto un cancella e sostituisci però se lo si esegue 5-6 volte (non da l'errore sempre nello stesso punto) salta fuori questo errore se per dire inserisco 4 iniziative, che verranno visualizzate come "nome - iniziativa (mod iniz) mi apparirà ad esempio

marco - 25(5)
gino - 16(8)
paolo - 16(4)
francesco - 10(2)

fin qui dovrebbe essere tutto ok, i nomi sono ordinati per iniziativa e, in caso di iniziative uguali sono ordinati per modificatore di iniziativa.
solo che inserendo un altro valore mi trovo ad avere una situazione come questa

marco - 25(5)
simone - 23(7)
gino - 16(6)
paolo - 16(4)
paolo - 16(4)
francesco - 10(2)

se continuassi ad aggiungere nomi paolo "lieviterebbe" sempre di più... e non riesco a capire come mai... dagli esperimenti che ho fatto questa cosa succede casualmente e senza uno specifico trigger (non so come tradurlo XD) ed è proprio per questo che non riesco a capire come mai non funziona T_T chi mi riesce a dare una mano?
(grazie anticipatamente ai paladini che si faranno avanti)