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?
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ää...
Eipä tuosta paljon apua ollut. Itsellä muutamiakin eri virityksiä, mutta ne eivät toimi ihan halutulla tavalla.
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?
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.
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.
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.