Tablići

Projekat za Praktikum iz operativnih sistema

Student: Miloš Savić, 01/372

Sadržaj

O igri	3

Način igranja	4

Realizacija programa	5

Moguća poboljšanja programa	6

O igri

Tablići su dobro poznata igra sa kartama, koja i dalje uživa veliku popularnost, zbog svoje jednostavnosti i zaraznosti. Pravila se brzo uče, i nema ih mnogo. Igra se sa jednim špilom od 52 karte, a broj igrača u osnovnoj varijanti može varirati od 2 do 4. U zavisnosti od dogovora, može se igrati po principu svako za sebe, ili u parovima, od čega zavisi i bodovanje.

Na početku, igračima se deli po šest karata, i četiri karte se spuštaju na talon. Igrači naizmenično bacaju karte na talon, pri tome po određenim pravilima noseći karte sa talona, ili ih ostavljajući. Nakon što svi igrači izbace sve karte, deli se sledećih 6 karata, i tako u krug, sve dok se sve karte iz špila ne podele.

Pravila nošenja su sledeća: karta nosi kartu iste vrednosti, ili više karata iste vrednosti, ili zbir karata manje vrednosti, ili kombinaciju ova dva prethodna. Jedinica se računa ili sa vrednošću jedan, ili sa vrednošću jedanaest, kako igraču više odgovara.

Nakon izbacivanja svih karata, vrši se bodovanje. Svaka karta koju je igrač odneo, vrednosti veće od deset računa se kao jedan štih. Specijalan slučaj su dvojka tref, koja se takođe računa kao štih, i desetka karo, koja vredi 2. Jedinice se ovde računaju takođe kao štihovi. Osim ovoga, ukoliko igrač odnese sve karte sa talona, beleži mu se “tabla”, koja vredi jedan poen. Dodatne poene igrač dobija ukoliko je odneo više karata od suparnika, pri čemu mu se na konto dodaje 3 poena. Igra se može završiti ili nakon bodovanja, ili kada se skupi određen broj bodova, pri čemu pobeđuje igrač koji prvi premaši dogovorenu vrednost.

Način igranja

tablici se pokreću iz konzole, komandom ./tablici. Pojavljuje se pozdravni ekran, iz koga se izlazi pritiskom na enter. Nakon unošenja broja poena do kojeg će se igrati, prvi igrač dobija prikaz talona, i karata koje trenutno poseduje, i od njega se traži izbor karte koju će izbaciti. Izbor karte se vrši unosom vrednosti karte (1-14), i njenog znaka (P, K, T, H). Ukoliko igrač ne poseduje dotičnu kartu, pojavljuje se prigodna poruka, i ponovo očekuje unos.

Ukoliko je unos karte ispravan, traži se od igrača da izabere karte koje želi da odnese sa talona ili da se odluči da izbaci kartu na talon. Izbor kombinacije karata koja se nosi vrši se na isti način kao i izbor karte za izbacivanje, unosom kombinacije vrednost znak za svaku kartu koja se želi odneti. Pri tome, nije potrebno unositi karte u striktnom redosledu. Ukoliko se karta želi izbaciti na talon, potrebno je uneti kombinaciju 0 0.

Završetak unosa se takođe naznačava kombinacijom 0 0.

Ako je kombinacija ispravna, talon se ponovo iscrtava, sa uklonjenim kartama koje su odnesene, ili sa dodatom kartom koja je izbačena. i prikazuju karte u posedu drugog igrača. Krug se ponavlja, sve dok se ne izbace sve karte. Dobijeni bodovi se odmah zaračunavaju i prikazuju u uglu, zajedno sa tablama. Ukoliko je početna granica premašena, program završava rad i ispisuje koji igrač je pobedio. Ručno, iz programa se izlazi ili unosom 0 u granicu do koje se igra, ili pritiskom na Ctrl-C.

Realizacija programa

Program je pisan u jeziku C, i predviđen je za izvršavanje u konzoli.

Centralni deo progama se nalazi u funkcijama izaberi_kartu, izaberi_kombinaciju, i obrada_izbora, koje prihvataju unos sa tastature, i procesiraju ga.

Podaci o kartama igrača se čuvaju u odgovarajućim nizovima. Postojala je opcija da se umesto nizova koriste liste, ali bi usled malog broja očekivanih elemenata korišćenje dinamički alociranih elemenata izgubilo svrhu. Pored toga, česta pretraživanja se lakše i brže realizuju u nizovima.

main() funkcija se brine o inicijalizaciji nizova. Karte se smeštaju u vidu struktura, koje sadrže podatke o vrednosti i znaku karte, kao i o znaku koji se ispisuje za kartu, u slučaju da se u nekom momentu ispis izmeni sa vrednosti (10-14) na simbol karte (10AJQK). Niz spil se generiše u odgovarajućoj funkciji, kao i nizovi za prvog i drugog igrača.

Program započinje pozivanjem funkcija koje na slučajan način iz niza spil biraju po šest karata i smeštaju u nizove koji pripadaju igračima. Pozivaju se funkcije za iscrtavanje pozdravnog ekrana, a zatim i iscrtaj_talon i iscrtaj_niz, kojoj se predaju pozivi za odgovarajući niz.

Funkcije za obradu unosa sadrže provere unesenih podataka poređenjem talona i niza igrača koji je na potezu. Ukoliko je sve u redu, prelazi se na obradu unosa. Binarnim poređenjem nizova unosa i talona određuju se karte koje treba ukloniti. Ažuriraju se nizovi odnetih karata, i beleže eventualno očišćeni taloni (table).

Po završetku obrade, program se vraća u main() funkciju, gde se opslužuje drugi korisnik, i tako naizmenično. Petlje koje simuliraju kruženje igrača se završavaju kada se premaši definisani broj poena, izbace sve karte sa špila, i igrači poizbacuju sve karte, respektivno.

Iscrtavanje i pozicioniranje na ekranu je realizovano korišćenjem već gotove (preuzete) funkcije, koja pomera kursor korišćenjem ANSI sekvenci. Na isti način se obezbeđuje i iscrtavanje karata crvenom bojom.

Moguća poboljšanja programa

Program je zamišljen kao osnova. Funkcionalnost koju trenutno pruža podržava dva igrača koji igraju naizmenično, na istoj tastaturi. Međutim, vrlo malim izmenama koda, moguće je lako proširiti podršku i na 3, pa i na 4 igrača. Dalje, budući da je ispis, odnosno, iscrtavanje, odvojeno od obrade, osim u malom broju slučajeva, moguće je program prilagoditi grafičkom okruženju, pri čemu bi onda bi se za biranje karata i slično mogao koristiti miš umesto tastature, što bi doprinelo udobnosti u radu.

S druge strane, tablići su društvena igra, tako da je igranje na jednom računaru dva ljudska igrača pomalo besmisleno. Ako se u kodu doda unos broja igrača (jedan ili više), i funkcije za izbor karte i kombinacije malo prilagode i prošire, moguće je dobiti računarskog protivnika. Za početak, dovoljno je dodati slučajan izbor karte za drugog igrača, i umesto ručnog izbora kombinacije, poređenjem pronaći sve moguće kombinacije za datu kartu, i izabrati jednu od kombinacija, čime bi se dobio računarski protivnik na nivou početnika. Analizom odnesenih karata, računaru bi se mogla dati izvesna prednost i određena količina “inteligencije”, kojom bi se mogao proceniti najbolji potez u datom momentu, čime bi se dobio dostojniji protivnik.

Pravi smisao igra bi mogla dobiti korišćenjem mreže, kada bi više igrača moglo da se poveže i igra međusobno. Opet, izmene u programu ne bi bile prevelike, budući da se komunikacija između funkcija odvija preko malog broja podataka, mahom indeksa izabrane karte u špilu, i eventualno jednog ili dva niza. Na ovaj način, bez grafike čak i na terminalima, igra bi mogla postati jednostavna i brza razbibriga, zahvaljujući Internetu, i za igrače širom sveta.

Projekat iz operativnih sistema	Miloš Savić, 01/372

2006-08-30T17:21:40