
Lisätietoja: Olli Lammi <olammi@iki.fi>
Versiohistoria:
Muutettu viimeksi: keskiviikkona 18.8.1998
- Ensimmäinen versio valmis 16.2.1998
- Korjattu törkeimmät kirjoitusvirheet 17.2.1998
- Lisätty ja korjattu dokumentti vastaamaan lopullista
toteutusta 23.3.1998
- Lisätty logo ja ladattava ohjelmaversio v0.1b. 23.3.1998
- Ohjelmaversio v0.1c, päivitetty dokumenttiin dynaamisen
pelilaudan koon ja voittosuoran pituuden vaatimat muutokset
25.3.1998
- Vaihdettu hieman korjattu ohjelmaversio v0.1c. 6.4.1998
- Lisätty sarjataulukko-WWW-palvelu. 8.4.1998
- Lisätty maininta UNIX-sovelluksesta 18.8.1998
Tämä dokumentti määrittelee Tampereen teknillisen korkeakoulun kurssin Tietoliikennetekniikan työkurssi (83950) ohjelmointiharjoitustyön laajemman tehtävän. Dokumentin tarkoituksena on toimia toteutuslähtökohtana työn tekijöille sekä työn esittelynä harjoitustyöassistentille. Dokumentti esittelee toteutettavan järjestelmän yleisen toiminnan, toteutusrajaukset ja käytettävät protokollat.
Ristinolla-järjestelmä on asiakas/palvelinsovellus, joka toteuttaa internet-verkon yli pelattavan perinteisen ristinollapelin. Sama ohjelma sisältää sekä asiakas- että palvelinsovelluksen. Sovelluksen rooli valitaan ohjelmaa käynnistettäessä.
Järjestelmässä on sovellusten yhteinen pelilauta, johon molemmat pelaajat asettavat vuorotellen pelimerkkejään. Pelilaudan koko ja voittosuoran pituus voidaan valita pelikohtaisesti tietyltä väliltä. Pystysuoran, vaakasuoran tai vinottaisen vähintään voittosuoran mittaisen rivin ensin rakentanut pelaaja voittaa pelin. Jos ruudukko täyttyy siten, että kumpikaan ei saa voittoon vaadittua suoraa tai sovellus havaitsee, että kumpikaan ei enää voi voittaa peliä, on peli tasapeli. Pelaaja voi myös luovuttaa pelin, jolloin peli keskeytyy.
Ristinollaohjelmaa käynnistettäessä valitaan, toimiiko sovellus asiakas- vai palvelintehtävässä. Peliä aloitettaessa palvelintehtävään valittu sovellus asetetaan odottamaan yhteydenottoa palvelinkoneen tiettyyn IP-porttiin. Asiakassovellus ottaa yhteyttä odottavaan palvelimeen ja sovellusten välillä aloitetaan Ristinollaprotokollan mukainen keskustelu. (protokolla kuvattu kohdassa 3.)
Palvelinsovellus kontrolloi pelin kulkua ja jakaa pelivuorot, päättää pelin aloitusvuoron, käytettävät pelimerkit, pelilaudan koon ja voittosuoran pituuden sekä päättää pelin lopputuloksesta. Kaikki asiakassovelluksen siirrot kierrätetään palvelinsovelluksen kautta. Vaikka palvelinsovellus kontrolloikin peliä, tarkkailee asiakassovellus myös pelin kulkua. Jos jompi kumpi sovelluksista havaitsee vastapuolen huijaavan, peli keskeytetään. Pelin keskeytyksen syyt on esitelty taulukossa 2.1.
Järjestelmä antaa pelivuoron vuorotellen molemmille pelaajille. Pelaaminen tai pelaajan käyttöliittymä ei eroa pelin aikana asiakas- ja palvelinsovellusten välillä.
| Syyarvo | Selite |
|---|---|
DRE_REPLY
| Vastaus vastapään lähettämään keskeytysviestiin |
DRE_CLOSE
| Yhteyden sulkeminen (esim. sovelluksen sulkeminen) |
DRE_WIN
| Lähettäjä on voittanut pelin. (vain palvelimelta asiakkaalle) |
DRE_LOSE
| Lähettäjä on hävinnyt pelin. (vain palvelimelta asiakkaalle) |
DRE_TIE
| Peli päättyi tasapeliin. (vain palvelimelta asiakkaalle) |
DRE_RETREAT
| Pelin luovutus (lähettäjä luovuttaa) |
DRE_CHEAT
| Lähettäjä on havainnut vastapään huijaavan. |
DRE_TIMEOUT
| Yhteys on katkennut kesken pelin. |
DRE_REFUSE
| Palvelin ei hyväksy pyydettyä yhteyttä. (vain palvelimelta asiakkaalle) |
DRE_OLDVERS
| Vastapää ei hyväksy yhteyttä, koska sovelluksen versio on liian vanha. |
Ristinollaprotokolla toteutetaan UDP/IP-protokollan avulla. Käytettäväksi protokollaksi valittiin UDP, koska sovelluksen tiedonsiirtotapa ja -tarve on pienissä yksiköissä (datagrammit) ja yksiköiden määrä on suhteellisen pieni. Käyttämällä UDP-protokollaa myös sovellusten toteutus helpottuu.
Protokolla toteutetaan asiakas- ja palvelinsovelluksille erillisillä tila-automaateilla. Protokollan suunnittelulähtökohtana on käytetty stop-and-go-vuonvalvontamenetelmää. Osa PDU:ista on numeroitu.
Jokainen siirrettävä protokollayksikkö sisältää protokollatunnisteen tarkistussumman ja yksikön pituuden osoittavan arvon sekä varsinaisen protokollakuorman. Protokollayksikön oikeellisuus tarkistetaan protokollatunnisteen, tarkistussumman ja pituuden avulla. PDU:n tyyppi tunnistetaan protokollakuorman alussa olevasta PDU-tunnisteesta. PDU:t on esitelty taulukossa 3.1.
Siirrettävät protokollayksiköt on osittain numeroitu ja numeroitujen yksiköiden kuittaus tapahtuu kuittaus-PDU:lla (ACK). Protokolla takaa varman, virheettömän ja oikeellisen tiedonsiirron. Jos verkkoyhteys katkeaa, sovellukset sulkevat yhteyden uudelleenlähetysyritysten jälkeen.
| PDU | Kulkusuunta | Tietosisältö | Kuvaus | Numeroitu |
|---|---|---|---|---|
| CRE | A => P | Asiakaspelaajan nimi, asiakassovelluksen versio | Yhteydenavauspyyntö | - |
| CCO | A <= P | Palvelinpelaajan nimi, asiakaspelaajan pelimerkki, ensimmäinen siirtovuoro (palvelin/asiakas), pelilaudan koko, voittosuoran pituus, palvelinsovelluksen versio | Yhteyden vahvistus | * |
| DRE | A <=> P | Yhteyden purkamisen tai pelin lopetuksen syy | Yhteydenpurkupyyntö, pelin lopetus, pyydetyn yhteyden hylkääminen, purkupyyntöön vastaaminen | - |
| ACK | A <=> P | Kuitatun PDU:n numero | Kuittaus numeroituun PDU:hun | - |
| TRN | A <=> P | Siirron tekijä (asiakas/palvelin/-), siirron koordinaatit, seuraavan siirtovuoron osoitus (vain palvelin voi päättää tästä) | Siirto | * |
Seuraavissa kuvissa (3.1 ja 3.2) on kuvattu protokollatila-automaattien toiminta. Automaattikuvissa olevat tapahtumatunnisteet on määritelty taulukossa 3.2.


| Tapahtuma | Selite |
|---|---|
| Connect | Asiakassovellus ilmoittaa haluavansa avata yhteyden. (vain asiakas) |
| Disc | Yhteyden sulkeminen käyttäjän tai sovelluksen pyynnöstä. |
| Move | Siirto on tehty tai siirto tulee tehdä. |
| Queue | Tullut PDU laitetaan jonoon odottamaan käsittelyä (käsittely Ready-tilassa). |
| Resend | Lähetä numeroitu PDU (johon odotetaan vastausta) uudestaan. Uudelleenlähetyslaskuria kasvatetaan yhdellä. |
| RSLimit | Uudelleenlähetyslaskuri on lauennut (liian monta Timeoutia). |
| Start | Sovelluksen käynnistys. |
| Timeout | Tilan aikavalvonta laukeaa. |
| Open | Yhteys vastapäähän on auennut. |
Sovellus toteutetaan Microsoft Windows 95 -ympäristöön. Sovelluksessa tulee olla hiirellä käytettävissä oleva graafinen käyttöliittymä.
Toteutuskielenä käytetään C++-ohjelmointikieltä ja toteutustyökaluna Borland C++ Builder 1.0 Professional -kehitysympäristöä. Ohjelman suunnittelu ja toteutus tehdään olio-ohjelmoinnin periaatteita noudattaen.
Verkko-ohjelmointi tehdään WinSock 1.1 rajapinnan avulla käyttäen UDP-protokollan palveluja.
Seuraavasta linkistä voit hakea itsellesi valmiin ristinollasovelluksen:
- Lintula (cs.tut.fi):
~olammi/bin/rnolla/rnolla- Proffa (proffa.cc.tut.fi):
~olammi/bin/rnolla/rnolla
Ristinollaan kuuluu tietysti myös tiivis kilpailuhenki. Ristinollayhteisömme ylläpitää pientä sarjataulukkoa peliemme tilanteesta. Sarjataulukkosivuilla voit tutkia tämänhetkistä sarjataulukkoa ja lisätä tietokantaan uusien pelien tuloksia.