Olen tässä jonkin aikaa miettinyt, mikä olisi helpoin tapa tehdä 20x20 kokoinen ristikko ristinollaa varten.
Ehdottakaa mikä olisi helpoin keino.
Tuossa on yksi, mutta se on vaikea ja vähän moni mutkainen.
1. Tehdä hirveä määrä Picture-bokseja.
...
Tee CommandButtoneita ja laita arrayhyn.
Tee yks PictureBoxi, jonka Scalemode = 0 eli User. Skaalaat sen sitten niin, että ScaleWidth ja Scaleheight ovat 20. Valitse sopiva fonttikoko, joka täyttää ruudun. Ruutu valitaan CurrentX ja CurrentY avulla.
Saiskos vähän selvennystä noista.
Tuolla skaalauksella voit osoittaa ruutuja rivi- ja sarakenumeroilla. Esim kolmas ruutu neljännellä rivillä osoitetaan CurrentX = 2 ja CurrentY = 3. Hiirellä klikattaessa otetaan hiiren X ja Y koordinaateista kokonaisosa (CurrentX = Int(X)). Pohjalle on helppo piirtää halutunlainen ruudukko. Kokeile!
Formille tarvii picture1 nimisen cotrol arrayn.
For i = 1 To 100 Load Picture1(i) With Picture1(i) .Left = x * Picture1(0).Width .Top = y * Picture1(0).Height .Height = Picture1(0).Height .Width = Picture1(0).Width .Visible = True End With x = x + 1 If i Mod 10 = 0 Then y = y + 1: x = 0 Next i Picture1(0).Visible = False 'piilotetaan alkuperäinen
Ajattelin toteuttaa pelin tolla MINAPAMINAn ajatuksella, mutta saisko vielä vähän ehdotuksia miten tarkistus toimisi, kun kenttä on "Dim Rata(10,10)" muodossa.
Eli teetkö nyt tekoälyä vai yksi vastaan yksi kamppailuja (ihmisten välillä)?
Ihminen VASTAAN Ihminen
Rata(10, 10)? Ettet tarkoittaisi Rata(20, 20)?
No ihan vaan:
If rata(x, y) = jotain THEN jotain...
En oikein ymmärtänyt, mitä tarkoitit. Jos kerran kaikki on tallennettu matriisiin, niin matriisista tarkistetaan.
No jos sulla on matriisielementit 1...100 10x10 ruudukossa, niin peräkkäiset nollat tai ruksit on peräkkäisinä indekseinä edellyttäen, että kymmenluku pysyy samana. Samassa sarakkeessa, jos indeksit 10 välein, ristikkäin jos indeksit 9 tai 11 välein. Käykää ihmeessä hiihtämässä välillä!
Ei missään tapauksessa kannata tehdä erillistä kontrollia joka ruutua kohden vaan tallentaa tiedot tavalliseen taulukkoon. Ruudukon ja merkkien piirtäminen onnistuu ihan hyvin Line- ja Circle-komennoilla. Ja tosiaan kannattaa valita ScaleWidth ja ScaleHeight ruudukon koon mukaan, jolloin piirtokomennoissa voi antaa koordinaatit kokonaislukuina ruudun rivin ja sarakkeen perusteella.
Tässä on vähän laajempi esimerkkiohjelma:
'ruutuihin liittyvät vakiot Const TYHJA = 0 Const RISTI = 1 Const NOLLA = 2 'ruudukon leveys ja korkeus Const LEVEYS = 10, KORKEUS = 10 Dim Ruudukko(1 To LEVEYS, 1 To KORKEUS) As Integer Private Sub Form_Click() 'tyhjennetään ruudukko TyhjennaRuudukko 'laitetaan risti kohtaan (1, 1) AsetaRuutu 1, 1, RISTI 'laitetaan nolla kohtaan (2, 2) AsetaRuutu 2, 2, NOLLA 'laitetaan nolla kohtaan (7, 3) AsetaRuutu 7, 3, NOLLA 'piirretään ruudukko formille PiirraRuudukko End Sub 'asettaa ruudun tilan (tyhjä, risti tai nolla) Sub AsetaRuutu(rivi As Integer, sarake As Integer, arvo As Integer) Ruudukko(rivi, sarake) = arvo End Sub 'palauttaa ruudun tilan (tyhjä, risti tai nolla) Function HaeRuutu(rivi As Integer, sarake As Integer) As Integer HaeRuutu = Ruudukko(rivi, sarake) End Function 'tyhjentää ruudukon Sub TyhjennaRuudukko() Dim i As Integer, j As Integer For i = 1 To KORKEUS For j = 1 To LEVEYS AsetaRuutu j, i, TYHJA Next Next End Sub 'piirtää ruudukon formille Sub PiirraRuudukko() 'muutetaan piirtokomentojen asteikko ruudukon kooksi ScaleWidth = LEVEYS ScaleHeight = KORKEUS Cls Dim i As Integer, j As Integer For i = 1 To KORKEUS 'piirretään vaakaviivat Line (0, i)-(LEVEYS, i) For j = 1 To LEVEYS 'piirretään pystyviivat Line (j, 0)-(j, KORKEUS) 'piirretään ristit ja nollat Select Case HaeRuutu(j, i) Case RISTI Line (j, i)-(j + 1, i + 1) Line (j + 1, i)-(j, i + 1) Case NOLLA Circle (j + 0.5, i + 0.5), 0.5, , , , Height / Width End Select Next Next End Sub
setä kirjoitti:
Tee yks PictureBoxi, jonka Scalemode = 0 eli User. Skaalaat sen sitten niin, että ScaleWidth ja Scaleheight ovat 20. Valitse sopiva fonttikoko, joka täyttää ruudun. Ruutu valitaan CurrentX ja CurrentY avulla.
Eli olen nyt tehnyt yhden pictureBoxin ja laittanut nuo arvot kyseisiin arvoihin. Fonttikooksi laitin arial ja 20, mutta viivoja ei pictureboxiin tule.MIKSI?
Ruutu valitaan CurrentX ja CurrentY avulla, mitä tämä tarkoittaa tässä ruudukon tekemisessä.?
Olen aloittanut visual basicin kanssa opiskelemisen tasan kuukausi sitten ja nyt jo pyydetään koulussa tekemään ristinolla peli, onko kohtuutonta?
Oletko koittanut tuota ylläolevaa Antti L:n esimerkkiä.
Jos Scale-asetukset on OK, CurrentX ja CurrentY ovat suoraan indeksejä vaakasuuntaan ja pystysuuntaan. Vasemmalla ylhäällä on ruutu 0,0, oikealla ylhäällä 19,0 ja oikealla alhaalla 19,19.
Ruudukko ei ilmaannu tyhjästä vaan se on piirrettävä kuten tuossa yo. esimerkissäkin.
On hieman vaikea ottaa kantaa tehtävän kohtuuttomuudesta, kun ei tiedä montako tuntia on ollut ja mitä tunneilla on käsitelty ja millainen ristinollapeli on tehtävä. Voi olla kohtuuton tai sitten ei.
Kaimahan teki hyvän piirtopohjan kilpailuakin silmällä pitäen - en viitsinyt edes vielä alkaa miettimään piirtopintaa, kun pähkäilin loppoaikana (lue:"työaikana") tekoälyn rakennetta.
Onhan se hyvä saada näkymään ne siirrot myös ruudulla, etteivät tekoälyt pääse tekoälyttämään ;)
Kohtuutonta olisi pyytää teitä ohjelmoimaan oppilastyönä verohallinnon taloushallinto - ristinolla ei nyt ole mikään mahdoton tehtävä - kyllä sen saa pähkäiltyä ja erittäin hyvää opetusta jatkoa silmällä pitäen.... siinä erotellaan sopivalla tasolla jyvät akanoista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.