Take and Drop Item
Goals
- pridávanie a odoberanie prvkov do slovníka
- pridávanie a odoberanie prvkov do zoznamu
Content
Take Item
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ávuNeviem, č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 textTaký 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óduinsert()
.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.")
Rozšírte slovník príkazov hry o príkaz
VEZMI
, po zavolaní ktorého dôjde ku zavolaniu vytvorenej funkcietake_item()
.elif line.startswith("vezmi"): take_item(world[location], inventory, line)
Drop Item
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ávuNeviem, č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 textTaký 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áš.")
Rozšírte slovník príkazov hry o príkaz
POLOZ
, po zavolaní ktorého dôjde ku zavolaniu vytvorenej funkciedrop_item()
.elif line.startswith("poloz"): drop_item(world[location], inventory, line)
Inventory Capacity
Zabezpečte, aby bolo možné v batohu niesť maximálne 5 predmetov.
Pre zabezpečenie
Dve riešenia:
- ak ma zaujíma, či sa predmet v miestnosti nachádza
- 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
- Vytvorte dokumentačné reťazce pre nové funkcie, ktoré ste vytvorili.