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
questo inizializza le variabili globali che mi servonocodice: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 è quello che fanno i bottoni d&d e vampirecodice: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 è il tasto acquisiscicodice: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
non mi da errori o warnings di sorta e quando lo si esegue sembra funzionare.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
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)

Rispondi quotando