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)