Potapanje brodova


Ovo je popularna i zabavna igra za dva igrača. Cilj igre je potopiti sve brodove protivničke mornarice, a da što više vaših brodova ostane čitavo.


Pravila igre

Igra Potapanje brodova poznata je kao igra koje se obično igra samo pomoću olovke i papira. Igra se na tabli veličine 10x10. Kolone su označene slovima abecede A-J, dok su vrste označene brojevima 1-10. Pre nego što počne igra, svaki igrač tajno postavi brodove na svojoj glavnoj tabli. Od koliko polja će sastavljati brodove, ostaje na igračima da se dogovore. Sva polja koja zauzima brod moraju biti poravnata duž jedne linije, orijentisana horizontalno ili vertikalno. Brodovi se mogu dodirivati, ali se ne mogu preklapati, tj. na jednom polju se može nalaziti samo jedan brod, kao što je prikazano na slici. Svaki igrač dobija isti broj i vrstu brodova. Kada se postave svi brodovi, igra počinje. Odvija se kao niz poteza, gde se igrači naizmenično smenjuju prilikom svakog poteza. Kada dođe njegov red da igra, igrač obaveštava protivnika o jednom polju na njegovoj tabli koje gađa. Protivnik mu odgovara da li je promašio ili pogodio brod. U slučaju da se pogodi poslednje polje broda, protivnik ga obaveštava da je brod potopljen, kao i koji brod je u pitanju. Ako je igrač pogodio, igra ponovo, dok u slučaju promašaja, dolazi red na protivnika. Igra se završava kada jedan od igrača ostane bez svojih brodova, odnosno kada jedan igrač potopi drugom igraču sve brodove. Primer toka igre se može videti na slici.

slika

Potapanje brodova - prva verzija

Uprostićemo igru tako što ćemo napraviti mrežu dimenzija 5x5 i program će sam izabrati neko polje određeno redom i kolonom, a igrač treba da pogodi koje je to polje tako što odabere red i kolonu, tj. koordinate polja. Ako ne pogodi program to polje označi sa O, a ako pogodi obavesti igrača da je potopio brod i to polje označi sa X. Igrač ima 5 pokušaja da pogodi gde je sakriven brod.

Na samom početku je potrebno napraviti mrežu. To ćemo uraditi pomoću listi. Kako želimo da mreža ima dimenzije 5x5, potrebno je implementirati pet listi koje će se nalaziti jedna ispod druge. Stavićemo da svaka sadrži pet #.

mreza=[]
for i in range(0,5):
    mreza.append(["#"] * 5)
def stampaj_mrezu(mreza):
    for red in mreza:
        print (red)
stampaj_mrezu(mreza) 

		
Kopiraj

Mi skladištimo naše podatke kao listu, ali igrač to ne mora da zna. Bilo bi lepo osloboditi se navodnika i zareza. Radi boljeg ispisa potrebno je koristiti funkciju join(). Join() – spaja navedene stringove, dodajući navedeni separator između njih - separator.join(lista). Ovde možete videti da se separatoru pristupa pomoću tačke.


mreza=[]
for i in range(0,5):
    mreza.append(["#"] * 5)
def stampaj_mrezu (mreza):
    for red in mreza:
         print (" ".join(red))
stampaj_mrezu(mreza) 

		
Kopiraj

raw_input() – Ova funkcija omogućava korisniku da unese neku vrednost i vraća vrednost tipa string. U našem slučaju potrebni su celi brojevi za nagađanja, pa ćemo konvertovati string u ceo broj pomoću int(). Ukoliko korisnik unese podatak koji nije broj, doći će do greške.

Sada, možemo da kodiramo celu igru.


from random import randint 

mreza=[]

for i in range(0,5):
    mreza.append(["#"] * 5)
def stampaj_mrezu (mreza):
    for red in mreza:
        print (" ".join(red))
        
print ('Igra Potapanje brodova moze da pocne!')
stampaj_mrezu(mreza) 
#randint(a,b) funkcija vraća jedan nasumično izabran ceo broj iz intervala [a,b] 
#Red koji se bira može imati vrednost koja se nalazi u intervalu od 1 pa do dužine mreže
#U našem slučaju to je broj lista od kojih je mreža sastavljena (5)
def nasumicni_red(mreza):
    return randint(1, len(mreza))
#Kolona koja se bira može imati vrednost koja se nalazi u intervalu od 1 pa do broja članova liste
#Kako su sve liste iste dužine, može se uzeti proizvoljna.
#Ovde je izabrana prva lista(podsetimo se da indeksiranje počinje od 0)
def nasumicna_kolona(mreza):
    return randint(1, len(mreza[0]))


brod_red = nasumicni_red(mreza)
brod_kolona = nasumicna_kolona(mreza)

#Korisnik ima pet šansi da potopi brod
for i in range(5):
    red = i 
    nagadjanje_reda = int(raw_input('Pogadjajte red:'))
    nagadjanje_kolona = int(raw_input('Pogadjajte kolonu:'))
    
    if (nagadjanje_reda == brod_red) and (nagadjanje_kolona == brod_kolona):
        print ('Bravo! Potopili ste brod!')
        mreza[nagadjanje_reda-1][nagadjanje_kolona-1]='X'
        stampaj_mrezu(mreza)
        break
    else:
#U slučaju da igrač nije pogodio polje, može se desiti:
#Da je naveo red i kolonu izvan datog opsega
#Da je naveo koordinate polja koje je već otvarao       
        if (nagadjanje_reda < 1 or nagadjanje_reda > 5) or (nagadjanje_kolona < 1 or nagadjanje_kolona > 5):
            print ('Ups, izvan opsega ste!')
        elif(mreza[nagadjanje_reda-1][nagadjanje_kolona-1]=='O'):
            print ('Vec ste pogadjali!')
        else:
            print ('Promasili ste brod!')
            mreza[nagadjanje_reda-1][nagadjanje_kolona-1] = 'O'
            print (red + 1)
            stampaj_mrezu(mreza)
    if (red == 4):
            print ('Kraj igre!')
if(mreza[brod_red-1][brod_kolona-1]!='X'):
    print ('Brod se nalazio na poziciji (%d,%d):') %(brod_red,brod_kolona)
    mreza[brod_red-1][brod_kolona-1]='X'
    stampaj_mrezu(mreza)
		
Kopiraj
levo desno

Uputstvo

Neke od programa nećete moći da pokrenete na našoj konzoli, zato Vam predlažemo da sa zvaničnog sajta www.python.org preuzmete portabilnu verziju. Instalacija je vrlo jednostavna. Mi Vam predažemo da odaberete verziju 3.3.5 koju smo i mi koristili. Tekstualni editor u kome možete pisati svoje programe se pokreće preko programa koji se zove IDLE i automatski se instalira sa celim paketom. Novi program započinjete klikom na padajući meni "FILE" >> "NEW FILE". Možete ga pokrenuti pritiskom na dugme F5 na tastaturi.
Konzola koja se nalazi na sajtu omogućava rad sa većinom prezentovanog materijala, ali je naglašeno kada je potrebno preći na instaliranu konzolu.

;