kryds og bolle

Tags:    visual-basic

Har kigget lidt på den artikel som er skrevet omkring kryds og bolle
http://www.udvikleren.dk/article.php?techid=4&aid=223

synes dog at delen hvor der bliver undersøgt om man har vundet virker meget skidt. Har selv siddet og leget lidt med det, men ville høre om der var nogle herinde som kunne fortælle mig en smart møde at løse det på. Altså hvor den tjekkede de vandrette vertikale og skrå linjer. Har tænkt lidt på at tegne en linje og noge tmed at tjekke om krydserne lå på linjen. har iøvrigt lavet det hele lidt anderledes end guiden. Koden til de tjeg har lavet indtil videre ser ud som følger

Dim Krydsbolle As Integer
Dim Start As Integer
Dim Antalbolle As Integer
Dim Antalkryds As Integer






Private Sub Form_Load()
Randomize
Start = Int(Rnd * 2 + 1)
If Start = 2 Then
Lbltur.Caption = "bolle starter"
Krydsbolle = 2
Else
Lbltur.Caption = "kryds starter"
Krydsbolle = 1
End If
End Sub


Private Sub Img9_Click(Index As Integer)
If Krydsbolle = 1 Then
Img9(Index).Picture = Imgkryds.Picture
Krydsbolle = 2
Lbltur.Caption = "det er bolles tur"
Else
Img9(Index).Picture = Imgbolle.Picture
Krydsbolle = 1
Lbltur.Caption = "det er kryd's tur"
End If
Tjeksvar
End Sub


Public Sub Tjeksvar()
' her vil jeg så have svaret til at stå
End Sub



jeg benytter mig af et kontrolarray (med 9 felter hvor de alle sammen er tomme billeder som default). Derudover benytter jeg mig af 2 billeder som ikke er synlige men som indeholder hhv et kryds og en bolle. Når det er kryd's tur og man klilkker på et felt bliver der placeret et kryds og det samme med bolle.



8 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Jeg har valgt liste alle mulige løsninger op i et array da der kun er 8... De 3 første (0 til 2) betyder de tre vandrette løsninger fra top mod bunden. De 3 næste (3 til 5) betyder de tre lodrette løsninger fra venstre mod højre. Den næstsidste (6) betyder den skrå løsning, oppe i venstre hjørne og ned mod højre nederste hjørne. Den sidste (7) betyder den skrå løsning fra oppe i højre hjørne til nede i venstre hjørne...

Fold kodeboks ind/udKode 


Bemærk:
- Jeg går ud fra at dit control array starter fra 0...
- Hvis det skal være muligt at tage flere spil skal arrayet 'Solutions' gøres Public således at det kan cleares fra andre steder end i TjekSvar sub'en.
- Tjeksvar tjekker ikke om det er invalid input!
- Tjeksvar binder sig til opbygningen med at Krydsbolle er enten 1 eller 2!
- Tjeksvar kan ikke kaldes når som helst da den tager Index som et parametre. Dette kan dog løses hvis du sætter Solutions Public og deler funktionen over i to (fra der med kommentaren: "Now check if anybody won").
- Jeg benytter analytisk matematik, så lad bare være med at stille spørgsmål til udregningerne hvis du ikke forstår dem...

// Your brain is your weapon, do not waste it!!



hehe undskyd at jeg så aligevel spørger forstår ikke det her

Muligheder(Index \\ 3) = Muligheder(Index \\ 3) + krydsbolle ^ 2
Muligheder(3 + (Index Mod 3)) = Muligheder(3 + (Index Mod 3)) + krydsbolle ^ 2

tingen jeg ikke forstår her er hvad muligheder(index \\ 3) kommer til at stå for (altså i den første) det er ikke noget med matematikken i det men mere et spørgsmål om syntaks det vil hjælpe rigtig meget hvis du lige gad kommentere syntaksen lidt. Tror nok jeg skal forstå matematik delen :)



Muligheder eller Solutions som jeg brugte er jo et array. Så Solutions(I) vil returnere det element der står på I's plads...

Jeg har defineret Solutions som Static. Det betyder i modsætning til en alm Dim, at værdien (værdierne) bliver husket og er ens hver gang sub'en bliver kaldt. Desuden kan man ikke udefra få adgang til variabler defineret inden i en sub, men det ved du vel godt, hehe.

Når du opretter dine Pictureboxes sørgede du for at lave et control array sådan at de alle sammen fik samme navn, med Index som deres eneste forskel. Dette er især smart fordi du sparer en masse kode, da de jo praktisk talt gør det samme...
Dette gør at du sidder med talrækken fra 0 til 8 - hvilket er alle de tal Index i dit tilfælde kan tage form som - og det er dette du bruger når matematikken skal på plads!

Du kender sikkert til /, *, + og - tegnene.. \\ er lidt det samme som / bortset fra at vi fjerner alle decimalerne, dette kaldes en heltalsdivision. Så "Index \\ 3" betyder at... ja det ved du ;D

Ligeledes findes der 'mod'.. Dette returnere resten efter en division. Selv havde jeg lettest ved at forstå det da jeg så nogle eksempler:
0 mod 3 = 0
1 mod 3 = 1
2 mod 3 = 2
3 mod 3 = 0
4 mod 3 = 1
5 mod 3 = 2
6 mod 3 = 0
osv...

Faktisk ligger matematikken altså i at du har talrækken 0 til 8 og skal finde en matematisk betingelse således at kun tallene der passer til en løsning aktivere en kommando. Jeg har altså et array over alle de måder man kan få tre på stribe. Når jeg så får et tal (Index) bruger jeg noget matematik til at finde ud af hvilken en af disse løsninger det nye klik hjælper - fx vil et klik oppe i venstre hjørne (Index = 0) aktivere løsningerne: vandret øverst, lodret på venstre side, skrå fra venstre mod højre...

Når jeg siger aktivere løsningerne eller gavne løsningerne, mener jeg selvfølgelig at løsningen bliver tildelt en højere værdi. Hvis det er kryds tur bliver løsningernes værdi adderet med 1^2 som er lig med 1 og hvis det er bolles tur bliver løsningernes værdi tildelt med 2^2 som er lig med 4.
Så for at tjekke om kryds har vundet tjekke man bare om der findes nogle af løsningerne hvis værdi er lig med 3 (1+1+1), mens at hvis man skal tjekke om bolle har vundet skal man sammenligne løsningernes værdier med 12 (4+4+4).

// Your brain is your weapon, do not waste it!!



ved godt jeg har givet pointene og forstå nu til fulde din kode MANGE TAK FOR DET !!! men mangler en ide til hvordan jeg får linjen som har vundet til at blinke med hjælp fra den kode du lavede. vile sq være lækkert hvis du gad at skrive det. Problemet hvorfor jeg ikke forstod din kode lå i det der \\ men har jo så fundet ud af at det er det samme som int(/)




men mangler en ide til hvordan jeg får linjen som har vundet til at blinke med hjælp fra den kode du lavede. vile sq være lækkert hvis du gad at skrive det.


Hmm, jeg forstår ikke helt hvad du mener.. Er det tekstlinien hvor vinderen står der skal blinke (hvis ja, er dette en Label?), er det de tre pictureboxes der var med i den rigtige løsning der skal blinke eller er det en Line der skal ligges hen over de tre pictureboxs og derefter blinke?

// Your brain is your weapon, do not waste it!!



Det er picture boxen. Altså dvs den linje (af pictureboxes) som vandt. Har i øvrigt fundet ud af at det på den her måde bliver pænt svært at simulerer kunstig inteligens. Så hvis du har en løsning (behøver ikke skrive kode men bare forklarer) vil det være lækkert



Nej, det er ikke svære at lave intelligence når koden ser sådan ud... Når det er computerens tur analysere den bare dens muligheder som den alligevel ville have gjort. Og så kalde du bare funktionen: "Call Tjeksvar(Index)", hvor Index er computerens valg. Det eneste du skal huske er at ændre Krydsbolle variablen mellem 1 og 2 efter hver tur!

Med hensyn til det med blinkende pictureboxes kunne jeg forstille mig følgende. Den ene er at gøre Solutions arrayet til et dobbelt array: "Solutions(0 To 7)(1)" hvor du så benytter Solutions(0 To 7)(0) til det jeg har vist dig og Solutions(0 To 7)(1) til at indeholde de pictureboxes som den rigtige løsning påvirker. Når du har fundet en vinder kender du nemlig hvilken løsning der blev udløst (I)...

// Your brain is your weapon, do not waste it!!



Dette brugte jeg i mit Kryds og Bolle! Virker fint! :D

Fold kodeboks ind/udKode 


Med Venlig Hilsen
Morten Torndahl Pedersen



t