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.