czubert / RPG_Game

A game based on object-oriented programming
https://github.com/czubert/RPG_Game
0 stars 0 forks source link

precz z tmp_list #5

Open charzu opened 5 years ago

charzu commented 5 years ago

Chciałbym wyeliminować zmienną pomocniczą tmp_list https://github.com/czubert/RPG_Game/blob/ba2e63190945907c352307a5197971565de68efe/engine.py#L40 Moglibyśmy użyć zip, ale zip zwraca tyle krotek z elementami, co krótsza lista/iterable/generator ma elementów. Więc trzeba znaleźć albo samemu napisać coś fajniejszego. Przy okazji pobaw się funkcją zip i zobacz jak się zachowuje kiedy jej się poda generatory równej i różnej długości A poza tym zobacz jak się zachowuje generator wsadzony do pętli typu

for i in my_generator:
    do_sth(i)

Istnieje fajna biblioteka: itertools - zawiera funkcje, które pozwalają na różne dziwne sposoby pętlić po różnych rzeczach. My byśmy mogli pętlić po dwóch team'ach jednocześnie żeby wybierać na zmianę bohaterów z dwóch drużyn. Poszukaj tam funkcji, która mogłaby nam się przydać.

Z generatora (klasa Team), który zwraca nam bohatera można by wyrzucić wartość specjalną None dzięki czemu ostatnie co zwróci generator to po prostu. Oczywiście trzeba by jeszcze kontrolować jakoś co ta funkcja nam zwraca (czy gdzieś się nie skończyli już bohaterowie) - ale wtedy nie trzeba wyrzucać teamu z listy pomocniczej tylko nie obsługiwać ruchu.

czubert commented 5 years ago

Przy okazji pobaw się funkcją zip i zobacz jak się zachowuje kiedy jej się poda generatory równej i różnej długości tak samo jak normalnie, leci do konca krotszej listy

a = [1,2,3,4] b = ['a', 'b', 'c', 'd', 'e', 'f']

def generator(): for num in a: yield num

def generator2(): for letter in b: yield letter

print(list(zip(generator(), generator2()))) print(list(zip(a, b)))

print(list(generator())) print(list(generator2()))

czubert commented 5 years ago

a = [1,2,3,4] b = ['a', 'b', 'c', 'd', 'e', 'f']

def generator(): for num in a: yield num

def generator2(): for letter in b: yield letter

for i in generator(): print(i**2)

czubert commented 5 years ago

Istnieje fajna biblioteka: itertools - zawiera funkcje, które pozwalają na różne dziwne sposoby pętlić po różnych rzeczach. My byśmy mogli pętlić po dwóch team'ach jednocześnie żeby wybierać na zmianę bohaterów z dwóch drużyn. Poszukaj tam funkcji, która mogłaby nam się przydać. import itertools

a = ['z', 'x', 'y', 'w', 's', 't'] b = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

def generator(): for num in a: yield num

def generator2(): for letter in b: yield letter

print(list(itertools.zip_longest(generator(), generator2())))

czubert commented 5 years ago

bierze dluzsza liste pod uwage, ale przypasowuje mu nony, nas to urządza?

charzu commented 5 years ago

Jeśli je dobrze obsłużysz to jak najbardziej nas urządza :)

czubert commented 5 years ago

w sensie, ze np. if None, to wtedy odapala losowanie przeciwnika z przeciwnej druzyny? ; o

charzu commented 5 years ago
  1. Liczę na to, że to skrót myślowy.
  2. Licze na to, że błędny kawałek kodu to też skrót myślowy.

Opisz lepiej to zachowanie, które wymyśliłeś :)

czubert commented 5 years ago

jaki bledny kawalek kodu? mialem na mysli, że jak petlisz a = ['z', 'x', 'y', 'w', 's', 't'] b = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

to zip łączy kolejne elementy listy a z kolejnymi elementami listy b. jak sie wezmie zip_longest, to wtedy jedzie do konca dluzszej listy, w tym przypadku 'b', wiec dla kolejnych elementów z listy b, przypasowane będą Nony. w zwiazku z tym moge dorzucic warunek, że jeżeli krótsza lista zwraca None, to żeby wybierało losowego przeciwnika z listy a zamiast Nona (dzieki temu team, ktory ma wiecej wojownikow bedzie atakowal do konca [czyli az wszyscy z jego druzyny nie zaatakuja])