Programmeerimine keeles C++
Praktikum 6: lisateegi kasutamine: võrguteek RakNet
Üldised tingimused
Tähtis! Loe läbi ülesannete vormistamise tingimused aine veebilehelt! Ülesandeid esitatakse läbi aine veebilehel asuva vormi. E-posti teel lahendusi vastu ei võeta. Küsimustega pöörduda aine listi või praktikumijuhendaja poole.
Lahendamiseks on aega 14 päeva.
Tähtaeg: 05.05.2019 23:59:59
Märkus: Palun ärge kasutage RakNeti uuemat versiooni kui 4.081, mis on virtuaalmasinas. Praktikumi lehel on teegi versioon 4.069.
Üldised nõuded
Selle praktikumi koduse tööna peate edasi arendama aine veebilehel antud alusprogrammi. Töötav Makefile
on olemas, teie ülesanne on lahendada ülesanne ja dokumenteerida selle klassid. Ülesande lahendamiseks vajalikele materjalidele on viited praktikumi veebilehel.
RakNeti teegi leidmiseks vajalikud viited leiate aine veebilehelt. Alusprogrammi kompileerimiseks RakNeti teegiga peate Makefile
alguses määrama muutujas RAKNETDIR
teegi juurkausta (minGW kasutajatele meeldetuletuseks asukoht tuleks anda kujul C:/cpp/MinGWRaknet
). Lisaks peate vastavalt oma operatsioonisüsteemile eemaldama kommentaari ühe järgneva rea eest.
Märkus: Palun ärge pange teeki oma lahendusega kaasa.
Alusprogrammi käivitamiseks tuleb esmalt panna tööle server ./bin/GuessingServer
ja seejärel eraldi käsurealt klient, andes ette serveri aadressi ./bin/GuessingClient localhost
.
Ülesanne 1 – Klientprogramm arvu äraarvamise mängu jaoks (6 punkti)
Alusprogrammis on antud valmis server, mis suudab teenindada arvu ära arvavat klienti. Ära tuleb arvata arv vahemikus 0–99 (mõlemad kaasa arvatud). Lisaks on antud poolik klientprogramm. Teie ülesandeks on klientprogramm valmis kirjutada. Selleks peate tegema vähemalt järgmised sammud:
- Tutvuge
ClientApp.cpp
failiga, mis algatab kogu programmi töö. - Uurige
GuessingClient
klassi ningGuessingClientState
klassifikaatorit. Mõistke, kuidas klass olekute vahel liigub. Kui pole öeldud teisiti, siis tuleb muudatused tehaGuessingClient
klassis. - Uurige, kuidas töödeldakse saabuvaid sõnumeid
nextFrame
meetodis ning kuidas need olekut muudavad. Uurige, kuidas saadetakse sõnumeid. - Realiseerige meetod
sendIntroductionMessage
, millega klient saadab serverile teate, et soovib mängu alustada. Kasutage paketi identifikaatoritPACKET_INTRODUCTION
. Kontrollige, millise struktuuriga sõnumit server ootab ning kasutage täpselt samu andmetüüpe ja järjekorda. - Realiseerige meetod
processReadyMessage
, mis töötleb serverilt vastuseks tuleva sõnumi, mis teatab serveri valmidusest kliendiga mängu alustada. Sõnumi identifikaator onPACKET_READY
. Serveri koodist näete, millist sõnumit tuleb töödelda. - Kirjutage meetod kasutaja pakkumise saatmiseks. Kasutage paketi identifikaatorit
PACKET_GUESS
. Küsige kasutajalt tema pakkumine ja kontrollige selle korrektsust, vigase sisendi korral andke veateade ja küsige uut pakkumist. Edastage pakkumine serverile. Kontrollige jällegi serveri koodist, mida on vaja saata. - Lisage sõnumi
PACKET_GUESS_REPLY
töötlemine ning andke kasutajale teada, kas tema pakkumine oli korrektne, liiga suur või liiga väike. - Pärast mängu lõppu pakkuge kasutajale võimalust uuesti mängida. Selle kontrolli saate panna
ClientApp.cpp
faili. - Täiendage klientprogrammi nii, et see suudab ilma kasutaja abita serveriga suheldes arvu ära arvata maksimaalselt seitsme arvamisega. Kasutajaliideses peab saama valida, kas soovitakse ise mängida või kasutada automaatset arvamist, ka peale esimest mängimist.
Tulemusena peab valmima programm, mille käivitamisel klient ühendub serveriga ning seejärel alustab kasutajalt arvude küsimist. Õige arvu äraarvamisel lõpetab programm töö. Ülesandele 1 leidub lahendus, mis kasutab päises GuessingGame.h
kirjeldatud konstante ning töötab GuessingServer.cpp
koodiga töötava serveriga ilma viimast muutmata. Lahenduse leidmine nõuab mõlema programmi ning teegi tundmaõppimist ning vajalike täienduste tegemist.
Kõige olulisem on see, et programm töötaks ning sellega saaks kirjeldatud mängu mängida. Mittetoimiva koodi puhul võin paluda selle täiendamist nii kaua kuni programm edukalt tööle läheb.
Ülesanne 2 – Täiendav kasutajamugavus (4 punkti)
Lisage PACKET_INTRODUCTION
sõnumisse mängija nimi ning laske serveril seda kasutada väljundis tema IP-aadressi asemel (loomulikult pärast seda, kui nimi on serverini jõudnud). Pange tähele, et selle jaoks on teil vaja serveri lähtekoodi muuta.
Täiendage serverit ja klienti nii, et mängu lõpus öeldaks kliendile, mitme pakkumisega ta õige lahenduseni jõudis.
- Korrektse pakkumise korral peab server saatma lisaks tulemusele ka pakkumiste arvu, mis õige arvu äraarvamiseks kulus. Selleks tuleb täiendada serverit.
- Töödelge mängulõpu tingimust. Kui pakkumine on õige, peaks klient väljastama pakkumiste arvu, mille server saatis. Selleks tuleb täiendada klienti.
Lisaülesanne 3 – Edetabel (1 lisapunkt)
Lisage serverisse arvu kõige kiiremini (kordade arvu mõttes) äraarvanute TOP 10 edetabel. Edetabel peab olema faili salvestatud ning elama üle ka serveri taaskäivitamised. Edetabel tuleb saata ka kliendile ja klient peab seda näitama. Edetabelis peab olema lisaks mängija nimele ja tulemusele juures ka kuupäev ja kellaaeg.
NB! Nimedes võivad olla tühikud.
Vihjeid
- Sisendi lugemiseks on hea kasutada
getline
funktsiooni. - Kasutaja pakkumise küsimisel ei ole suvaline sisestatud tekst samaväärne nulliga.