Permalänk

Hjälp med Visual Basic!

Hej kära Sweclockare. Det är så att jag precis börjat på högskolan och vi har en kurs som innehåller en del programmering i VB.

Jag har aldrig förr programmerat i hela mitt liv och känner otroligt vilsen o hjälplös.

Vi har fått en laboration att göra ett spel, Hängagubbe och jag inte den blekaste om hur fan jag skall gå till väga.

Mitt problem just nu är att jag vill få consolen att skriva ut mitt slumpvis valda ord som * istället för att faktiskt skriva ut ordet som sådant.

Module Module1
Dim ordbok As New IPITord.Ordlista
Sub Main()
Dim ordet As String = ordbok.GetWord()
Dim betydelse As String = ordbok.GetMeaning(ordet)
Dim gissatOrd As String = ordet
For i = 0 To ordet.Length - 1
gissatOrd = gissatOrd & "*"

Next

Console.WriteLine(gissatOrd)
Console.ReadLine()
End Sub

End Module

Så ser min kod ut just nu. Mitt problem är att den skriver ut ordet och ordet som *

Jag gissar att mitt problem ligger i
dim gissatOrd
Men jag har inte den blekaste vad jag skall sätta gissatOrd som.

Ursäkta om detta är rörigt som fan men jag e helt vilse. Förstår ingenting av den här jävla programmeringen :S

Permalänk
Medlem
Skrivet av DBHErazor:

Hej kära Sweclockare. Det är så att jag precis börjat på högskolan och vi har en kurs som innehåller en del programmering i VB.

Jag har aldrig förr programmerat i hela mitt liv och känner otroligt vilsen o hjälplös.

Vi har fått en laboration att göra ett spel, Hängagubbe och jag inte den blekaste om hur fan jag skall gå till väga.

Mitt problem just nu är att jag vill få consolen att skriva ut mitt slumpvis valda ord som * istället för att faktiskt skriva ut ordet som sådant.

Module Module1
Dim ordbok As New IPITord.Ordlista
Sub Main()
Dim ordet As String = ordbok.GetWord()
Dim betydelse As String = ordbok.GetMeaning(ordet)
Dim gissatOrd As String = ordet
For i = 0 To ordet.Length - 1
gissatOrd = gissatOrd & "*"

Next

Console.WriteLine(gissatOrd)
Console.ReadLine()
End Sub

End Module

Så ser min kod ut just nu. Mitt problem är att den skriver ut ordet och ordet som *

Jag gissar att mitt problem ligger i
dim gissatOrd
Men jag har inte den blekaste vad jag skall sätta gissatOrd som.

Ursäkta om detta är rörigt som fan men jag e helt vilse. Förstår ingenting av den här jävla programmeringen :S

OK, det här ska vi nog kunna reda ut. Dock har jag inte kodat VB på tio år (mest Matlab och VBA nu för tiden) men det verkar som om ditt problem mest är logiska fel.
Jag är inte insatt i IPITord-objektet, så jag vet inte vad den returnerar på GetWord(), men skall den inte har någon inparameter?
Oavsett så det väl fel att sen tilldela det ordet till gissatOrd (Dim gissatOrd As String = ordet) och sen förlänga med *. Du borde initiera gissatOrd som tomt och sen fortsätta som du gjorde för att få rätt antal asterisker, så kommer du att ha rätt svar i Ordet och ett lika långt ord av asterisker i gissatOrd.

Sen är det lite konstigt att kalla den variabeln för gissatOrd, då den i själva verket är rätt svar i asterisk-format, gissatOrd bör ju vara användarens input.
Hur tänkte du läsa den inputen sen btw? Finns många val beroende på hur då tänkt göra, men eftersom det är superenkelt att skapa formulär i VB så rekommenderar jag det!

mvh

Visa signatur

Intel i5 4670K + Hyper 212 EVO
Gigabyte GA-Z87-HD3
Fractal Design Define S
Asus GTX1070 Dual

Permalänk
Skrivet av Bazzie:

OK, det här ska vi nog kunna reda ut. Dock har jag inte kodat VB på tio år (mest Matlab och VBA nu för tiden) men det verkar som om ditt problem mest är logiska fel.
Jag är inte insatt i IPITord-objektet, så jag vet inte vad den returnerar på GetWord(), men skall den inte har någon inparameter?
Oavsett så det väl fel att sen tilldela det ordet till gissatOrd (Dim gissatOrd As String = ordet) och sen förlänga med *. Du borde initiera gissatOrd som tomt och sen fortsätta som du gjorde för att få rätt antal asterisker, så kommer du att ha rätt svar i Ordet och ett lika långt ord av asterisker i gissatOrd.

Sen är det lite konstigt att kalla den variabeln för gissatOrd, då den i själva verket är rätt svar i asterisk-format, gissatOrd bör ju vara användarens input.
Hur tänkte du läsa den inputen sen btw? Finns många val beroende på hur då tänkt göra, men eftersom det är superenkelt att skapa formulär i VB så rekommenderar jag det!

mvh

ordbok.GetWord() är länkat till den .dll fil som automatisk hämtar ett slumpmässigt valt ord ifrån ordlistan som .dll filen innehåller.

Nu har jag fått lite hjälp och löst detta första problem! Tack för tipsen so far
Hade aldrig kunnat klura ut att man skulle ha en tom variabel och att man fick den genom att skriva = ""

Såhär ser min kod ut just nu!

Module Module1
Dim ordbok As New IPITord.Ordlista

Sub Main()
Dim ord As String = ordbok.GetWord()
Dim ordlängd As Integer = ord.Length
Dim doltOrd As String = ""

For Counter = 0 To ordlängd - 1
doltOrd = doltOrd & "*"
Next

Console.WriteLine("Nu är det dags att gissa på en bokstav i det dolda ordet")
Console.WriteLine(doltOrd)
Console.WriteLine("Bokstav: ")
Dim bokstav As Char = Console.ReadLine.ToUpper()

Console.ReadLine()

End Sub

End Module

Så nästa steg är att när du skriver in en bokstav så skall den kolla bokstaven mot ordet och sedan skriva ut asterisker samt rätt gissad bokstav. Några tips?

Det jobbigaste med programmeringen är att jag inte riktigt greppar hur man skall tänka för att klura sig fram till lösningarna. Inte ens när jag ser lösningen är jag 100% säker på hur den fungerar

Tänkte att jag gör ett Consol program först och sen går vidare till Forms när jag har kolla på grunderna. Känns som om det borde vara enklare att göra ett Consol program eller?

Permalänk
Medlem

dim found as boolean
For Counter = 0 To ordlängd - 1
if mid(ord,Counter,1) = bokstav then
doltOrd = left(doltOrd,Counter-1) & bokstav & right(doltOrd,ordläng-Counter-1)
found = true ' För att se till att vi håller reda på om bokstaven fanns
else
end if
Next
if not found then do_hang_code()
found = false ' redo för nytt text, ny bokstav

Det går att göra liknande saker genom att söka i textsträngar också, men tror ändå att detta kanske är enklast att greppa. Om bokstav finns på given position i orginalordet, så byt då ut * mot bokstav på samma pos i det dolda ordet, genom att rekonstruera det med mid, left och right-funktionerna.
Att klura sig till lösningarna är nog ren erfarenhet, tankesättet kommer ganska automatiskt med tiden. Det viktigaste är att inse strukturen i programmering, vilken i grunden (ditt fall) är rent iterativ, dvs rad för rad. På högre nivå blir den som du kanske hört talas om objektorienterad, men det är inget att bry sig om nu.
Consol blir fint i det här syftet. Du kan behöva korrigera ovan kod en del, men det är bara ett snabbt utkast som jag slängde ihop på fikarasten på jobbet

Tab + space funkar *inte* i forum som det gör i kompilatorn ;)
Visa signatur

Intel i5 4670K + Hyper 212 EVO
Gigabyte GA-Z87-HD3
Fractal Design Define S
Asus GTX1070 Dual

Permalänk
Skrivet av Bazzie:

dim found as boolean
For Counter = 0 To ordlängd - 1
if mid(ord,Counter,1) = bokstav then
doltOrd = left(doltOrd,Counter-1) & bokstav & right(doltOrd,ordläng-Counter-1)
found = true ' För att se till att vi håller reda på om bokstaven fanns
else
end if
Next
if not found then do_hang_code()
found = false ' redo för nytt text, ny bokstav

Det går att göra liknande saker genom att söka i textsträngar också, men tror ändå att detta kanske är enklast att greppa. Om bokstav finns på given position i orginalordet, så byt då ut * mot bokstav på samma pos i det dolda ordet, genom att rekonstruera det med mid, left och right-funktionerna.
Att klura sig till lösningarna är nog ren erfarenhet, tankesättet kommer ganska automatiskt med tiden. Det viktigaste är att inse strukturen i programmering, vilken i grunden (ditt fall) är rent iterativ, dvs rad för rad. På högre nivå blir den som du kanske hört talas om objektorienterad, men det är inget att bry sig om nu.
Consol blir fint i det här syftet. Du kan behöva korrigera ovan kod en del, men det är bara ett snabbt utkast som jag slängde ihop på fikarasten på jobbet

Tusen tack för att du tar dig tid och försöker hjälpa mig! Det uppskattas verkligen!

Jag har läst igenom din kod och jag tror att jag förstår på ett ungefär. Hade aldrig stött på Mid, Left och Right innan så hade ingen aning om att man kunde använda dessa.

doltOrd = Left(doltOrd, Counter - 1)

Right(doltOrd, ordlängd - Counter - 1)

Vad exakt händer i dessa 2 fall? Vad är det som programmet utför här? DEt är denna biten jag inte hänger med på

Sen så när jag stoppar in koden i programmet och försöker köra den bara på skojj så stöter jag på patrull.
Programmet startar och den frågar efter en bokstav, man skriver in en bokstav vilken som helst. Då crashar programmet och det kommer en info ruta som säger:
"Argumentet Start måste vara större än noll."

Och den "highlighta" detta:
If Mid(ord, Counter, 1) = bokstav Then

Återigen tusen tack! Ska ta o läsa på om mid, left o right nu!

Permalänk
Medlem

Anledningen att den hänger sig är en liten detalj : for Counter = 0 to... gör att Counter kör första rundan som värdet 0 vilket inte går att ge till Mid(), så skriv om så här istället: If Mid(ord, Counter+1, 1) = bokstav Then... så blir det nog bra.

Jag antar att du har lite koll på funktioner i alla fall? Dvs anrop med () i princip som tar inargument inom parantesen. Dessa brukar (men måste inte) ge ett resultatvärde tillbaka. Det finns två varianter i princip:
De som gör något, ett mängd instruktioner, på befintliga objekt men som inte ger något tillbaks på raden där de anropades, ex Writeline; den åstadkommer något utan ett nödvändigt returvärde
De som gör något och returnerar resultatet, dvs på raden där de anropas så förvandlas de till sitt returvärde när koden körs, ex
nyttord = left("Meningen eller ordet som vi utgår ifrån", 6) är exakt samma sak som nyttord = "Mening"
nyttord = mid("Meningen eller ordet som vi utgår ifrån", 9, 5) är exakt samma sak som nyttord = "eller"
nyttord = right("Meningen eller ordet som vi utgår ifrån", 5) är exakt samma sak som nyttord = "ifrån"

Endast mid tar tre argument (sträng, pos, length) eftersom du måste säga åt den på vilket tecken den skall börja (1=från början)

Visa signatur

Intel i5 4670K + Hyper 212 EVO
Gigabyte GA-Z87-HD3
Fractal Design Define S
Asus GTX1070 Dual

Permalänk
Hedersmedlem
Skrivet av DBHErazor:

Sen så när jag stoppar in koden i programmet och försöker köra den bara på skojj så stöter jag på patrull.
Programmet startar och den frågar efter en bokstav, man skriver in en bokstav vilken som helst. Då crashar programmet och det kommer en info ruta som säger:
"Argumentet Start måste vara större än noll."

Och den "highlighta" detta:
If Mid(ord, Counter, 1) = bokstav Then

Mid("abcd", x, y)
returnerar y tecken från och med position x, men till skillnad från många andra språk räknar visual basic vanligtvis från 1 istället för 0. Tecken 1 i "abcd" är alltså 'a' (och 0 finns inte). Counter bör alltså räkna från 1 till ordlängd.

Passa även på att lära dig använda avlusaren. Håll muspekaren över variabler till exempel; innehåller ord vad du förväntar dig? Man kan även se hur värden förändras efter att man till exempel kör mid eller liknande. Klicka i marginalen (eller tryck på f9) för att placera en brytpunkt och använd sedan till exempel f10 för att stega dig genom programmet.

Permalänk

Okej, here we go. Så här är min kod so far:

Module Module1
Dim ordbok As New IPITord.Ordlista

Sub Main()
Dim ord As String = ordbok.GetWord()
Dim betydelse As String = ordbok.GetMeaning(ord)
Dim ordlängd As Integer = ord.Length
Dim doltOrd As String = ""
Dim bokstav As Char
Dim försök As Integer = 7
Dim gissatOrd As String = ""

Console.WriteLine("Dags att spela hänga gubbe!")
Console.WriteLine()
Console.WriteLine("Här följer en beskrivning av ordet som en ledtråd")
Console.WriteLine()
Console.WriteLine("Ordet betyder: " & betydelse)
For Counter = 0 To ordlängd - 1
doltOrd = doltOrd & "*"
Next
Console.WriteLine(ord)
Console.WriteLine("Nu är det dags att gissa på en bokstav i det dolda ordet")
Console.WriteLine()
Console.WriteLine(doltOrd)
Console.WriteLine()
Console.WriteLine("Ordet innehåller " & ord.Length & " bokstäver")
Console.WriteLine()
Console.WriteLine("Gissa en bokstav: ")
bokstav = Console.ReadLine.ToUpper()

End Sub

End Module

Så om vi går på vad som sagts tidigare:

Läs in ordet i en temporär variabel.

Detta är jag helt med på och det gör jag ju när jag lagrar ordet i variabeln ord.

När jag sedan har ordet lagrat så vill jag att programmet skriver ut ordet som * istället för att faktiskt visa ordet. Detta sker här:

For Counter = 0 To ordlängd - 1
doltOrd = doltOrd & "*"

Jag tror att jag förstår hur detta är uppbyggt, FOR-Loopen körs så många gånger som ordet har antal bokstäver. Dvs har ordet 7 bokstäver så körs loopen 7 ggr.
Och för varje gång loopen körs så skiver den ut doltOrd som en stjärna.
Så om ordet är 7 bokstäver långt körs loopen 7 ggr och då skriver den ut 7st sjärnor.

Nu vill jag att användaren skall börja gissa på en bokstav, vilken som helst. Denna bokstav lagrar jag som en Char eftersom det bara är en enda bokstav som skall lagras.
Sen vill jag att programmet skall jämföra den gissade bokstaven med bokstäverna som finns lagrade i ord.

Det är här jag kör fast just nu

Om den hittar en bokstav som stämmer överens så skall den byta ut * mot den bokstaven.
I annat fall skall den tala om för användaren att gissningen var fel och tala om för användaren hur många försök han eller hon har kvar.

Lyckas man gissa rätt så skall man grattuleras för att man gissat rätt och i annat fall få veta att man misslyckats. Sedan skall man få välja om man vill avsluta spelet eller göra ett nytt försök med ett nytt ord.

Det är så nära jag kan komma o beskriva mitt problem. Sen ligger problemet i själva utförandet.
Personligen så känner jag bara att efter 3 föreläsningar och väldigt knapphändig information att jag inte har i närheten nog kunskap för att lösa en sån här uppgift men det tycker tydligen lärarna så...

Permalänk
Medlem
Skrivet av DBHErazor:

Och för varje gång loopen körs så skiver den ut doltOrd som en stjärna.

Inte riktigt; loopen skriver inte ut någonting, den ändrar bara på värdet av doltOrd genom att lägga till ett tecken (*). Skrivs ut gör den ju med Console.WriteLine(doltOrd)

Skrivet av DBHErazor:

Det är så nära jag kan komma o beskriva mitt problem. Sen ligger problemet i själva utförandet.
Personligen så känner jag bara att efter 3 föreläsningar och väldigt knapphändig information att jag inte har i närheten nog kunskap för att lösa en sån här uppgift men det tycker tydligen lärarna så...

Jo, det brukar vara så med programmering, när jag läste Matlab på universitetet så var det med folk som har 5 i snitt i de svåraste möjliga fysik- och mattekurserna, som ändå nätt och jämnt klarade programmeringen. Det går ofta snabbt fram och kräver att man snabbt hittar fram till den instinktiva förståelsen för hur man bygger upp kod.
Jag kan inte ge mycket tips där förutom att ta det stegvis och bryta ner i delar efterhand.

Så, nästa steg är att ta deltagarens gissning, det är ju lätt med readline. Nu har du förhoppningsvis en bokstav i "bokstav". Jag är osäker på om det fungerar då readline per automatik returnerar en sträng, och vissa programmeringsspråk (eller kompilatorer) är lite känsliga för att konvertera, det vill säga, ibland måste man hantera sådant för hand. Det är bara att prova såklart.
Härnäst vill du kolla bokstav mot ditt ord ("ord") och se om den finns i, och i så fall var. Här vill du titta på en bokstav i taget i ord, och sen tidigare är en bra idé att använda mid(), då den kan läsa valfri position och längd från en sträng. Positionen kommer öka, längden kommer vara konstant 1, detta löser du lätt med en for-loop.

dim found as boolean : found = 0
for pos = 1 to ordlängd
if mid(ord,pos,1) = bokstav then
' Här var det samma bokstav ja!
' Dags att sätta in denna i det dolda ordet!
doltOrd = left(doltOrd,pos-1) & bokstav & right(doltOrd,ordlängd-pos-1) ' Du får nog prova lite här så det blir helt rätt med positionerna
found = true
end
next
if found then
' här styr vi vad som händer om gissningen hittades...
else
' om den inte hittades lär vi väl hänga någon eller nåt...
end if

Visa signatur

Intel i5 4670K + Hyper 212 EVO
Gigabyte GA-Z87-HD3
Fractal Design Define S
Asus GTX1070 Dual

Permalänk
Hedersmedlem

Angående hur man ska tänka så måste du bryta ner problemet till minsta möjliga nivå. Vad är det du egentligen gör när du spelar hänga gubben med någon? Nu får du tänka dig att du är den som kommit på ordet, dvs datorn i detta fallet. Det underlättar om du tänker dig att du skriver ner allt du vill komma ihåg på lappar, vilket då blir en variabel. Du kommer att använda fler variabler än det du skrivit på lappar, för datorn behöver använda variabler till allt.

- Det första som händer är att du kommer på ett ord och skriver på en lapp.
- Du ska sedan tala om för personen som ska gissa hur ordet ser ut. När jag gör detta med mina barn skriver vi streck på ett papper, ett streck för varje bokstav. Du använder stjärnor. Skriv rätt antal stjärnor på en lapp och visa användaren.
- Nu ska användaren gissa. Ta emot hans gissning och skriv den på en lapp.
- Nästa steg är att kolla användarens gissning mot det rätta ordet. Om du nu har streck på din lapp så kan du återanvända samma lapp. Det samma kan du göra med din variabel. Det du gör när du kollar gissningen är att du går igenom alla bokstäverna från den ena änden till den andra och kollar bokstav för bokstav. Om användaren har gissar rätt bokstav byter du ut motsvarande streck/stjärna mot bokstaven som gissades. Här måste du också tänka på stor/liten bokstav. Något som vi inte tänker på, men som är väldigt viktigt för datorn.
- Visa användaren den uppdaterade lappen med streck/stjärnor.
- Kolla sedan om spelaren har gissar rätt, dvs det finns inga streck/stjärnor kvar i ordet. Om han gissat rätt är det slut. Spelaren har vunnit
- Rita ett streck på gubben.
- Kolla om gubben är klar, dvs alla streck är ritade. Om alla streck är ritade är det slut. Spelaren har förlorat.
- Hoppa tillbaka till gissa bokstav så att användaren kan fortsätta.

Det är typ denna processen du måste gå igenom i huvudet när du programmerar. Vad är nästa steg mot mitt slutmål? En del steg kan realiseras med en enkel rad kod, andra måste delas ner ytterligare och bli flera rader kod. När du sedan blir mer avancerad så kan du stoppa ett eller flera steg i en funktion för att kunna återanvända kod eller för att öka läsbarheten.

En del av stegen i hänga gubben är grundläggande tekniker inom programmering. Det finns tex två loopar. Den yttre är att man ska hålla på att gissa bokstäver tills man bedömer att spelet är slut. Detta är ett exempel på en loop som har ett specifikt villkor för att avslutas. Dessa brukar byggas mha en while- eller until-loop. Den inre är att man ska gå igenom alla bokstäver i en lista vilket brukar byggas som en for-loop.

Visa signatur

Använd gilla för att markera nyttiga inlägg!