Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    7

    [VB2010] caricare parole da file di testo

    Ciao a tutti,
    io sto facendo il gioco dell'impiccato in Visual Basic 2010 e non mi manca molto per finire, però ho un problema:
    la parola da indovinare che mi carica dal file di testo è sempre la prima! Come mai? Cosa sbaglio?
    Questo è il codice:

    Private Function gioca()
    Dim n As Integer
    Dim parole As Collection
    parole = New Collection
    Randomize()
    Dim lettura As New StreamReader("C:\Impiccato\Parole.txt")
    parole.Add(lettura.ReadLine())
    n = (Rnd() * (parole.Count - 1) + 1)
    parolasegreta = parole.Item(n)
    lettura.Close()
    End Function

  2. #2
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Il tuo errore consiste nel fatto che aggiungi solo la prima linea di parole alla tua collection, e quindi verrà fuori sempre quella. Invece dovresti fare:
    codice:
    Do While Not lettura.EndOfStream()
         parole.Add(lettura.ReadLine())
    Loop
    Inoltre, visto che stai usando Visual Basic 2010, non usare la vecchia funzione rnd() di vb6 per generare numeri casuali. Invece dichiara una nuova istanza della classe Random e usa quella:
    codice:
    Dim Rand As New Random(Now.Millisecond)
    Dim NumeroCasuale as Long = 0
    NumeroCasuale = Rand.Next()
    Per finire, se posso darti un consiglio, quando scegli la nuova parola verifica che sia diversa dalla precedente.

    Buona programmazione.
    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    7
    Grazie , adesso mi dà parole diverse però...è sorto un altro problema!
    Dopo aver indovinato la prima parola in fase di debug mi ritorna al codice segnandomi
    If Char.ToLower(parolasegreta(i)) = lettera Then
    e dicendomi che l'Indice è oltre i limiti della matrice.

    Dim x As Integer
    For i = 0 To (Len(parolasegreta) - 1)
    If Char.ToLower(parolasegreta(i)) = lettera Then
    stringa = stringa.Insert(i, lettera).Remove(i + 1, 1)
    End If
    Exit For
    ElseIf i = (Len(parolasegreta) - 1) And Char.ToLower(parolasegreta(i)) = lettera Then
    tentativi = tentativi - 1
    If tentativi = 0 Then
    sconfitta()
    End If
    End If
    Next

    Sarò mai capace di terminarlo?

    Che poi, x dirla tutta, c'è anke il problema che se la parola ha doppie non me le segna (giustamente anke, dato che ho messo l'exit for xò non saprei in che altro modo potrei metterlo...)

    Imploro qualche tuo consiglio ShaleN

  4. #4
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Originariamente inviato da ciuro89
    Imploro qualche tuo consiglio ShaleN
    È la prima volta che qualcuno mi implora...

    Comunque, veniamo a noi.
    Prima di tutto due incorrettezze formali:
    Prima: a che ti serve la variabile x?
    Seconda: Non usare la vecchia funzione Len di vb6 per ottenere la lunghezza di una stringa. Piuttosto usa la sintassi NomeStringa.Length

    Poi mi permetto di dirti che il tuo codice è piuttosto incasinato. Io lo riscriverei in questa maniera:
    codice:
            'Questo codice è stato scritto in gentile concessione da ShaleN  (:D).  
            'La parte iniziale sono variabili che già hai.
            Dim parolasegreta As String = "Html.it"
            Dim lettera As Char = InputBox("Inserisci la lettera:")
            Dim stringa As String = "_____________"
            Dim Tentativi As Integer = 0
    
           'Prima di tutto controlla se la lettera è contenuta nella stringa.
            If Not parolasegreta.ToLower.Contains(lettera) Then
    
                Tentativi -= 1
                If Tentativi <= 0 Then
                    'Sconfitta()
                End If
    
                Exit Sub
    
            End If
    
            'Poi, se la lettera è contenuta nella parola, la inserisce nella stringa finale.
            For i = 0 To (parolasegreta.Length() - 1)
    
                If Char.ToLower(parolasegreta(i)) = lettera Then
                    stringa = stringa.Insert(i, lettera)
                End If
    
            Next
    Ancora non funziona per il problema delle doppie. Purtroppo ora devo andare. Dopo se ho tempo vedo cosa posso fare.


    EDIT:
    Come non detto avevo ancora tempo. Ho cambiato il codice e ora funziona anche con le doppie. Tuttavia di chiedo di non limitarti a fare copia-incolla del codice (come molti purtroppo fanno) ma di capire il perchè ed il percome di quello che ho scritto. Se non capisci chiedi pure.

    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    7
    Non ti avevo postato tutto il codice per cercare di render la alettura un pò più scorrevole e mi ero dimenticato di togliere anke la x.
    Cmq sono riuscito a far funzionare tutto!
    Adesso provo a metterlo un pò a posto seguendo i tuoi consigli!
    Grazie mille!!

    Ma come mai dici che non conviene usare la funzione len per ottenere la lunghezza di una stringa ma piuttosto NomeStringa.Length?
    Perché hanno cambiato?
    Ho visto che hanno fatto una cosa simile anke x randomize e la funzione rnd() che le hanno affiancate con random.next...

  6. #6
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Originariamente inviato da ciuro89
    Ma come mai dici che non conviene usare la funzione len per ottenere la lunghezza di una stringa ma piuttosto NomeStringa.Length?
    Perché hanno cambiato?
    Ho visto che hanno fatto una cosa simile anke x randomize e la funzione rnd() che le hanno affiancate con random.next...
    Non ti dico che non conviene, ti dico solo che è più corretto usare i nuovi metodi messi a disposizione dal Framework 3.5. Questo perchè vb6 (volenti o no) ormai è morto ed inoltre questo linguaggio non era Object Oriented: quindi era più che lecito che esistesse una funzione a parte per ottenere la lunghezza di una stringa oppure per generare un numero pseudocasuale.

    Visual Basic .NET, invece, è Object Oriented, quindi non solo è molto più sensato ma quasi obbligatorio creare una classe che rappresenti una stringa e che esponga un metodo per ricavare la lunghezza di tale stringa oppure creare una classe che rappresenti un generatore di numeri pseudocasuali e che esponga un metodo per ottenere il prossimo numero casuale.

    Spero di essermi spiegato bene.
    Ciao ciao.
    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    7
    Sì ho capito! Grazie

  8. #8
    ma le parole le hai memorizzate tutte in un .txt?
    Non c'è la possibilità di usare un dizionario? Sarebbe più semplice

  9. #9
    Originariamente inviato da ShaleN
    Questo perchè vb6 (volenti o no)...non era Object Oriented
    Esatto tutto ciò che hai scritto, ma la frase citata rischia di essere fraintesa da qualche utente: VB6 permetteva la programmazione orientata agli oggetti.

    Effettivamente però è cambiata lievemente la *mentalità* di programmazione, sia per quanto riguarda la gestione delle stringhe ma anche la dichiarazione dei tipi oppure il casting implicito: sono piccole differenze che fanno assomigliare VB.NET agli altri mass HLL.


    Buone Feste

  10. #10
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Originariamente inviato da MdE2005
    Esatto tutto ciò che hai scritto, ma la frase citata rischia di essere fraintesa da qualche utente: VB6 permetteva la programmazione orientata agli oggetti.
    Non lo sapevo, chiedo scusa.

    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.