Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: SET-korttipeli

Antti Laaksonen [08.08.2006 21:51:55]

#

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 SUB

tgunner [09.08.2006 15:23:31]

#

Vau, hienolta näyttää. Nyt pitäisi vain enää opetella pelaamaan SETiä kunnolla. :)
P.S. Putkavisassa oli hyvät kysymykset!

Qman [18.08.2006 18:32:33]

#

en tuota jaksanut testata, mutta hyvältä kuulostaa...

Qman [11.09.2006 21:09:14]

#

ihan hyvä peli!!!

Juhko [12.10.2006 15:21:29]

#

Todella hienoa työtä!

Chaosworm [02.03.2007 10:41:51]

#

Hyvä systeemi. Kai olisi hyvä peli jos jaksaisi selvittää, mikä siinä on ideana. pelailin 15 minuuttia enkä löytänyt yhtään yhdistelmää :)

Nettimato [03.04.2011 20:21:02]

#

Hienoa koodia ! :)

Vastaus

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

Tietoa sivustosta