Python - Igra pogađanja riječi (Vješala)


Programska realizacija poznate društvene igre pogađanja sastoji se u pogađanju (slovo po slovo) nepoznate reči prema sljedećem algoritmu:

  1. Program slučajno bira riječ iz zadane liste riječi.
  2. Korisnik pokušava da pogodi nepoznatu riječ, slovo po slovo.
  3. Sistem prikazuje svako slovo ispravno pogođenih ili pogrešnih slova.
  4. Za ispravno pogođena slova prikazuje se i položaj u nepoznatoj riječi.
  5. Za pogrešna slova, prikazuje se jedan od djelimičnih prikaza različitih faza "obješenog" igrača, svaki put s većim stepenom detalja.
  6. Ako pogodi sva slova nepoznate reči u okviru zadanog najvećeg broja pokušaja, korisnik je pobjednik.
  7. Inače, prikazuje se završna poruka s potpunim prikazom "obešenog".

Postepeno kompletiranje slike "obješenog" realizovano je ispisivanjem tekstualnih simbola, bez upotrebe grafike. Strukture podataka koje se koriste u programu su n-torke SLIKE_VJESALA i RIJECI, označene kao konstante. Struktura SLIKE_VJESALA je n-torka, koja se sastoji od stringova, koji predstavljaju slikoviti prikaz 7 faza "vješanja" igrača koji više puta griješi u pogađanju slova (konkretni prikaz bira se po broju pogrešnih riječi, 0..6).

SLIKE_VJESALA = ('''
+---+
|   |
|
|
|
| ========''',

Struktura RIJECI je n-torka u kojoj su navedene sve reči od kojih program slučajno bira jednu za pogađanje:

RIJECI = ('ajkula', 'babun', 'ćurka', 'dabar', ... , 'zec', 'zmija')

Slučajni izbor riječi vrši se na osnovu slučajnog broja, koji se koristi kao indeks izabrane reči u n-torki RIJECI. Slučajni cijeli broj u zadanim granicama generiše se funkcijom randint() iz modula random:

random.randint(a, b)

Tekuća igra se sastoji od:

  • prikaza statusa igrača u obliku simbola "vješala" (0..6) i liste pogrešnih i ispravno pogođenih slova, s pozicijama u nepoznatoj riječi
  • pogađanja riječi (slovo po slovo)
  • ispitivanja ispravnosti unesenog slova

Na kraju program pita igrača želi li da igra novu igru.


Pogađanje riječi (slovo po slovo):

  • igrač unosi jedno slovo, nakon čega se proverava se da li je uneseno tačno jedno slovo i ništa drugo,
  • igrač se upozorava ako unese više slova, ponovi neko od prethodnih ili unese veliko slovo i traži se da ponovi unos.

Ispitivanja ispravnosti unesenog slova:

  • provjerava se da li slovo pripada nepoznatoj riječi
  • ako slovo pripada nepoznatoj reči, provjerava se da li su pogođena sva slova, kada se igrač obavještava da je pobjedio, a tekuća igra završava. Ako igrač ima pravo još da pogađa, igra se nastavlja,
  • ako slovo ne pripada nepoznatoj reči, dodaje se u pogrešna slova,
  • ako je igrač pogađao prevelik broj puta i izgubio, prikazuje se posljednja slika "vješala" i tekuća igra se završava.

Igra pogađanja realizovan je sljedećim programskim kodom:

import random

SLIKE_VJESALA = ('''
    +---+
    |   |
        |
        |
        |
        |
========''', '''

    +---+
    |   |
    O   |
        |
        |
        |
========''', '''

    +---+
    |   |
    O   |
    |   |
        |
        |
========''', '''

    +---+
    |   |
    O   |
   /|   |
        |
        |
========''', '''

    +---+
    |   |
    O   |
   /|\  |
        |
        |
========''', '''

    +---+
    |   |
    O   |
   /|\  |
   /    |
        |
========''', '''

    +---+
    |   |
    O   |
   /|\  |
   / \  |
        |
========''')

RIJECI = ('ajkula', 'babun', 'ćurka', 'dabar', 'foka',\
        'gavran','golub', 'guska', 'gušter',\
        'jaguar', 'jarac', 'jastreb', 'jelen',\
        'kamila', 'kit', 'kobra', 'kojot', 'labud',\
        'lama', 'lasica', 'lav', 'lisica', 'los', \
        'losos', 'mačka', 'magarac', 'majmun',\
        'mazga', 'medved', 'miš', 'mrav', 'mula',\
        'nosorog', 'orao', 'ovan', 'ovca', 'pacov',\
        'panda', 'papagaj', 'pas', 'patka', 'pauk',\
        'piton', 'roda', 'šišmiš', 'školjka', 'sova',\
        'tigar', 'tvor', 'vidra', 'vrana', 'vuk', \
        'žaba', 'zebra', 'zec', 'zmija')

def Inicijalizacija():

    # Inicijalizacija globalnih promenljivih
    global pogresnaSlova, ispravnaSlova, nepoznataRijec
    pogresnaSlova = ''
    ispravnaSlova = ''

    # Slučajni broj [0..broj reči]
    indeks = random.randint(0, len(RIJECI)-1)
    nepoznataRijec = RIJECI[indeks]
    return

def prikaziVjesala():
    # Prikaz odgovarajuće slike na osnovu
    # broja pogrešnih pogađanja

    print(SLIKE_VJESALA[len(pogresnaSlova)])
    print()
    print('Pogrešna slova:', end=' ')
    for slovo in pogresnaSlova:
        print(slovo, end=' ')
    print()
    praznine = '_' * len(nepoznataRijec)

    # Zamjena praznina ispravno pogođenim slovima
    for i in range(len(nepoznataRijec)):
        if nepoznataRijec[i] in ispravnaSlova:
            praznine = praznine[:i] + nepoznataRijec[i] + praznine[i+1:]

    # Prikaz tajne riječi s praznim mjestom između slova
    for slovo in praznine:
        print(slovo, end=' ')
    print()
    return

def unosSlova(dosadasnjaPogadjanja):
    # Funkacija vraća slova koja je korisnik unio
    # i provjerava da je uneseno samo jedno slovo
    # i ništa drugo

    while True:
        print('Pogodite slovo.')
        pogadjanje = input()
        pogadjanje = pogadjanje.lower()
        if len(pogadjanje) != 1:
            print('Molim unesite jedno slovo.')
        elif pogadjanje in dosadasnjaPogadjanja:
            print('Već ste naveli ovo slovo. ', 'Izaberite neko drugo.')
        elif pogadjanje not in 'abcdefghijklmnopqrstuvwxyzčćžšđ':
            print('Molim unesite malo SLOVO.')
        else:
            return pogadjanje

print("---------------------------------")
print("IGRA POGAĐANJA RIJEČI 'V J E Š A L A'")
Inicijalizacija()

krajIgre = False
while not krajIgre:

    prikaziVjesala()

    # Igrač treba da unese (pogodi)
    # jedno slovo nepoznate riječi
    pogadjanje = unosSlova(pogresnaSlova + ispravnaSlova)

    if pogadjanje in nepoznataRijec:
        ispravnaSlova = ispravnaSlova + pogadjanje
        # Provjera da li je igrač već pobjedio
        pronadjenaSvaSlova = True
        for i in range(len(nepoznataRijec)):
            if nepoznataRijec[i] not in ispravnaSlova:
                pronadjenaSvaSlova = False
                break
        if pronadjenaSvaSlova:
            print('\nDa! Tajna reč je bila "'+ nepoznataRijec + '"! Pobjedili ste!')
            krajIgre = True
    else:
        pogresnaSlova = pogresnaSlova + pogadjanje
        # Provjera da li je igrač pogađao
        # prevelik broj puta i da li je izgubio
        if len(pogresnaSlova) == len(SLIKE_VJESALA) - 1:
            prikaziVjesala()
            print('\nPrekoračili ste dozvoljeni broj',
                    'pogađanja poslje ' +
                    str(len(pogresnaSlova)) +
                    ' pogrešnih i ' +
                    str(len(ispravnaSlova)) +
                    ' ispravnih pogađanja.\nRiječ je bila "'+
                    nepoznataRijec + '"')
            krajIgre = True

    # Ako je igra završena, pitanje igraču
    # da li želi da igra ponovo
    if krajIgre == True:
        odg = input('\nŽelite li da igrate ponovo?(d/n)')
        if odg != 'n':
            Inicijalizacija()
            krajIgre = False