Vraagje VB.net (beginner)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Daan5000
  • Registratie: September 2009
  • Laatst online: 25-11-2021
Hallo,

Ik moet voor school (1ste jaar ib) het spel galgje maken in vb. Ik weet hoe ik het wil doen maar zit met een vraag.
Mijn code tot nu toe (een deel ervan)

code:
1
2
3
4
5
6
7
8
9
10
11
12
 Dim intTeller As Integer
        Dim strLetter As String = txtLetter.Text
        Dim strNieuwWoord As String = "programma"

            For intTeller = 0 To strWoord.Length - 1 Step 1
                If strWoord(intTeller) = strLetter Then
                    txtWoordOmTeRaden.Text += strLetter
                Else
                    txtWoordOmTeRaden.Text += "*"
            End If
            Next
    End Sub


Als je dit dan uitvoert en de letter 'm' gokt, krijg je "******mm*' waar op zich niets mis mee is. Als ik opnieuw een gok wil maken, nu met de letter 'p' dan krijg ik 'p********'. Dit wordt dan achter mijn vorig woord geplakt.

De bedoeling is dat hij in die "******mm*' blijft werken.

Moet enkel nog een deel aan mijn code toevoegen (zoja welk deel?) of moet ik op een volledig andere manier te werk gaan?

Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Je bent al een stukje op weg. Iedere keer '*'-tjes toevoegen is niet nuttig, dat kan beter 1 keer op het begin natuurlijk. Kun je niet beter een StringBuilder gebruiken? Daarbij kun je een karakter op een bepaalde positie in een te bouwen string veranderen (zeg een '*' in een bepaalde letter).

Dat programmeren met str*, int* en txt* (hungarian notation) lijkt me niet zo nuttig, aangezien de IDE al aangeeft wat wat is. Verder kan strLetter beter een char zijn. "Step 1" is standaard, en kan weg. De inspringing klopt niet (met name op regel 10). :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:18

Haan

dotnetter

Nuttige term die hierbij van toepassing is, is de 'scope' van variabelen. Jij de maakt nu steeds een nieuwe string aan, dus is het logisch dat hij de oude waarde kwijtraakt. Je moet dus een variabele buiten dat stuk code gebruiken.

Sowieso kan je waarschijnlijk beter aan de slag met String.Replace. Je hebt dan het te raden woord in een (constante) variabele, en de huidige staat van het woord, die je steeds bijwerkt. Dus als de 'm' wordt geraden, replace je de posities waar de 'm' moet komen staan, bij de 'p', alle 'p's etc.

succes!

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • brambo123
  • Registratie: December 2006
  • Laatst online: 12:38
Als je nauw eens geen * toevoegt maar de text die er al hebt? :X
spoiler:
txtWoordOmTeRaden.Text(intTeller)

Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 12:52
Ik zou hier denk ik een array vullen met sterretjes. Die array is even lang als er tekens in je woord zitten. Op het moment dat een letter geraden is (regel 7) verander je het sterretje in de array naar de letter die je geraden hebt. Daarna plak je de array weer aan elkaar. Belangrijk is dat je die array wel bewaart. Dat doe je nu niet.

Acties:
  • 0 Henk 'm!

  • Daan5000
  • Registratie: September 2009
  • Laatst online: 25-11-2021
jip_86 schreef op donderdag 13 mei 2010 @ 16:23:
Ik zou hier denk ik een array vullen met sterretjes. Die array is even lang als er tekens in je woord zitten. Op het moment dat een letter geraden is (regel 7) verander je het sterretje in de array naar de letter die je geraden hebt. Daarna plak je de array weer aan elkaar. Belangrijk is dat je die array wel bewaart. Dat doe je nu niet.
Hallo,
Bedankt voor je hulp.
Heb de sterretjes nu in een array geplaatst:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub btnLetterRaden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLetterRaden.Click
        Dim arrSterretjes(strWoord.Length - 1) As String
        Dim intTeller As Integer

        For intTeller = 0 To strWoord.Length - 1
            arrSterretjes(intTeller) = "*"
        Next

        Dim intTeller2 As Integer
        For intTeller2 = 0 To strWoord.Length - 1
            If txtLetter.Text = strWoord(intTeller2) Then
                arrSterretjes(intTeller2) = txtLetter.Text
            Else
                arrSterretjes(intTeller2) = arrSterretjes(intTeller2)
            End If
        Next

        Dim intTeller3 As Integer
        For intTeller3 = 0 To strWoord.Length - 1
            txtTeRadenWoord.Text &= arrSterretjes(intTeller3)
        Next

    End Sub

Om de overzichtelijkheid van mijn code te bevorderen heb ik in 3 verschillende lussen gemaakt i.p.v. alles in 1 lus.

Nu is mijn enigste probleem nog die scope, zoals Haan zegt. Ik weet wat de scope van een variabele doet, (boven procedures en functie declareren), maar weet niet hoe dit het probleem kan oplossen dat hij die strings er steeds opnieuw achter plakt.
De bedoeling is dus dat hij het woord met de gevonden letters behoudt zodat je bij de volgende poging met het deels gedecodeerde woord begint.

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 10:31

NetForce1

(inspiratie == 0) -> true

Je zult de array met sterretjes bij moeten houden als instance-variabele van je klasse of module. En dus niet, zoals je nu doet binnen de sub. Initializeren van deze array kun je dan doen in de constructor van je klasse, of in deze sub (check of de variabele al geinitializeerd is).

Je plakt overigens zelf de nieuwe string achter de bestaande inhoud van txtTeRadenWoord.Text, die zul je moeten overschrijven ipv appenden.

[ Voor 20% gewijzigd door NetForce1 op 13-05-2010 17:33 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Daan5000
  • Registratie: September 2009
  • Laatst online: 25-11-2021
NetForce1 schreef op donderdag 13 mei 2010 @ 17:31:
Je zult de array met sterretjes bij moeten houden als instance-variabele van je klasse of module. En dus niet, zoals je nu doet binnen de sub. Initializeren van deze array kun je dan doen in de constructor van je klasse, of in deze sub (check of de variabele al geinitializeerd is).

Je plakt overigens zelf de nieuwe string achter de bestaande inhoud van txtTeRadenWoord.Text, die zul je moeten overschrijven ipv appenden.
als ik het juist heb is de instance variabele hetzelfde als de scope van een variabele (ben slechts beginner in vb 8) ). Dit heb ik nu gedaan.

Je mag hem toch ook niet laten overschrijven? bv. *r**r****, je doet een volgende poging: p --> p********
Hij moet verder werken met die eerste dus dit zou het resultaat moeten zijn: pr**r****

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 12:38
Zoals andere mensen zeggen, de geraden letters zul je ergens buiten de scope moeten opslaan, om ze te kunnen hergebruiken. Dit kan je gebruiken om het letters te onthouden die geraden zijn, en daaruit kan je makkelijk het woord tot nu toe bouwen.

Dus bij het woord programma:
Begin *********
m -> ******mm* (onthoud m)
p -> p*****mm* (onthoud m & p)
r -> pr**r*mm* (onthoud m & p & r)

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 10:31

NetForce1

(inspiratie == 0) -> true

Daan5000 schreef op donderdag 13 mei 2010 @ 17:51:
[...]

Je mag hem toch ook niet laten overschrijven? bv. *r**r****, je doet een volgende poging: p --> p********
Hij moet verder werken met die eerste dus dit zou het resultaat moeten zijn: pr**r****

Alvast bedankt
Je moet ook niet die variabele overschrijven, maar de inhoud van je tekstveld.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 12:52
Daan5000 schreef op donderdag 13 mei 2010 @ 17:29:
[...]


Hallo,
Bedankt voor je hulp.
Heb de sterretjes nu in een array geplaatst:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub btnLetterRaden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLetterRaden.Click
        Dim arrSterretjes(strWoord.Length - 1) As String
        Dim intTeller As Integer

        For intTeller = 0 To strWoord.Length - 1
            arrSterretjes(intTeller) = "*"
        Next

        Dim intTeller2 As Integer
        For intTeller2 = 0 To strWoord.Length - 1
            If txtLetter.Text = strWoord(intTeller2) Then
                arrSterretjes(intTeller2) = txtLetter.Text
            Else
                arrSterretjes(intTeller2) = arrSterretjes(intTeller2)
            End If
        Next

        Dim intTeller3 As Integer
        For intTeller3 = 0 To strWoord.Length - 1
            txtTeRadenWoord.Text &= arrSterretjes(intTeller3)
        Next

    End Sub

Om de overzichtelijkheid van mijn code te bevorderen heb ik in 3 verschillende lussen gemaakt i.p.v. alles in 1 lus.

Nu is mijn enigste probleem nog die scope, zoals Haan zegt. Ik weet wat de scope van een variabele doet, (boven procedures en functie declareren), maar weet niet hoe dit het probleem kan oplossen dat hij die strings er steeds opnieuw achter plakt.
De bedoeling is dus dat hij het woord met de gevonden letters behoudt zodat je bij de volgende poging met het deels gedecodeerde woord begint.
Je moet nog 4 dingen doen.
1. De array bewaren buiten de scope van dit click event.
2. De array hoeft niet elke keer gevuld te worden met sterretjes (1e loop), dat kan je bij het opstarten doen.
3. De else uit de tweede loop is niet nodig. Het sterretje is nl al in de array aanwezig.
4. Je doet &=. Dat werkt goed voor het verwerken van de array, maar hiermee blijft ook de tekst van de vorige poging staan. Eerst leegmaken dus of een tijdelijke string gebruiken en die er over heen zetten.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Daan5000 schreef op donderdag 13 mei 2010 @ 17:29:
Visual Basic .NET:
2
3
4
5
6
7
        Dim arrSterretjes(strWoord.Length - 1) As String
        Dim intTeller As Integer

        For intTeller = 0 To strWoord.Length - 1
            arrSterretjes(intTeller) = "*"
        Next
Dit is samen te vatten als (en met het type wel goed als karakter-array ipv String-array):
Visual Basic .NET:
2
        Dim arrSterretjes = new String("*"c, strWoord.Length).ToCharArray()

Dat c-tje aan het einde van "*" betekend dat het om een enkel karakter gaat.
Of, opgesplitst en met betere naamgeving omdat er later niet alleen sterretjes in staan
Visual Basic .NET:
2
3
        Dim sterretjes = new String("*"c, woord.Length)
        Dim geraden = sterretjes.ToCharArray()

String heeft trouwens ook een constructor die van een karakter-array weer een string maakt.
Visual Basic:
1
     Dim geradenAlsString = new String(geraden)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Daan5000
  • Registratie: September 2009
  • Laatst online: 25-11-2021
pedorus schreef op vrijdag 14 mei 2010 @ 00:17:
[...]

Dit is samen te vatten als (en met het type wel goed als karakter-array ipv String-array):
Visual Basic .NET:
2
        Dim arrSterretjes = new String("*"c, strWoord.Length).ToCharArray()

Dat c-tje aan het einde van "*" betekend dat het om een enkel karakter gaat.
Of, opgesplitst en met betere naamgeving omdat er later niet alleen sterretjes in staan
Visual Basic .NET:
2
3
        Dim sterretjes = new String("*"c, woord.Length)
        Dim geraden = sterretjes.ToCharArray()

String heeft trouwens ook een constructor die van een karakter-array weer een string maakt.
Visual Basic:
1
     Dim geradenAlsString = new String(geraden)
Thank you so much *O*
Heb dit nog toegevoegd en het werk nu.
txtTeRadenWoord.Text = String.Empty
Maar kan voor vandaag al galgje meer zien :p

Iedereen heel erg bedankt voor de hulp d:)b
Pagina: 1