Kirjoittaja: Antti Laaksonen (2003).
Tämä opassarjan viimeinen osa sisältää kaksi esimerkkipeliä, TI-JATSI ja TI-MATO, selitysten kera. Jos kirjoitat pelit laskimella, ota mukaan kaikki tasalevyisellä fontilla kirjoitetut rivit. Pelit ovat kuitenkin melko pitkiä, minkä vuoksi linkkikaapeli säästää reilusti aikaa ja paristoja; molemmat pelit TI-GRAPH LINK -yhteensopivassa muodossa löytyvät paketista ti89_pelit.zip (2,7 kt).
Huom: pelien latautuminen ensimmäisellä käynnistyskerralla kestää n. 5 sekuntia, myöhemmin ei viivettä juuri ole.
Ensimmäinen esimerkkipeli on kahden pelaajan noppapeli jatsi, tämän version nimi on TI-JATSI. Tarkoituksena on saada noppia heittämällä erilaisia yhdistelmiä, joita kerätään taulukkoon. Viidentoista kierroksen jälkeen se, jonka yhteenlaskettu pistemäärä on suurempi, on voittaja. Laskimen näytön pienen koon vuoksi pelin käyttöliittymä täytyi suunnitella huolellisesti. Pelin koko on 4176 tavua.
Pelin alussa määritellään joukko paikallisia muuttujia. tul on pelaajien heittotulokset sisältävä lista, nim-listassa on heittotulosten nimet, ak on kuvaajan akselien tila ja gr on kuvaajan ristikon tila. Seuraavan rivin muuttujat ovat noppien kuvia. Tämän jälkeen tulevat muuttujat heitetyille nopille, valituille nopille, tulossivulle (1 tai 2), painetulle näppäimelle ja heitosta tulleille pisteille. Viimeisen rivin muuttujia käytetään For-silmukoissa ja muissa väliaikaisissa tarkoituksissa.
jatsi() Prgm Local tul,nim,ak,gr Local n1,n2,n3,n4,n5,n6,ty Local n,v,s,np,pi Local i,j,k,l,m
Seuraavaksi on vuorossa pelin ainoa aliohjelma, lis, joka näyttää valitun sivun heittotulokset. Sivulla 1 on saman nopan yhdistelmät, sivulla 2 loput. Jos tulos on char(4), se on heittämätön, jolloin listassa näkyy viiva. (Miksi juuri char(4)? Tämän merkin symboli sattuu olemaan ET, jonka voi selittää tarkoittavan "ei tulosta".) Tuloslistan rivien pituus on aina 13 merkkiä.
Local lis
Define lis(i,nim,tul)=Prgm
Local j,k,t1,t2
If i=1 Then
For i,1,8
For j,1,2
"t"&string(j)→k
If tul[i,j]=char(4) Then
" -"→#k
Else
right(" "&string(tul[i,j]),3)→#k
EndIf
EndFor
PxlText string(i)&" "&left(nim[i]&" ",9)&t1&t2,i*8-7,0
EndFor
PxlText " ",65,0
Else
For i,1,9
For j,1,2
"t"&string(j)→k
If tul[i+8,j]=char(4) Then
" -"→#k
Else
right(" "&string(tul[i+8,j]),3)→#k
EndIf
EndFor
PxlText string(i)&" "&left(nim[i+8]&" ",9)&t1&t2,i*8-7,0
EndFor
EndIf
EndPrgmTämän jälkeen tulee pelin aloitusikkuna, josta selviävät pelissä käytettävät näppäinkomennot. Jos käyttäjä painaa CANCEL-nappia, ok-erikoismuuttujan arvoksi tulee 0. Tällöin poistutaan pelistä välittömästi.
Dialog Title "TI-JATSI" Text "Tervetuloa peliin!" Text "" Text "ENTER: Noppien heitto" Text "F1-F5: Nopan lukitus" Text "MODE: Tulossivun vaihto" Text "1-9: Tuloksen valinta" Text "ESC: Pelin keskeytys" EndDlog If ok=0 Stop
Seuraavaksi määritellään pelin taulukot. nim-taulukko sisältää kaikkien heittotulosten nimet, ja tul-taulukosta löytyvät kummankin pelaajan heittotulokset. Kaikkien muiden tulosten arvo on aluksi char(4) (ei tulosta), paitsi 7:nnen ja 18:nnen, jotka sisältävät tulosten summan. s-muuttujan arvoksi laitetaan vielä 1, eli oletustulossivu on 1.
{"Ykköset","Kakkoset","Kolmoset","Neloset","Viitoset","Kuutoset","Yhteensä","Bonus","Pari", "Kahdet parit","3 samaa","4 samaa","Suora 1-5","Suora2-6","Täyskäsi","Sattuma","Jatsi", "Yhteensä"}→nim
newMat(18,2)→tul For i,1,17 If i=7 Cycle For j,1,2 char(4)→tul[i,j] EndFor EndFor 1→s
Nyt on vuorossa kuvien eli noppien luominen. Aluksi grafiikkanäytön kuvaajan akselit ja ruudukko otetaan pois häiritsemästä. Asetukset otetaan kuitenkin talteen muuttujiin, jotta ne voidaan palauttaa pelin lopuksi. Helpoin tapa muodostaa kuvat on piirtää ne ja kopioida StoPic-komennolla muuttujiin. Viimeinen kuva, ty, jota käytetään noppien poistamiseen, luodaan kuitenkin NewPic-komennolla.
setGraph("Axes","Off")→ak
setGraph("Grid","Off")→gr
ClrDraw
PxlLine 0,0,8,0
PxlLine 0,0,0,8
PxlLine 8,0,8,8
PxlLine 0,8,8,8
PxlOn 4,4
StoPic n1,0,0,9,9
PxlOn 2,4
PxlOn 6,4
StoPic n3,0,0,9,9
PxlOff 4,4
StoPic n2,0,0,9,9
PxlOff 2,4
PxlOff 6,4
PxlOn 2,2
PxlOn 6,2
PxlOn 2,6
PxlOn 6,6
StoPic n4,0,0,9,9
PxlOn 4,4
StoPic n5,0,0,9,9
PxlOff 4,4
PxlOn 4,2
PxlOn 4,6
StoPic n6,0,0,9,9
NewPic [1,1],ty,9,9Tästä alkavat pelin pääsilmukat. Niitä ennen tuloslista piirretään ensimmäisen kerran ja tuloslistan oikealle puolelle piirretään pystysuora viiva. Ensimmäinen silmukka suoritetaan 15 kertaa, joka on pelin tulosten määrä. Toinen silmukka suoritetaan kaksi kertaa, ensimmäisen ja toisen pelaajan tulokset.
ClrDraw lis(s,nim,tul) PxlVert 103 For i,1,15 For j,1,2
Silmukan alussa tulostetaan pelaajien yhteispistemäärä ja merkitään nuoli sen pelaajan kohdalle, joka on heittovuorossa.
If j=1 Then
PxlText "P1:"&right(" "&string(tul[18,1]),3)&" "&char(17),58,105
PxlText "P2:"&right(" "&string(tul[18,2]),3)&" ",68,105
Else
PxlText "P1:"&right(" "&string(tul[18,1]),3)&" ",58,105
PxlText "P2:"&right(" "&string(tul[18,2]),3)&" "&char(17),68,105
EndIfSitten alkaa noppien heittäminen. n-lista sisältää noppien arvot ja v-lista valitut nopat. Noppia on luvallista heittää kolme kertaa, minkä vuoksi For-silmukka suoritetaan kolmesti. Ainoastaan ne nopat, joita ei ole valittu, heitetään ja piirretään uudelleen. Noppien heiton jälkeen seuraa silmukka, jossa luetaan pelaajan näppäinpainalluksia. ESC lopettaa pelin, MODE vaihtaa tulossivua ja F1-F5 valitsevat tai poistavat noppien valinnan.
{0,0,0,0,0}→n
{0,0,0,0,0}→v
pxlText " ",11,107
For m,1,3
PxlText string(m)&"/3",38,105
For l,1,5
If v[l]=0 Then
rand(6)→n[l]
"n"&string(n[l])→k
AndPic ty,1,97+l*10
RclPic #k,1,97+l*10
EndIf
EndFor
If m≠3 Then
Loop
getKey()→np
If np=264 Then
Goto loppu
ElseIf np=266 Then
If s=1 Then
2→s
Else
1→s
EndIf
lis(s,nim,tul)
ElseIf np>267 and np<273 Then
np-267→l
If v[l]=0 Then
1→v[l]
pxlText char(15),11,97+l*10
Else
0→v[l]
pxlText " ",11,97+l*10
EndIf
ElseIf np=13 Then
Exit
EndIf
EndLoop
EndIf
EndForKun nopat on heitetty, on aika valita, mikä yhdistelmä nopista muodostetaan. Tämä tapahtuu ensimmäisellä sivulla näppäimillä 1 - 8 ja toisella sivulla näppäimillä 1 - 9. Pelaaja voi myös keskeyttää pelin ESCillä ja vaihtaa tulossivua MODElla.
If s=1 Then
PxlText "1-8",38,105
Else
PxlText "1-9",38,105
EndIf
Loop
getKey()→np
If np=264 Then
Goto loppu
ElseIf np=266 Then
If s=1 Then
2→s
PxlText "1-9",38,105
Else
1→s
PxlText "1-8",38,105
EndIf
lis(s,nim,tul)
ElseIf np>48 and np<58 Then
np-48→l
If s=2
l+8→l
If tul[l,j]=char(4) and l≠7 and l≠8 Then
Exit
EndIf
EndIf
EndLoopTämän jälkeen lasketaan pelaajan saamat pisteet valitulla heittoyhdistelmällä. Heittojen analysoiminen on kuvattu yksityiskohtaisesti esim. täällä. Heittotulos sekä tulosten yhteissummat tallennetaan lopuksi tul-listaan. Tämän jälkeen palataan silmukan alkuun, ja tulee kakkospelaajan vuoro heittää tai uusi kierros.
SortA n
0→pi
If l>0 and l<7 Then
For m,1,5
If n[m]=l
pi+l→pi
EndFor
tul[7,j]+pi→tul[7,j]
If tul[7,j]>62 and tul[8,j]=char(4) Then
50→tul[8,j]
50+tul[18,j]→tul[18,j]
EndIf
ElseIf l=9 Then
For i,4,1,ª1
If n[i]=n[i+1] Then
n[i]*2→pi
Exit
EndIf
EndFor
ElseIf l=10 Then
If n[4]=n[5] and n[2]=n[3] and n[2]≠n[5] Then
n[4]*2+n[2]*2→pi
ElseIf n[4]=n[5] and n[1]=n[2] and n[1]≠n[5] Then
n[4]*2+n[1]*2→pi
ElseIf n[3]=n[4] and n[1]=n[2] and n[1]≠n[4] Then
n[3]*2+n[1]*2→pi
EndIf
ElseIf l=11 Then
For i,3,1,ª1
If n[i]=n[i+2] Then
n[i]*3→pi
Exit
EndIf
EndFor
ElseIf l=12 Then
For i,2,1,ª1
If n[i]=n[i+3] Then
n[i]*4→pi
Exit
EndIf
EndFor
ElseIf l=13 Then
If n[1]=1 and n[2]=2 and n[3]=3 and n[4]=4 and n[5]=5
15→pi
ElseIf l=14 Then
If n[1]=2 and n[2]=3 and n[3]=4 and n[4]=5 and n[5]=6
20→pi
ElseIf l=15 Then
If n[3]=n[5] and n[1]=n[2] and n[1]≠n[5] Then
n[5]*3+n[1]*2→pi
ElseIf n[4]=n[5] and n[1]=n[3] and n[1]≠n[5] Then
n[5]*2+n[1]*3→pi
EndIf
ElseIf l=16 Then
n[1]+n[2]+n[3]+n[4]+n[5]→pi
Elseif l=17 Then
If n[1]=n[5]
50→pi
EndIf
pi→tul[l,j]
tul[18,j]+pi→tul[18,j]
Text nim[l]& " pelaaja "&string(j)&":lle, "&string(pi)&" pistettä!"
lis(s,nim,tul)
EndFor
EndForJa tässä on pelin päättyminen 15 kierroksen tai ESCin painalluksen jälkeen. Poikkeuksellisesti on jouduttu käyttämään Goto- ja Lbl-komentoja hyppäämään loppu-nimiöön, koska TI-89:n Basic ei tunnu sisältävän keinoa poistua usemmasta kuin yhdestä silmukasta. Lopuksi ilmoitetaan, kumpi pelaajista voitti, vai tuliko tasapeli, minkä jälkeen kuvaajan asetukset palautetaan alkuperäisiksi ja peli palaa perusnäyttöön.
Lbl loppu
If tul[18,1]>tul[18,2] Then
Text "Peli päättyi - pelaaja 1 voitti!"
ElseIf tul[18,1]<tul[18,2] Then
Text "Peli päättyi - pelaaja 2 voitti!"
Else
Text "Peli päättyi - tasapeli!"
EndIf
setGraph ("Axes",ak)
setGraph ("Grid",gr)
DispHome
EndPrgmToisen esimerkkipelin nimi on TI-MATO. Se on nimensä mukaisesti vanhan kunnon matopelin laskinversio. Nuolinäppäimillä ohjattavan madon tehtävä on kerätä kentän satunnaisiin kolkkiin ilmestyviä aarteita, joista saa pisteitä. Ja jos mato osuu seinään tai itseensä, peli päättyy. Pelin koko on huomattavasti pienempi kuin jatsin, 1431 tavua.
Ohjelman alussa määritellään joukko paikallisia muuttujia:
| a | aarteen kuva |
|---|---|
| ak | grafiikkaikkunan akselit-asetus |
| ax | aarteen x-koordinaatti |
| ay | aarteen y-koordinaatti |
| gr | grafiikkaikkunan ristikko-asetus |
| lx | lista, jossa on madon palojen x-koordinaatit |
| ly | lista, jossa on madon palojen y-koordinaatit |
| mp | madon pituus |
| n | painettu näppäin |
| p | madon palan kuva |
| pi | pisteet |
| s | madon suunta |
| t | tyhjä kuva |
| x | nykyinen x-koordinaatti |
| y | nykyinen y-koordinaatti |
mato() Prgm Local a,ak,ax,ay,gr,lx,ly,mp,n,p,pi,s,t,x,y
Tämän jälkeen luodaan kolme kuvaa: madon pala, aarre ja tyhjä kuva, jota käytetään kuvien poistamiseen.
NewPic [1,1;1,2;1,3;1,4;1,5;2,1;3,1;4,1;2,5;3,5;4,5;5,1;5,2;5,3;5,4;5,5],p NewPic [1,3;2,2;2,4;3,1;3,5;4,2;4,4;5,3],a NewPic [3,3],t,5,5
Sitten siirrytään grafiikkanäyttöön, mitä ennen kuvaajan mahdolliset akselit ja ruudukko otetaan pois. Asetusten arvot kuitenkin tallennetaan muuttujiin, jotta ne voidaan palauttaa pelin päätyttyä.
setGraph("Axes","Off")→ak
setGraph("Grid","Off")→gr
ClrDrawSeuraavaksi piirretään ruudun kehykset. Ruudun ylälaidassa näkyy aina pelin nimi ja pistemäärä. Pistemäärä näkyy aina nelinumeroisena, alussa on tarvittaessa ylimääräisiä nollia. Tämä onnistuu right-funktiolla, joka palauttaa annetun määrän merkkejä merkkijonon lopusta.
0→pi
PxlText "TI-MATO",0,0
PxlHorz 9
PxlVert 156
PxlText right("000"&string(pi),4),0,135Tämän jälkeen määritetään madon aloituskoordinaatit ja -nopeus. Madon kaikkien palojen koordinaatit tallennetaan listaan, jossa on aluksi viisi alkiota. Lisäksi arvotaan madon suunta (1 = vasemmalle, 2 = ylös, 3 = oikealle, 4 = alas) ja ensimmäisen aarteen sijainti. Lopuksi aarre ja madon ensimmäinen pala piirretään näytölle.
75→x
40→y
5→mp
{x,x,x,x,x}→lx
{y,y,y,y,y}→ly
rand(4)→s
rand(30)*5→ax
rand(12)*5+10→ay
RclPic a,ay,ax
RclPic p,y,xNyt alkaa varsinainen pelisilmukka. Silmukan alussa luetaan näppäimistöä. Jos painettu näppäin on ESC, poistutaan välittömästi silmukasta. Jos painettu näppäin on joku nuolinäppäimistä, madon suunta muuttuu. Kuitenkaan mato ei saa lähteä vastakkaiseen suuntaan.
Loop getKey()→n If n=264 Then Exit ElseIf n=337 and s≠3 Then 1→s ElseIf n=338 and s≠4 Then 2→s ElseIf n=340 and s≠1 Then 3→s ElseIf n=344 and s≠2 Then 4→s EndIf
Seuraavaksi muutetaan madon koordinaatteja suunnan mukaan. Samalla tarkistetaan, ettei mato mene alueen rajojen yli. Jos näin käy, poistutaan silmukasta.
If s=1 Then
x-5→x
If x<0
Exit
ElseIf s=2 Then
y-5→y
If y<10
Exit
ElseIf s=3 Then
x+5→x
If x>150
Exit
ElseIf s=4 Then
y+5→y
If y>70
Exit
EndIfJos madon ja aarteen koordinaatit ovat samat, mato on onnistunut saamaan aarteen. Tällöin pisteitä lisätään kymmenellä ja aarteelle arvotaan uusi paikka, jonne se myös piirretään. Madon pituutta myös lisätään yhdellä, jotta peli ei olisi liian helppo.
If x=ax and y=ay Then
pi+10→pi
PxlText right("000"&string(pi),4),0,135
AndPic t,ay,ax
Loop
rand(30)*5→ax
rand(12)*5+10→ay
If not PxlTest(ay+1,ax+1)
Exit
EndLoop
RclPic a,ay,ax
mp+1→mp
lx[1]→lx[mp]
ly[1]→ly[mp]
rotate(lx)→lx
rotate(ly)→ly
EndIfTässä osassa liikutetaan matoa ja piirretään se. X- ja y-koordinaattien listat sisältävät madon jokaisen palikan paikan niin, että uusin on ensimmäisenä ja vanhin viimeisenä. Vanhin palikka pitäisi saada pois. rotate-funktio on kuin luotu tähän tarkoitukseen: se tuo listan viimeisen palikan ensimmäiseksi ja siirtää muita yhden edemmäs. Nyt vanha palikka voi vaihtaa osia uuden kanssa. PxlTest-funktion avulla tarkistetaan, ettei mato osu itsensä päälle.
rotate(lx)→lx rotate(ly)→ly AndPic t,ly[1],lx[1] x→lx[1] y→ly[1] If PxlTest(y+1,x+1) Exit RclPic p,y,x EndLoop
Jos silmukasta joudutaan pois, peli on keskeytetty tai mato on törmännyt seinään tai itseensä. Siksi tähän kohtaan kuuluu pelin loppu. Ensin grafiikkanäytön kuvaaja-asetukset palautetaan entiselleen. Tämän jälkeen ohjelmanäyttöön tulostetaan ilmoitus pelin päättymisestä ja pelaajan saavuttama pistemäärä. Ja kun pelaaja painaa ENTERiä, ohjelma palaa perusnäyttöön.
setGraph("Axes",ak)
setGraph("Grid",gr)
ClrIO
Disp "Peli päättyi!"
Disp ""
Disp "Pisteet: "&string(pi)
Pause
DispHome
EndPrgmTässäpä se sitten oli. Opassarjan lopuksi TI-89:lle pelejä ohjelmoivan "yhdeksän käskyä":
For-silmukan lopetus on EndFor (itse meinaan jatkuvasti kirjoittaa Next).Lähetä toki sähköpostia, ja kerro, mitä pidit oppaasta. Voit myös kysyä apua ongelmiin ja kertoa omista peleistäsi.
Antti Laaksonen, 30.7.2003
Jollain on vähän liian paljon aikaa :D ei pahalla
varsin mukava opas... oikun omistaisinkin tommosen laskimen...
Vielä kun olisi tuollainen laskin tai samanlainen opas Sharpin el-9900 laskimelle (tai joku sinnepäin se ainakin oli...)
aattelin hommata sellasen casio laskinpömpelin... en vaan tuu tarvihtemaan ees prosenttia sen toiminnoista piitkään aikaan!
TI-86 pitää hommata tossa kun koulut alkavat, saa sitten nähdä kuinka hyvin nämä ti-89:n pelit/käskyt siinä toimivat...
Älkää ihmiset ostako casioita koodaamista varten, ainakin mun FX 1.0 Plus on hiiiiiiiidas! Tästä TI:stä en tiedä, kuulemma paljon nopeempi.
TI-86:ssa ei ole mielestäni läheskään näin hienostunutta kieltä, mikälie basicci siinä pyörii, mutta sekin on hidas kuin syväjäädytetty virtahepo. Kannattaa sillä ASMilla tehdä ne ohjelmat ja siirtää laskimeen. Tein itse Venttiä, Numeronarvausta ja yritinpä jopa moninpeliä väsätä, vaan meni hankalaksi käskyjen lähetys. Ja Ventti toimi jo kymmenen pelin jälkeen toivottoman hitaasti.
jollakin lailla soveltamalla toimii myös ainakin TI-84+ laskimessa, vaikka ei olekaan tuollaista Program Editoria, on vain PRGM napin takana oleva ohjelman luonti (lähes sama)
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.