Tämä on Suomessa melko tuntemattoman SET-korttipelin QBasic-versio.
Jokaisella kortilla on neljä ominaisuutta:
Pelissä täytyy etsiä kolmen kortin yhdistelmiä, joissa jokainen näistä ominaisuuksista on sama tai eri.
Esimerkiksi tässä on kelvollinen yhdistelmä:
Määrä ja kuvio on kaikissa korteissa eri, väri ja täyttö taas on kaikissa korteissa sama.
Nämä kortit eivät muodosta yhdistelmää:
Määrä on kahdessa kortissa sama, mutta yhdessä eri. Tämän takia yhdistelmä ei kelpaa.
Kun ominaisuuksia on neljä ja jokainen ominaisuus on yksi kolmesta vaihtoehdosta, korttien yhteismäärä on 81. Suurin määrä kortteja, joista ei voi muodostaa yhtään yhdistelmää, on 20.
Tässä QBasic-ohjelmassa pöydässä on aina riittävästi kortteja yhdistelmän muodostamiseksi. Yhdistelmään tulevat kortit valitaan nuolilla ja Enterillä. Kun kolme korttia on valittu, kortit poistuvat pöydästä, jos ne muodostavat yhdistelmän. Tarvittaessa pöytään lisätään samalla uusia kortteja. Peli loppuu painamalla Esciä.
Myös SET-pelin kotisivut ovat tutustumisen arvoiset: http://www.setgame.com/set/
DIM SHARED Pakka%(1 TO 81, 1 TO 4)
DIM SHARED Kortit%(1 TO 21, 1 TO 4)
DIM SHARED PakkaMaara%
DIM SHARED KorttiMaara%
DIM SHARED YhdistelmaMaara%
DIM SHARED Aanet%
RANDOMIZE TIMER
SCREEN 1
PakkaMaara% = 81
KorttiMaara% = 0
YhdistelmaMaara% = 0
Aanet% = -1
TeePakka
UudetKortit
PiirraPoyta
Peli
SCREEN 0
END
FUNCTION ArvoLuku% (ala%, yla%)
ArvoLuku% = INT((yla% - ala% + 1) * RND + ala%)
END FUNCTION
SUB LaskeYhdistelmat
YhdistelmaMaara% = 0
FOR a% = 1 TO KorttiMaara%
FOR b% = a% + 1 TO KorttiMaara%
FOR c% = b% + 1 TO KorttiMaara%
IF OnYhdistelma(a%, b%, c%) THEN
YhdistelmaMaara% = YhdistelmaMaara% + 1
END IF
NEXT
NEXT
NEXT
END SUB
SUB Loppu
CLS
FOR kuvio% = 1 TO 3
FOR maara% = 1 TO 3
FOR taytto% = 1 TO 3
FOR vari% = 1 TO 3
nopeusx! = ArvoLuku(5, 30) / 10
kimmo! = ArvoLuku(75, 90) / 100
nopeusy! = ArvoLuku(0, 20) / 10
y! = 0
FOR x! = 290 TO -30 STEP -nopeusx!
y! = y! + nopeusy!
nopeusy! = nopeusy! + .1
IF y! > 150 THEN
nopeusy! = -nopeusy! * kimmo!
y! = 150
END IF
PiirraTyhja CINT(x!), CINT(y!)
PiirraKortti CINT(x!), CINT(y!), kuvio%, vari%, taytto%, maara%
WAIT &H3DA, 8
IF INKEY$ = CHR$(27) THEN EXIT SUB
NEXT
NEXT
NEXT
NEXT
NEXT
END SUB
FUNCTION OnYhdistelma% (a%, b%, c%)
FOR d% = 1 TO 4
IF Kortit%(a%, d%) = Kortit%(b%, d%) THEN
IF Kortit%(a%, d%) <> Kortit%(c%, d%) THEN
OnYhdistelma% = 0
EXIT FUNCTION
END IF
IF Kortit%(b%, d%) <> Kortit%(c%, d%) THEN
OnYhdistelma% = 0
EXIT FUNCTION
END IF
END IF
IF Kortit%(a%, d%) <> Kortit%(b%, d%) THEN
IF Kortit%(a%, d%) = Kortit%(c%, d%) THEN
OnYhdistelma% = 0
EXIT FUNCTION
END IF
IF Kortit%(b%, d%) = Kortit%(c%, d%) THEN
OnYhdistelma% = 0
EXIT FUNCTION
END IF
END IF
NEXT
OnYhdistelma% = 1
END FUNCTION
SUB Peli
DIM Valitut%(21), Uudet%(21)
DIM ValittuMaara%, ValittuKortti%
ValittuKortti% = 1
ValittuMaara% = 0
PiirraKehys 1, 1
DO
SELECT CASE INKEY$
CASE CHR$(0) + "M"
PiirraKehys ValittuKortti%, 0
ValittuKortti% = ValittuKortti% + 3
IF ValittuKortti% > KorttiMaara% THEN
ValittuKortti% = ValittuKortti% - 21
END IF
WHILE ValittuKortti% < 1
ValittuKortti% = ValittuKortti% + 3
WEND
PiirraKehys ValittuKortti%, 1
CASE CHR$(0) + "K"
PiirraKehys ValittuKortti%, 0
ValittuKortti% = ValittuKortti% - 3
IF ValittuKortti% < 1 THEN
ValittuKortti% = ValittuKortti% + 21
END IF
WHILE ValittuKortti% > KorttiMaara%
ValittuKortti% = ValittuKortti% - 3
WEND
PiirraKehys ValittuKortti%, 1
CASE CHR$(0) + "P"
PiirraKehys ValittuKortti%, 0
ValittuKortti% = ValittuKortti% + 1
IF ValittuKortti% MOD 3 = 1 THEN
ValittuKortti% = ValittuKortti% - 3
END IF
IF ValittuKortti% > KorttiMaara% THEN
ValittuKortti% = ValittuKortti% - 3
WHILE ValittuKortti% MOD 3 <> 1
ValittuKortti% = ValittuKortti% + 1
WEND
END IF
PiirraKehys ValittuKortti%, 1
CASE CHR$(0) + "H"
PiirraKehys ValittuKortti%, 0
ValittuKortti% = ValittuKortti% - 1
IF ValittuKortti% MOD 3 = 0 THEN
ValittuKortti% = ValittuKortti% + 3
END IF
WHILE ValittuKortti% > KorttiMaara%
ValittuKortti% = ValittuKortti% - 1
WEND
PiirraKehys ValittuKortti%, 1
CASE CHR$(13)
IF Valitut%(ValittuKortti%) THEN
Valitut%(ValittuKortti%) = 0
ValittuMaara% = ValittuMaara% - 1
PiirraVarjo ValittuKortti%, 0
ELSE
Valitut%(ValittuKortti%) = 1
ValittuMaara% = ValittuMaara% + 1
Uudet%(ValittuMaara%) = ValittuKortti%
PiirraVarjo ValittuKortti%, 1
END IF
IF ValittuMaara% = 3 THEN
FOR i% = 1 TO 3
Valitut%(Uudet%(i%)) = 0
PiirraVarjo Uudet%(i%), 0
NEXT
ValittuMaara% = 0
IF OnYhdistelma(Uudet%(1), Uudet%(2), Uudet%(3)) THEN
Soita 1
SiirraPakkaan Uudet%(1)
SiirraPakkaan Uudet%(2)
SiirraPakkaan Uudet%(3)
LaskeYhdistelmat
IF YhdistelmaMaara% = 0 THEN
UudetKortit
END IF
PiirraPoyta
IF ValittuKortti% > KorttiMaara% THEN
ValittuKortti% = KorttiMaara%
END IF
PiirraKehys ValittuKortti%, 1
ELSE
Soita 2
END IF
END IF
CASE "a", "A"
Aanet% = NOT Aanet%
CASE "m", "M"
Soita 3
CASE "l", "L"
Loppu
EXIT SUB
CASE CHR$(27)
EXIT SUB
END SELECT
LOOP
END SUB
SUB PiirraKehys (kohta%, tila%)
x% = 2 + ((kohta% - 1) \ 3) * 38
y% = 3 + ((kohta% - 1) MOD 3) * 58
IF tila% = 0 THEN
LINE (x% + 1, y%)-STEP(34, 54), 0, B
ELSE
LINE (x%, y%)-STEP(36, 0), 3, , 21845
LINE (x%, y% + 54)-STEP(36, 0), 3, , 21845
LINE (x% + 1, y% + 1)-STEP(0, 54), 3, , 21845
LINE (x% + 35, y% + 1)-STEP(0, 54), 3, , 21845
END IF
END SUB
SUB PiirraKortti (x%, y%, kuvio%, vari%, taytto%, maara%)
LINE (x%, y%)-STEP(30, 50), vari%, B
SELECT CASE maara%
CASE 1
PiirraKuvio x% + 10, y% + 20, kuvio%, vari%, taytto%
CASE 2
PiirraKuvio x% + 10, y% + 10, kuvio%, vari%, taytto%
PiirraKuvio x% + 10, y% + 30, kuvio%, vari%, taytto%
CASE 3
PiirraKuvio x% + 10, y% + 5, kuvio%, vari%, taytto%
PiirraKuvio x% + 10, y% + 20, kuvio%, vari%, taytto%
PiirraKuvio x% + 10, y% + 35, kuvio%, vari%, taytto%
END SELECT
END SUB
SUB PiirraKuvio (x%, y%, kuvio%, vari%, taytto%)
IF kuvio% = 1 THEN
LINE (x%, y%)-STEP(10, 10), vari%, B
ELSEIF kuvio% = 2 THEN
CIRCLE (x% + 5, y% + 5), 5, vari%, , , 1.1
ELSEIF kuvio% = 3 THEN
LINE (x%, y% + 10)-(x% + 5, y%), vari%
LINE (x% + 10, y% + 10)-(x% + 5, y%), vari%
LINE (x%, y% + 10)-(x% + 10, y% + 10), vari%
END IF
IF taytto% = 2 THEN
PAINT (x% + 5, y% + 5), CHR$(17 * vari%), vari%
ELSEIF taytto% = 3 THEN
PAINT (x% + 5, y% + 5), vari%, vari%
END IF
END SUB
SUB PiirraPoyta
CLS
FOR i% = 1 TO KorttiMaara%
x% = 5 + ((i% - 1) \ 3) * 38
y% = 5 + ((i% - 1) MOD 3) * 58
kuvio% = Kortit%(i%, 1)
vari% = Kortit%(i%, 2)
taytto% = Kortit%(i%, 3)
maara% = Kortit%(i%, 4)
PiirraKortti x%, y%, kuvio%, vari%, taytto%, maara%
NEXT
LOCATE 23, 25: PRINT "Yhdistelmiä:"; YhdistelmaMaara%
END SUB
SUB PiirraTyhja (x%, y%)
LINE (x%, y%)-STEP(30, 50), 0, BF
END SUB
SUB PiirraVarjo (kohta%, tila%)
x% = 6 + ((kohta% - 1) \ 3) * 38
y% = 6 + ((kohta% - 1) MOD 3) * 58
IF tila% = 0 THEN
PAINT (x%, y%), 0, Kortit%(kohta%, 2)
ELSE
PAINT (x%, y%), (Kortit%(kohta%, 2) + 1) MOD 3 + 1, Kortit%(kohta%, 2)
END IF
END SUB
SUB SiirraPakkaan (kohta%)
PakkaMaara% = PakkaMaara% + 1
KorttiMaara% = KorttiMaara% - 1
Pakka%(PakkaMaara%, 1) = Kortit%(kohta%, 1)
Pakka%(PakkaMaara%, 2) = Kortit%(kohta%, 2)
Pakka%(PakkaMaara%, 3) = Kortit%(kohta%, 3)
Pakka%(PakkaMaara%, 4) = Kortit%(kohta%, 4)
Kortit%(kohta%, 1) = Kortit%(KorttiMaara% + 1, 1)
Kortit%(kohta%, 2) = Kortit%(KorttiMaara% + 1, 2)
Kortit%(kohta%, 3) = Kortit%(KorttiMaara% + 1, 3)
Kortit%(kohta%, 4) = Kortit%(KorttiMaara% + 1, 4)
END SUB
SUB SiirraPoytaan (kohta%)
KorttiMaara% = KorttiMaara% + 1
PakkaMaara% = PakkaMaara% - 1
Kortit%(KorttiMaara%, 1) = Pakka%(kohta%, 1)
Kortit%(KorttiMaara%, 2) = Pakka%(kohta%, 2)
Kortit%(KorttiMaara%, 3) = Pakka%(kohta%, 3)
Kortit%(KorttiMaara%, 4) = Pakka%(kohta%, 4)
Pakka%(kohta%, 1) = Pakka%(PakkaMaara% + 1, 1)
Pakka%(kohta%, 2) = Pakka%(PakkaMaara% + 1, 2)
Pakka%(kohta%, 3) = Pakka%(PakkaMaara% + 1, 3)
Pakka%(kohta%, 4) = Pakka%(PakkaMaara% + 1, 4)
END SUB
SUB Soita (aani%)
IF Aanet% THEN
SELECT CASE aani%
CASE 1
PLAY "o3l16ceg>c"
CASE 2
PLAY "o1l32e-c"
CASE 3
PLAY "t120"
PLAY "l64n66n54n26p64p16n45n42p32n64n52p32n67n55n21p64p16n45n42"
PLAY "p32n61n49p32n64n52n26p64p16n62n50n45n42p16n21p32p64p16n62"
PLAY "n50n45n42p16n71n59n19p64p16n71n59n47n43p16n69n57n23p64p16"
PLAY "n45n42p32p16n67n55n28p64p16n67n55n43n40p16n23p32p64p16n67"
PLAY "n55n43n40p16n74n62n19p64p16n74n62n47n43p16n73n61n26p64p16"
PLAY "n47n43p32n71n59p32n69n57n30p64p16n69n57n45n42p16n26p32p64"
PLAY "p16n70n58n42p64p16n71n59n43p64p16p16p16n61n49n45n25p16p16"
PLAY "p16n62n50n45n26p16"
END SELECT
END IF
END SUB
SUB TeePakka
kohta% = 0
FOR kuvio% = 1 TO 3
FOR vari% = 1 TO 3
FOR taytto% = 1 TO 3
FOR maara% = 1 TO 3
kohta% = kohta% + 1
Pakka%(kohta%, 1) = kuvio%
Pakka%(kohta%, 2) = vari%
Pakka%(kohta%, 3) = taytto%
Pakka%(kohta%, 4) = maara%
NEXT
NEXT
NEXT
NEXT
END SUB
SUB UudetKortit
LaskeYhdistelmat
WHILE KorttiMaara% < 12 OR YhdistelmaMaara% = 0
UusiKortti
LaskeYhdistelmat
WEND
END SUB
SUB UusiKortti
SiirraPoytaan ArvoLuku(1, PakkaMaara%)
END SUBVau, hienolta näyttää. Nyt pitäisi vain enää opetella pelaamaan SETiä kunnolla. :)
P.S. Putkavisassa oli hyvät kysymykset!
en tuota jaksanut testata, mutta hyvältä kuulostaa...
ihan hyvä peli!!!
Todella hienoa työtä!
Hyvä systeemi. Kai olisi hyvä peli jos jaksaisi selvittää, mikä siinä on ideana. pelailin 15 minuuttia enkä löytänyt yhtään yhdistelmää :)
Hienoa koodia ! :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.