MycodezMedlem sedan feb. 2010445 inlägg Hej.
Jag sitter och gör en liten uppgift som min programmerings lärare gav mig. Det är att göra hänga gubben. Men nu har jag fastnat vid ett par ställer men jag tar ett fel i taget.
Det första problemet jag har är att det är en bugg i min kod som gör att men inte kan skriva ut allt man har gissat på om det e fel så ska det skrivas ut i en label som heter lbl_fel i den labeln ska så ska alla tidigare felaktiga bokstäver ochs skrivas ut? vart är felet?
här är koden för knappen gissa.
Man ska också ha 15 chanser på sig att gissa eller om man ska ha 5 extra chanser längre än vad ordet är.
Private Sub btn_Gissa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Gissa.Click
lbl_fel.Text = ""
lbl_Ratt.Text = ""
If lbl_fel.Text.Length >= 16 Then
MsgBox("Du förlorade!")
gbx_Gissa.Visible = False
gbx_res.Visible = False
End If
Dim int_x As Integer
Dim int_y As Integer
Dim int_z As Integer
Dim int_u As Integer
Dim int_k As Integer
Dim int_q As Integer
Dim str_gissa As String = txt_Gissa.Text
For int_x = 0 To int_length - 1
If str_gissa = str_ord(int_x) Then
lbl_Ratt.Text = lbl_Ratt.Text & str_gissa
End If
Next
If int_z > 0 Then
Else
lbl_fel.Text = lbl_fel.Text & str_gissa
End If
If lbl_fel.Text.Length >= 16 Then
MsgBox("du förlorade!")
btn_Gissa.Enabled = False
End If
For int_y = 0 To int_length - 1
If str_ord(int_y) = txt_Gissa.Text Then
str_visa(int_y) = str_gissa
End If
Next
lbl_ordet.Text = ""
For int_u = 0 To int_length - 1
lbl_ordet.Text = lbl_ordet.Text & str_visa(int_u)
Next
For int_q = 0 To int_length - 1
If str_visa(int_q) = "_" Then
int_k += 1
End If
Next
If int_k = 0 Then
MsgBox("Du vann!")
End If
End Sub
Hur gör man detta så det funkar och så?
Läser programmering B nu så jag kan inte allt än :stud men jag vill lära mig mer än vad jag kan :) men hjälper ni mig eller så förklara vad felet är och hur det ska se ut så e ni snälla :OO
/Mycodez
Min blogg ;)
Som koden är ju nu så kommer jag inte ens försöka förstå den.
Titta över hur du namnger saker så det blir enklare att läsa och hänga med.
T.ex. lbl_fel varflr inte kalla den för felLabel ??
gbx_Gissa, vad står gbx för?? alternativGruppBox kanske den kan heta eller?
int_x
int_y
varför så konstiga namn??
Alternativ1
Alternativ2 fungerar kanske bättre?
Det jag menar här är att jag försökt gissa mig till vad namnen i din kod betyder, försök beskriv bättre, man vill kunna läsa koden som en berättelse.
Ett annat tips är att Dim:a inte upp en massa variabler som du använder senare, använd dim på samma rad som du börjar använda den.
str_visa(int_u) alltså, str_visa(int_u) är en metod, skriv vad metoden utför, kanske bara visa??
Sista tipset fundera över om du inte vill skriva koden på engelska.
MycodezMedlem sedan feb. 2010445 inlägg gbx = groupbox och vi har lärt oss att koda såhär :( alla dim ska var i toppen för ha allt sånt samlat på ett ställe och ha massa dim:ar mitt i koden. men ska tänka på vad du säger :)
MycodezMedlem sedan feb. 2010445 inlägg Okej men hur hade du valt att skriva koden?
aronMedlem sedan mars 2004487 inlägg Fan nu vart jag sugen på att programmera ett hot-seat hänga gubbe spel. Bästa party spelet ever :D
Vad ska denna knapp göra, är det en knapp som användaren trycker på när denna gissar en bokstav eller när denna gissar på hela ordet?
Skriv in lite kommentarer så vi slipper gissa. Det är A&O när man programmerar :P + bra namn på grejor så man slipper kommentera vad dom är till för.. doh
Problem 1:
lbl_fel.Text = ""
Ska inte alla fel bokstäver sparas här? Nu skrivs det ju blankt varje gång nån trycker på knappen...
aronMedlem sedan mars 2004487 inlägg
Nickemannen skrev:
Ett annat tips är att Dim:a inte upp en massa variabler som du använder senare, använd dim på samma rad som du börjar använda den.
Enligt mig ett av dom sämsta tips någonsin, variabel deklarationer ska vara överst (i det scope som dom används) så man hittar dem enkelt. Ordning och reda ska det vara.
Du får gärna motivera varför man inte ska göra så.
btw, jag älskar språk som ADA då har man inget val :P
MycodezMedlem sedan feb. 2010445 inlägg Tack det rättade ut en del i den första frågan :)
men kommer åter med en kommenterad kod :)
MycodezMedlem sedan feb. 2010445 inlägg Här är all kod till hela programmet kanske ger er mer inblick hur programmet funkar
¨Public Class hangagubben
Dim str_ord() As String
Dim str_visa() As String
Dim int_length As Integer
Private Sub btn_angeord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_angeord.Click
Dim int_x As Integer = 0
Dim int_y As Integer = 0
Dim int_z As Integer = 0
int_length = txt_angeord.Text.Length
If int_length < 5 Then
MsgBox("Minst ett ord på 5 bokstäver och högst på 10 bokstäver!")
ElseIf int_length > 10 Then
MsgBox("Minst ett ord på 5 bokstäver och högst på 10 bokstäver!")
Else
ReDim str_ord(int_length - 1)
For int_x = 0 To int_length - 1
str_ord(int_x) = txt_angeord.Text.Substring(int_x, 1)
Next
txt_angeord.Text = ""
ReDim str_visa(int_length - 1)
For int_y = 0 To int_length - 1
str_visa(int_y) = " _ "
Next
lbl_ordet.Text = ""
For int_z = 0 To int_length - 1
lbl_ordet.Text = lbl_ordet.Text & str_visa(int_z)
Next
btn_angeord.Enabled = False
txt_angeord.ReadOnly = True
gbx_Angeord.Text = "Lägg till ord (Ej tillgänligt)"
gbx_Gissa.Visible = True
gbx_res.Visible = True
End If
End Sub
Private Sub btn_Gissa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Gissa.Click
If lbl_fel.Text.Length >= 16 Then
MsgBox("Du förlorade!")
gbx_Gissa.Visible = False
gbx_res.Visible = False
End If
Dim int_x As Integer
Dim int_y As Integer
Dim int_z As Integer
Dim int_u As Integer
Dim int_k As Integer
Dim int_q As Integer
Dim str_gissa As String = txt_Gissa.Text
For int_x = 0 To int_length - 1
If str_gissa = str_ord(int_x) Then
lbl_Ratt.Text = lbl_Ratt.Text & str_gissa 'här ska bara posetiva bokstäver skrivas ut
End If
Next
If int_z > 0 Then
Else
lbl_fel.Text = lbl_fel.Text & str_gissa 'Här ska bara negativa bokstäverna ut bara
End If
If lbl_fel.Text.Length >= 16 Then
MsgBox("du förlorade!")
btn_Gissa.Enabled = False
btn_angeord.Enabled = True
txt_angeord.ReadOnly = False
End If
'Här skiver jag ut bokstäver om man gissade på rätt bokstav, annars så skiver man bara ut _ som innan.
'och man skriver ut den rätt gissade bokstaven på rätt ställe.
For int_y = 0 To int_length - 1
If str_ord(int_y) = txt_Gissa.Text Then
str_visa(int_y) = str_gissa
End If
Next
lbl_ordet.Text = ""
For int_u = 0 To int_length - 1
lbl_ordet.Text = lbl_ordet.Text & str_visa(int_u)
Next
For int_q = 0 To int_length - 1
If str_visa(int_q) = "_" Then
int_k += 1
End If
Next
If int_k = 0 Then
MsgBox("Du vann!")
End If
End Sub
End Class
MycodezMedlem sedan feb. 2010445 inlägg det i i private sub btn_Gissa som jag har delat tidigare:)
MycodezMedlem sedan feb. 2010445 inlägg vill ni adda mig på msn och så och diskutera koden så kan ni göra det på robba_lw@live.se eller sök på min email på fb och adda mig som vän där om ni vill det
LedelMedlem sedan dec. 2004735 inlägg
aron skrev:
Enligt mig ett av dom sämsta tips någonsin, variabel deklarationer ska vara överst (i det scope som dom används) så man hittar dem enkelt. Ordning och reda ska det vara.
Du får gärna motivera varför man inte ska göra så.
btw, jag älskar språk som ADA då har man inget val :P
Jag håller med er båda. Men i det här fallet, när de används till loopar (eller liknande) kan de deklareras där de används, eftersom de bara används just där. Skulle de användas på flera ställen håller jag med dig om att de ska deklareras överst. Men som i den här koden - där de används.
aronMedlem sedan mars 2004487 inlägg
Ledel skrev:
Jag håller med er båda. Men i det här fallet, när de används till loopar (eller liknande) kan de deklareras där de används, eftersom de bara används just där. Skulle de användas på flera ställen håller jag med dig om att de ska deklareras överst. Men som i den här koden - där de används.
Kollade in koden lite mera, for-looparna är inte nästlade, han borde bara använda en index variabel som han återanvänder.
aronMedlem sedan mars 2004487 inlägg
Mycodez skrev:
hur menar du?
Se detta exempel:
Dim int_x As Integer = 0
Dim int_y As Integer = 0
For int_x = 0 To int_length - 1
str_ord(int_x) = txt_angeord.Text.Substring(int_x, 1)
Next
For int_y = 0 To int_length - 1
str_visa(int_y) = " _ "
Next
Varför använda två olika variabler till for-satserna om man inte använde värdet dom har efter att for satsen körts.
Så här skulle jag gjort:
' Index variabel för for-loopar
Dim i As Integer = 0
' loop som gör nånting
For i = 0 To int_length - 1
str_ord(i) = txt_angeord.Text.Substring(i, 1)
Next
' loop som gör något annat
For i = 0 To int_length - 1
str_visa(i) = " _ "
Next
' loop som gör inget
For i = 0 To 20
' inget görs här :P
Next
CompusaMedlem sedan jan. 20022 952 inlägg
aron skrev:
Enligt mig ett av dom sämsta tips någonsin, variabel deklarationer ska vara överst (i det scope som dom används) så man hittar dem enkelt. Ordning och reda ska det vara.
Du får gärna motivera varför man inte ska göra så.
Om man måste deklarera variablerna överst i sina metoder för att kunna hitta dom, så bör man nog se över längden på sina metoder. Sedan så tycker jag att du säger emot dig själv lite. Först så skriver du att variabeldeklarationer ska vara överst, samtidigt som du skriver "i det scope som dom används". Om du deklarerar alla variabler överst i en metod så gör du variablerna tillgängliga i "scopet" för hela metoden. Att deklarera variabler i det scope som dom används, innebär ju precis det som Nickemannen skriver. Om du exempelvis bara använder en variabel inom ett if-block så deklarerar du variabeln inom det här blocket. Att deklarera variabeln överst i metoden och göra den tillgänglig i "scopet" för hela metoden är "felaktigt", eftersom du endast använder variabeln i "scopet" för if-blocket.
Det är mycket bättre att deklarera variabler där man behöver dem, t.ex. ur refactoring-synpunkt. Dessutom så ser man ganska snabbt vad en variabel används till iom att den tilldelas på samma ställe som den deklareras.
Om man har svårt att hitta i funktionerna så är det, som sagt, läge att dela upp dem i mindre bitar.
Att använda en massa understreck i namn är bara hemskt, och att lägga till skumma prefix är en kvarleva ifrån mystisk vb 6-kod. (10 år gammal ovana.) I vs.net så finns det intellisense osv så prefix är totalt onödigt, bara stökar till det.
Om jag ska vara lite elak så undrar jag inte om det är läraren som kanske borde sitta i skolbänken..
LaspMedlem sedan juli 200010 197 inlägg onkelborg har absolut en hållbar synpunkt.
Det språk man kan är bäst, och varje språk har sina sätt att lyfta fram en standard.
Det finns alltså inte ett rätt i denna fråga.
Det viktiga är att det är lätt att komma in i ett program efter en tid, glömskeomfånget är stort när det gäller variabler och dess funktion.
Så kom ihåg att den som lär ut inte kanske kan alla språk, inte vill att eleverna skall använda andra skrivsätt.
Men detta med ReFactoring kommer att vara betydelsefullt i framtiden, så försök att hålla ihop det hela säger Lasp.
aronMedlem sedan mars 2004487 inlägg
Compusa skrev:
Sedan så tycker jag att du säger emot dig själv lite. Först så skriver du att variabeldeklarationer ska vara överst, samtidigt som du skriver "i det scope som dom används".
Överst i det scope/block dom används... jag skrev inte överst i metoden.
Jag är van vid andra språk/standarder där detta är ett måste och jag ser en fördel med att kunna se alla deklarerade variabler för ett block överst i blocket.
Verkar som man kan göra lite hur man vill i .net antar att det kanske hör till style guides.
Kunde inte hålla mig... bifogat finnes HangMAN (no sorce code). Testa om det funkar?
Mja, i .NET så används inte prefix alls. VB 6 hade dock gott om prefix.. Understreck är förbehållet privata variabler i språk som inte gör skillnad på stora och små bokstäver (vb.net.) Visst, internt så döper kompilatorn t.ex. en getter till en property till "get_PropertyName", men det är ingenting man ser någonting av.
Att deklarera variabler någon annanstans än där de ska vara är klart opraktiskt eftersom att det gör koden mer svårläslig då det inte är lika lätt att följa variablerna. Dessutom är det krångligare att bryta loss kod för att lägga dem i en egen funktion/flytta runt. Att lägga deklarationer på ett visst stället eftersom att något annat språk kräver det är inget bra argument. (Ska man tänka på det viset så bör man t.ex. undvika properties eftersom att java inte stödjer dem, och man bör hålla sig till FORTRANs namngivningsregler.)
Ytterligare en grej som visar att .NET inte är tänkt att användas på det sättet att man deklarerar först, skriver kod sen, är "var". En väldigt bra konstruktion om jag får säga det själv.. ;)
aron skrev:
Enligt mig ett av dom sämsta tips någonsin, variabel deklarationer ska vara överst (i det scope som dom används) så man hittar dem enkelt. Ordning och reda ska det vara.
Du får gärna motivera varför man inte ska göra så.
btw, jag älskar språk som ADA då har man inget val :P
Det blir mindre rader kod att behöva läsa igenom för att förstå metoden.
Kan du motivera varför du vill hitta dom genom.
Varför det är bättre att ha "ordning och reda", samt att deklarera dom överst?