Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Väririvi VB6

tesmu [26.05.2010 18:15:19]

#

Hei!

Minulla on formi jossa on shapeista tehty seuraavanlainen kuva.

http://img33.imageshack.us/i/shapetus.jpg/

Olen tehnyt funktiot, jotta voin koordinaatin perusteella hakea (GetColor) värin ruudusta eli esim Color = GetColor(1, 1) hakee vasemmalta ylhäältä ensimmäisen ruudun värin. DisableC 1, 1 taas ns "Sammuttaa" värin kyseistä ruudusta eli nollaa ruudun.

Ongelmaksi nyt kuitenkin muodostuu algoritmi, ajatus ei vaan nyt jostainsyystä lennä. Eli tarkoitus olisi tehdä funktio joka tarkistaa rivin (käyttäen GetColor ja DisableC funktioita) jos on 3 samaa väriä tai yli niin funktio sammuttaa kyseiset 3 tai yli pötköt samoja värejä ja lisäksi 3 samasta väristä tulisi 1 * 50 pistettä (UpdatePoints summa funktiolla) ja 4 = 2 * 50 5 = 3 * 50 jne jne... Olisiko ideoita?

jalski [26.05.2010 19:53:35]

#

En tiedä Visual Basic:ista mitään, mutta osaat ehkä soveltaa allaolevaa ideaa...

Mitä, jos käyttäisit graafista ruudukkoa vain pelitilanteen esittämiseen ja mahdollisesti hiiren painallusten lukemiseen?

Itse yksinkertaisesti vain tallentaisin pelilaudan pelitilanteen 2-ulotteiseen taulukkoon. Taulukon ulottuvuudet olisivat siten, että x -ja y-suunnissa olisi sisäisesti kaksi ruutua enemmän, kuin pelilaudalla oikeasti on ruutuja.

Eli siis jotain allaolevan kaltaista:

# 12x12 pelilauta

000000000000
012234525530
015534444210
041425411440
025123415150
014134111120
021115315510
033515241110
021523212150
025542225520
032454142110
000000000000

 0 = EMPTY
 1 = YELLOW
 2 = VIOLET
 3 = RED
 4 = GREEN
 5 = WHITE

Huomaat, että pelilautaa ympäröi tyhjä kehys. Tämä helpottaa tarkistuksien tekemistä, koska vertailusilmukassa ei tarvitse itse huolehtia taulukon rajojen sisällä pysymisestä.

Omasta koodivinkistäni: Ristinollan verkkopelitoteutus Infernolle Limbolla voit yrittää katsoa mallia vertailujen toteuttamiseen taulukon avulla.

Jos et saanut tuosta mitään tolkkua, niin Nea tai Metabolix pystyvät varmaan selventämään, mitä yritin äsken selittää...

tesmu [26.05.2010 20:32:27]

#

Eipä tuosta paljon apua ollut. Itsellä muutamiakin eri virityksiä, mutta ne eivät toimi ihan halutulla tavalla.

Metabolix [26.05.2010 20:32:49]

#

Miten ratkaisisit ongelman käsin? Tietenkin valitsisit ensin ruudun ja laskisit sitten samanlaisia ruutuja siitä eteenpäin. Jos ruutuja kertyisi tarpeeksi, antaisit niistä pisteitä ja tyhjentäisit ne. Sitten jatkaisit laskuja taas seuraavasta (erivärisestä) ruudusta.

Tämän toteuttamisen pitäisi olla lasten leikkiä muutamalla sisäkkäisellä silmukalla. Mikä kohta aiheuttaa ongelmia?

tesmu [26.05.2010 20:38:39]

#

Suurin ongelma on ruutujen ns "Sammutus", pisteytys onnistuu suhteellisen helposti. Sammutettavat ruudut pitäisi merkata jotenkin. Olen onnistunut tekemään niin, että kaikki paitsi ensimmäinen ruutu jää päälle mutta muut sammuu. Pieni pseudkoodinpätkä voisi olla avuksi esim.

Metabolix [26.05.2010 20:45:52]

#

No sitten vain jatkat sammuttamista yhden pidemmälle.

Tässä on koko algoritmin pseudokoodi:

x0 = 1
kun x0 <= pituus
   x1 = x0
   kun x1 < pituus ja väri(x0) = väri(x1 + 1)
      x1 = x1 + 1
   määrä = x1 - x0 + 1
   jos määrä > 2
      pisteet = pisteet + (määrä - 2) * 50
      x = x0
      kun x <= x1
         sammuta x
         x = x + 1
   x0 = x1 + 1

Käytännössä esimerkiksi sisimän silmukan voi korvata helposti for-silmukalla.

tesmu [28.05.2010 01:46:26]

#

Joops kiitosta oikeen paljon. Sain ajatukseni taas "Lentämään" kun join pannullisen kahvia.

Tälläisellä koodilla sain kyseisen virityksen toimimaan...

Public Function CheckRowEx(row As Integer)
Dim oC As Long
oC = 0
Dim x As Integer
Dim g As Integer
Dim i As Integer

For i = 1 To 11
    For g = i + 1 To 11

        If GetColor(i, row) = vbWhite Or GetColor(g, row) = vbWhite Then
        Else
            If GetColor(i, row) = GetColor(g, row) Then
                oC = oC + 1

            Else
                If oC >= 2 Then
                    For x = i To i + oC

                        DisableC x, row
                        DoEvents
                    Next x
                End If
                If oC >= 2 Then
                    UpdatePoints oC * 50
                End If
                oC = 0
                i = g
            End If
        End If





        DoEvents
    Next g




    DoEvents
Next i


End Function

Vastaus

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

Tietoa sivustosta