Take and Drop Item

Goals

  1. pridávanie a odoberanie prvkov do slovníka
  2. pridávanie a odoberanie prvkov do zoznamu

Content

Take Item

  1. Vytvorte funkciu take_item(), pomocou ktorej budete vedieť vziať predmet z miestnosti a vložiť ho do batohu.

    Samozrejme musíme sa na príkaz VEZMI pripraviť. Ak príkaz spustíme bez parametre (to znamená, že sme neuviedli, aký predmet chceme zobrať), program vypíše na obrazovku správu Neviem, čo chceš zobrať.. Napríklad:

     $ VEZMI
     Neviem, čo chceš zobrať.
    

    Ak chceme vziať predmet z miestnosti, musí sa nachádzať v zozname predmetov, ktoré sa v miestnosti nachádzajú (room['items']). Ak zasa hráč napíše názov predmetu, ktorý sa v miestnosti nenachádza, vypíšte na obrazovku text Taký predmet tu nikde nevidím.

     $ VEZMI elektricka
     Taký predmet tu nikde nevidím.
    

    Takže predmet je možné z miestnosti vziať len vtedy, ak sa nachádza v zozname predmetov danej miestnosti. V tom momente je potrebné predmet odstrániť z tohto zoznamu a vložiť ho do inventára (zoznam nachádzajúci sa v premennej inventory).

    Ak chceme odstrániť prvok zo zoznamu, použijeme na to metódu remove() nad objektom tohto zoznamu. Napríklad:

     l = [ 'kladivo', 'zuvacka', 'vreckovka' ]
     item = l[1]
     l.remove(item)
     l
     [ 'kladivo', 'vreckovka' ]
    

    [alert]

    Tu však pozor! Ak predmet odstránite spôsobom l.remove(l[1]), prvok zoznamu ste nenávratne stratili! Pred samotným odstránením si ho uložte do pomocnej premennej.

    Ak naopak potrebujete nejaký prvok do zoznamu vložiť, použijeme na to metódu append() nad objektom zoznamu. Napríklad:

     l = [ 'kladivo', 'vreckovka' ]
     item = 'zuvacka'
     l.append(item)
     l
     [ 'kladivo', 'vreckovka', 'zuvacka' ]
    

    Metóda append() vložila nový prvok na koniec tohto zoznamu (pripojila ho k zoznamu). Keďže riešime úlohu, kde nezáleží na poradí prvkov, vystačíme si s ňou. Ak by sme chceli prvok vložiť na konkrétnu pozíciu, museli by sme použiť metódu insert().

    Riešenie úlohy môže vyzerať napríklad takto:

     def take_item(line, inventory, room):
         cmd = line.split(maxsplit=1)
    
         if len(cmd) == 1:
             print("Neviem čo chceš zobrať.")
         else:
             name = cmd[1]
             for item in room["items"]:
                 if name == item["name"]:
                     room['items'].remove(item)
                     inventory.append(item)
                     print(f'Do batohu si si vložil predmet {name}.')
                     break
             else:
                 print("taký predmet tu nikde nevidim.")
    
  2. Rozšírte slovník príkazov hry o príkaz VEZMI, po zavolaní ktorého dôjde ku zavolaniu vytvorenej funkcie take_item().

     elif line.startswith("vezmi"):
         take_item(world[location], inventory, line)
    

Drop Item

  1. Vytvorte funkciu drop_item(), pomocou ktorej budete vedieť predmet, ktorý sa nachádza v hráčovom batohu, položiť v miestnosti.

    Pri riešení úlohy môžeme vychádzať z implementácie funkcie take_item(), pretože bude veľmi podobná. Ak príkaz spustíme bez parametre (to znamená, že sme neuviedli, aký predmet chceme položiť), program vypíše na obrazovku správu Neviem, čo chceš položiť.. Napríklad:

     $ POLOZ
     Neviem, čo chceš položiť.
    

    Ak chceme položiť predmet do miestnosti, musí sa nachádzať v hráčovom inventári (inventory). Ak hráč napíše názov predmetu, ktorý sa v inventári nenachádza, vypíšte na obrazovku text Taký predmet u seba nemáš.

     $ POLOZ elektricka
     Taký predmet u seba nemáš.
    

    Takže predmet je možné položiť len vtedy, ak sa nachádza v hráčovom batohu. Vtedy je potrebné predmet odstrániť z batohu a vložiť ho do miestnosti (zoznam nachádzajúci sa v premennej room['items']).

    Riešenie úlohy môže vyzerať napríklad takto:

     def drop_item(line, inventory, room):
         cmd = line.split(maxsplit=1)
    
         if len(cmd) == 1:
             print("Neviem čo chceš položiť.")
         else:
             name = cmd[1]
             for item in inventory:
                 if name == item["name"]:
                     inventory.remove(item)
                     room['items'].append(item)
                     print(f'Položil si predmet {name}.')
                     break
             else:
                 print("Taký predmet u seba nemáš.")
    
  2. Rozšírte slovník príkazov hry o príkaz POLOZ, po zavolaní ktorého dôjde ku zavolaniu vytvorenej funkcie drop_item().

     elif line.startswith("poloz"):
         drop_item(world[location], inventory, line)
    

Inventory Capacity

  1. Zabezpečte, aby bolo možné v batohu niesť maximálne 5 predmetov.

    Pre zabezpečenie

    Dve riešenia:

    1. ak ma zaujíma, či sa predmet v miestnosti nachádza
    2. ak ma nezaujíma, či sa predmet v miestnosti nachádza

Item Features

Nie všetky predmety, ktoré sa v hre nachádzajú, bude možné vziať do batohu. Potrebujeme teda vytvoriť mechanizmus, pomocou ktorého budeme vedieť odlíšiť predmety, ktoré je možné do batohu vziať od tých, ktoré do batohu vziať nebudeme vedieť. Za týmto účelom rozšírime slovník reprezentujúci predmet o kľúč featers, ktorý bude obsahovať zoznam so všetkými vlastnosťami predmetu.

Mohli by sme urobiť aj to, že by sme pridali toľko vlastností ku každému predmetu vo forme samostatných kľúčov, koľko predmet má, resp. koľko hra dokáže rozoznať. Nevýhodou by však bolo, že ku každému musí existovať hodnota (napr. True, ak danú vlastnosť predmet má alebo False, ak ju nemá). Toto by bolo trošku neprakticé a zdĺhavé.

Overenie bude následne veľmi jednoduché - opýtame sa len, či predmet obsahuje vybranú vlastnosť pomocou operátora in takto:

'movable' in item['features']
True

Aktualizovaná verzia funkcie take_item() bude vyzerať nasledovne:

def take_item(room, inventory, line):
    cmd = line.split(maxsplit=1)
    if len(cmd) == 1:
        print("Ta ja neznám čo chceš zobrať.")
    else:
        name = cmd[1]
        for item in room["items"]:
            if item['name'] == name:
                if 'movable' not in item['features']:
                    print('Tento predmet sa nedá vziať.')

                elif len(inventory) == 3:
                    print('Batoh je plný.')

                else:
                    room['items'].remove(item)
                    inventory.append(item)
                    print(f'Z miestnosti si vzal predmet {name}.')

                break
        else:
            print("Taký predmet tu nikde nevidím.")

Homework

  1. Vytvorte dokumentačné reťazce pre nové funkcie, ktoré ste vytvorili.

results matching ""

    No results matching ""