Ne, jotka ovat pelailleet roolipelejä tai vaikka Areena 5-peliä, ovat varmaankin tutustuneet tapaan määritellä arpakuution heitto seuravasti:
<heittokertoja>d<nopassa sivuja>[+/-muutos]
Tämä siis tarkoittaa sitä tavallisen kuusisivuisen arpakuution heitto on 1d6. Jos tulokseen pitäsi lisätä kaksi, heitto olisi 1d6+2.
No, teinpä sitten funktion joka laskee tuollaisesta määrityksestä luvun ja vielä hienon demopelinkin, joka muistuttaa sitä mikefulin noppafunktion dempopeliä. Pelin aseiden nimet ovat Seppo Suorsan Areena 5-pelistä ja vihollishirviön nimi Aku Ankan Taskukirjast 248 (katso tarkemmin koodista).
Noppa-funktio
FUNCTION noppa% (lause$)
DEFINT A-Z      'koska käytetään kokonaislukuja
                'niin asetetaan nämä muuttujat
                'kokonaisluvuiksi.
lause$ = LTRIM$(RTRIM$(lause$))     'varmuuden vuoksi karsitaan
                                    'välilyönnit alusta ja lopusta
FOR i = 1 TO LEN(lause$)            'tähän voisi käyttää myös whilea
    kirjain$ = MID$(lause$, i, 1)   'leikataan yksi kirjain
    IF LCASE$(kirjain$) <> "d" THEN    'jos kirjain ei ole d
        kertoja$ = kertoja$ + kirjain$ 'merkitään muistiin numero
    ELSE EXIT FOR                      'mutta jos on, siirrytään
    END IF                             'seuraavaan
NEXT i
in = i
FOR i = i + 1 TO LEN(lause$)           'jatketaan d-kohdan jälkeen
    kirjain$ = MID$(lause$, i, 1)      'kopioidaan taas yksi kirjain
    'jos se ei ole + tai -
    IF LCASE$(kirjain$) <> "+" OR LCASE$(kirjain$) <> "-" THEN
        sivuja$ = sivuja$ + kirjain$    'merkitään numero muistiin
        in = in + 1
    ELSE EXIT FOR                       'muuten mennään seuraavaan
    END IF
NEXT i
muutos$ = MID$(lause$, in - 1)          'lauseen lopun täytyy olla
                                        'muutos
LET tulos = 0
k = VAL(kertoja$)   ' siistitään vähän ja siirretään tekstit
m = VAL(muutos$)    ' numeromuuttujiin
s = VAL(sivuja$)
FOR i = 1 TO k      ' sitten arvotaan k kertaa
    tulos = tulos + (INT(RND * s) + m + 1)
NEXT i
noppa = tulos       'palautetaan tulokset
DEFSNG A-Z
END FUNCTIONHieno demopeli ;)
' Noppalausekkeenlaskija ja hieno demopeli
'
' Tehnyt DSword <dsword@mbnet.fi>
' Koodia saa käyttää täysin vapaasti
DECLARE FUNCTION noppa% (lause$)
RANDOMIZE TIMER     'alustetaan satunnaislukugeneraattori
TYPE ASETYPE        'type aseelle
    nimi  AS STRING * 12
    teho  AS STRING * 12
END TYPE
TYPE OLENTOTYPE     'type hirviölle
    kesto AS INTEGER
    ase   AS ASETYPE
    suoja AS INTEGER
END TYPE
DIM oma     AS OLENTOTYPE   'tämä on siis minä itse
DIM hirvio  AS OLENTOTYPE   'ja tämä vihulainen
oma.kesto = 20              'asetetaan sitten hirviöiden
oma.ase.nimi = "Kivikeihäs" 'ominaisuudet
oma.ase.teho = "1d6+1"      'Aseet on kopioitu Seppo Suorsan
oma.suoja = 5               'mainiosta pelistä Areena 5
hirvio.kesto = 20
hirvio.ase.nimi = "Moukari"
hirvio.ase.teho = "2d6"
hirvio.suoja = 1
DO
CLS
PRINT "  Oma kesto: "; oma.kesto        'tulostetaan
PRINT "Mörön kesto: "; hirvio.kesto     'tilanne
PRINT
PRINT "Valitse:"            'mitähän tässä
PRINT "1. Hyökkää"          'tapahtuu?
PRINT "2. Pakene"
valikko:
'odotetaan niin kauan että käyttäjä painaa
'jotain nappia
DO: nappi$ = INKEY$: LOOP UNTIL nappi$ <> ""
SELECT CASE nappi$
    CASE "1"
        'HYÖKKÄYKSEEN!
        hyokkays = noppa(oma.ase.teho)  'paljonko tulee vahinkoa
        'sitten paljonko haarniska suojaa
        suojus = noppa("1d" + LTRIM$(STR$(hirvio.suoja + 1)) + "-1")
        vahinko = hyokkays - suojus     'lopputulos
        IF vahinko < 0 THEN vahinko = 0 'jos vahinko on alle 0 niin se
                                        'on 0, muuteen hirviö
                                        'saa kestoa takaisin
        hirvio.kesto = hirvio.kesto - vahinko
                                        'vähännetään hirviön kestosta
                                        'vahinko
        'ja sitten tulostetaan tietoa
        PRINT
        PRINT "Hyökkäät aseellasi " + RTRIM$(oma.ase.nimi);
        PRINT " (" + RTRIM$(oma.ase.teho); ") ";
        PRINT "ja teet vahinkoa"; hyokkays; "pisteen verran.";
        PRINT "Hirviön haarniska suojaa"; suojus; "pisteen verran, ";
        PRINT "joten hirviö kärsii vahinkoa"; vahinko; "pisteen verran";
        IF hirvio.kesto <= 0 THEN
            'jos se mörhelö kuoli, tiedotetaan ja lopetetaan.
            PRINT " ja kuolee. Onneksi olkoon, voitit sen."
            EXIT DO
        ELSE PRINT "."
        END IF
        PRINT
        PRINT "Paina jotain."
        SLEEP
    CASE "2"
        'PAKOON!
        pako = noppa("1d5")    'paon todennäköisyys on 20 %
        PRINT
        IF pako = 1 THEN
            'jos tulee 1, niin kerrotaan asiasta
            'hirviön nimi on Aku Ankan Taskukirjasta 248
            'tarinasta Kultainen niili, jonka on käsikirjoittanut
            'Francois Corteggiani ja piirtänyt Giorgio Cavazzano
            'nimi on sivulla 55
            PRINT "Onnistut pakeneman Lualuban baobabpuissa";
            PRINT "asuvaa vaapsajalkaista etoölliäistä. ";
            PRINT "Valitettavasti, samalla kun vilkaiset taakses, ";
            PRINT "seuraako hirviö sinua, kompastut ja lennähdät ";
            PRINT "pohjattomaan rotkoon, jonka pohjalla on veitsenteräviä ";
            PRINT "(ja nyt ei puhuta sinun linkkuveitsestäsi) piikkejä. ";
            PRINT "Niinpä harmillisesti kuolet."
            EXIT DO 'ja lopetetaan
        ELSE
            'jos ei, niin kerrotaan asiasta
            PRINT "Et onnistu pakenemaan.";
            PRINT
            PRINT "Paina jotain."
            SLEEP
        END IF
    CASE ELSE: GOTO valikko     'jos käyttäjä ei paina 1
                                'tai 2, takaisin alkuun.
END SELECT
'sitten hirviö hyökkää.
'koodi on sama kuin pelaajan hyökkäys
'paitsi että on toiset arvot käytössä
'(ja infotekstiä muutettu)
hyokkays = noppa(hirvio.ase.teho)
suojus = noppa("1d" + LTRIM$(STR$(oma.suoja + 1)) + "-1")
vahinko = hyokkays - suojus
IF vahinko < 0 THEN vahinko = 0
oma.kesto = oma.kesto - vahinko
PRINT
PRINT "Hirviö hyökkää aseellaan " + RTRIM$(hirvio.ase.nimi);
PRINT " (" + RTRIM$(hirvio.ase.teho); ") ";
PRINT "ja tekee vahinkoa"; hyokkays; "pisteen verran.";
PRINT "Haarniskasi suojaa"; suojus; "pisteen verran, ";
PRINT "joten kärsit vahinkoa"; vahinko; "pisteen verran";
IF oma.kesto <= 0 THEN
    PRINT " ja kuolet. Epäonneksi olkoon, sillä hävisit juuri."
    EXIT DO
ELSE PRINT "."
END IF
PRINT
PRINT "Paina jotain."
SLEEP
LOOP
FUNCTION noppa% (lause$)
DEFINT A-Z      'koska käytetään kokonaislukuja
                'niin asetetaan nämä muuttujat
                'kokonaisluvuiksi.
lause$ = LTRIM$(RTRIM$(lause$))     'varmuuden vuoksi karsitaan
                                    'välilyönnit alusta ja lopusta
FOR i = 1 TO LEN(lause$)            'tähän voisi käyttää myös whilea
    kirjain$ = MID$(lause$, i, 1)   'leikataan yksi kirjain
    IF LCASE$(kirjain$) <> "d" THEN    'jos kirjain ei ole d
        kertoja$ = kertoja$ + kirjain$ 'merkitään muistiin numero
    ELSE EXIT FOR                      'mutta jos on, siirrytään
    END IF                             'seuraavaan
NEXT i
in = i
FOR i = i + 1 TO LEN(lause$)           'jatketaan d-kohdan jälkeen
    kirjain$ = MID$(lause$, i, 1)      'kopioidaan taas yksi kirjain
    'jos se ei ole + tai -
    IF LCASE$(kirjain$) <> "+" OR LCASE$(kirjain$) <> "-" THEN
        sivuja$ = sivuja$ + kirjain$    'merkitään numero muistiin
        in = in + 1
    ELSE EXIT FOR                       'muuten mennään seuraavaan
    END IF
NEXT i
muutos$ = MID$(lause$, in - 1)          'lauseen lopun täytyy olla
                                        'muutos
LET tulos = 0
k = VAL(kertoja$)   ' siistitään vähän ja siirretään tekstit
m = VAL(muutos$)    ' numeromuuttujiin
s = VAL(sivuja$)
FOR i = 1 TO k      ' sitten arvotaan k kertaa
    tulos = tulos + (INT(RND * s) + m + 1)
NEXT i
noppa = tulos       'palautetaan tulokset
DEFSNG A-Z
END FUNCTIONKommenttien ruinaus on pakollista.
Toivottavasti nuo ä-jutut korjautuvat kun Antti siirtää tämän QB-alueelle.
Loistavaa, että ensinnäkin täällä on Areena 5-faneja, ja toiseksi, että tämä loistava vinkki!
Ihan hienolta vaikuttaa, meenkin heti testaamaan...
Hieno vinkki
Aihe on jo aika vanha, joten et voi enää vastata siihen.