Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: RistiNolla(vb)

Sivun loppuun

petrinm [04.03.2004 19:34:03]

#

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.
...

Createman [04.03.2004 19:35:59]

#

Tee CommandButtoneita ja laita arrayhyn.

setä [04.03.2004 19:45:45]

#

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.

petrinm [04.03.2004 19:46:08]

#

Saiskos vähän selvennystä noista.

setä [04.03.2004 20:25:23]

#

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!

minapamina [04.03.2004 20:39:28]

#

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

petrinm [04.03.2004 21:50:13]

#

Ajattelin toteuttaa pelin tolla MINAPAMINAn ajatuksella, mutta saisko vielä vähän ehdotuksia miten tarkistus toimisi, kun kenttä on "Dim Rata(10,10)" muodossa.

remontti-reiska [05.03.2004 08:16:29]

#

Eli teetkö nyt tekoälyä vai yksi vastaan yksi kamppailuja (ihmisten välillä)?

petrinm [05.03.2004 14:58:20]

#

Ihminen VASTAAN Ihminen

hunajavohveli [05.03.2004 16:52:44]

#

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.

setä [05.03.2004 17:09:59]

#

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ä!

Antti Laaksonen [05.03.2004 23:07:00]

#

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

scorppio [10.06.2004 11:08:44]

#

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?

setä [10.06.2004 15:38:19]

#

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.

Antti [10.06.2004 16:09:27]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta