+ All Categories
Home > Documents > Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy...

Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy...

Date post: 17-Oct-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
23
Python, základní kameny až skály II Tomáš Svoboda B4B33RPH, 2020-10-13, 2020-10-20 1
Transcript
Page 2: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

slovníky, dictionary, dict() 1 d = {} 2 d[1] = 'a' 3 d[0] = 'b' 4 d[2] = 'c' 5 6 print('for key in d:') 7 for key in d: 8 print(key, d[key]) 9 10 print('for key, value in d.items():') 11 for key, value in d.items(): 12 print(key, value) 13 14 print('for key in sorted(d.keys()):') 15 for key in sorted(d.keys()): 16 print(key, d[key]) dicts.py

Page 4: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

dictionary loops … 1 pm = {} 2 pm['c','c'] = (4,4) 3 pm['d','d'] = (2,2) 4 pm['c','d'] = (1,6) 5 pm['d','c'] = (6,1) 6 7 for key in pm: 8 print(key, pm[key]) 9 10 for key,value in pm.items(): 11 print(key, value)

http://openbookproject.net/thinkcs/python/english3e/dictionaries.html

Page 5: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

skládání objektů, dědění

• vylepšíme trochu hráče R-P-S

• ukážeme si na příkladu hráče piškvorek (tic-tac-toe)

• live-coding-session

Page 6: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

player 1 player 2

evaluate

draw?

yes -> play again

no

winner is …

play play

GamePlayer Playerrun

R | P | S R | P | S

record_opp_move record_opp_move

Page 7: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

vylepšení hráče R-P-S

• Společné do základní třídy BasePlayer

• Rozdílné strategie jako různí hráči

• Oddělení (zapouzdření) technikalit správy hráčovy paměti

• A také vylepšíme hru na typ 2 za 3

• a ukážeme možnost jak řídit ukecanost běhu hry

• # bude se hodit při implementaci Reversi hráče

Page 8: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

BasePlayer, RandomPlayer …

• play()

• record_opp_move(move)

• ConstantPlayer, RandomPlayer

• SkewedPlayer

• SmartPlayer

Page 9: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

Lepší paměť

• __init__(size) # chceme omezit velikost

• update(element) # remember?

• kontrola přípustnosti vkládaného prvku

• get_most_frequent() # jaky je nejcastejsi prvek

Page 10: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

1 class Memory: 2 def __init__(self, size=None): 3 self.cyclic = size is not(None) 4 if self.cyclic: 5 self.data = size*[None] 6 else: 7 self.data = [] 8 self.frequencies = dict() 9 for move in POSSIBLE_MOVES: 10 self.frequencies[move] = 0 11 12 def update(self, move): 13 assert move in POSSIBLE_MOVES, str(move)+' is not acceptable' 14 self.frequencies[move] += 1 15 if self.cyclic: 16 del self.data[-1] 17 self.data.insert(0, move) 18 19 def get_most_frequent(self): 20 return max(self.frequencies, key=self.frequencies.get) 21 22 class BasePlayer: 23 def __init__(self): 24 self.my_moves = Memory(100) 25 self.opp_moves = Memory(100) 26 27 def record_opp_move(self, move): 28 self.opp_moves.update(move) 29 30 def play(self): 31 my_move = self.find_move() 32 self.my_moves.update(my_move) 33 return my_move 34 35

Skládání objektů

Page 11: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

1 class Memory: 2 def __init__(self, size=None): 3 self.cyclic = size is not(None) 4 if self.cyclic: 5 self.data = size*[None] 6 else: 7 self.data = [] 8 self.frequencies = dict() 9 for move in POSSIBLE_MOVES: 10 self.frequencies[move] = 0 11 12 def update(self, move): 13 assert move in POSSIBLE_MOVES, str(move)+' is not acceptable' 14 self.frequencies[move] += 1 15 if self.cyclic: 16 del self.data[-1] 17 self.data.insert(0, move) 18 19 def get_most_frequent(self): 20 return max(self.frequencies, key=self.frequencies.get) 21 22 class BasePlayer: 23 def __init__(self): 24 self.my_moves = Memory(100) 25 self.opp_moves = Memory(100) 26 27 def record_opp_move(self, move): 28 self.opp_moves.update(move) 29 30 def play(self): 31 my_move = self.find_move() 32 self.my_moves.update(my_move) 33 return my_move 34 35

Skládání objektů

Page 12: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

1 class BasePlayer: 2 def __init__(self): 3 self.my_moves = Memory(100) 4 self.opp_moves = Memory(100) 5 6 def record_opp_move(self, move): 7 self.opp_moves.update(move) 8 9 def play(self): 10 my_move = self.find_move() 11 self.my_moves.update(my_move) 12 return my_move 13 14 def find_move(self): 15 raise NotImplementedError 16 17 def __str__(self): 18 return 'Player '+ self.__class__.__name__ 19 20 class RandomPlayer(BasePlayer): 21 def find_move(self): 22 return random.choice(POSSIBLE_MOVES)

Dědění

nahrazení metody

Page 13: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

1 class BasePlayer: 2 def __init__(self): 3 self.my_moves = Memory(100) 4 self.opp_moves = Memory(100) 5 6 def record_opp_move(self, move): 7 self.opp_moves.update(move) 8 9 def play(self): 10 my_move = self.find_move() 11 self.my_moves.update(my_move) 12 return my_move 13 14 def find_move(self): 15 raise NotImplementedError 16 17 def __str__(self): 18 return 'Player '+ self.__class__.__name__ 19 20 class RandomPlayer(BasePlayer): 21 def find_move(self): 22 return random.choice(POSSIBLE_MOVES)

Dědění

nahrazení metody

Page 14: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

1 class BasePlayer: 2 def __init__(self): 3 self.my_moves = Memory(100) 4 self.opp_moves = Memory(100) 5 6 def record_opp_move(self, move): 7 self.opp_moves.update(move) 8 9 def play(self): 10 my_move = self.find_move() 11 self.my_moves.update(my_move) 12 return my_move 13 14 def find_move(self): 15 raise NotImplementedError 16 17 def __str__(self): 18 return 'Player '+ self.__class__.__name__ 19 20 class RandomPlayer(BasePlayer): 21 def find_move(self): 22 return random.choice(POSSIBLE_MOVES)

Dědění

nahrazení metody

Page 15: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

1 class BasePlayer: 2 def __init__(self): 3 self.my_moves = Memory(100) 4 self.opp_moves = Memory(100) 5 6 def record_opp_move(self, move): 7 self.opp_moves.update(move) 8 9 def play(self): 10 my_move = self.find_move() 11 self.my_moves.update(my_move) 12 return my_move 13 14 def find_move(self): 15 raise NotImplementedError 16 17 def __str__(self): 18 return 'Player '+ self.__class__.__name__ 19 20 class SkewedRandom(BasePlayer): 21 def __init__(self, weights): 22 super().__init__() 23 self.weights = weights 24 25 def find_move(self): 26 return random.choices(POSSIBLE_MOVES, self.weights)[0]

Volání metod rodičovské třídy/objektu

Page 16: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

1 class BasePlayer: 2 def __init__(self): 3 self.my_moves = Memory(100) 4 self.opp_moves = Memory(100) 5 6 def record_opp_move(self, move): 7 self.opp_moves.update(move) 8 9 def play(self): 10 my_move = self.find_move() 11 self.my_moves.update(my_move) 12 return my_move 13 14 def find_move(self): 15 raise NotImplementedError 16 17 def __str__(self): 18 return 'Player '+ self.__class__.__name__ 19 20 class SkewedRandom(BasePlayer): 21 def __init__(self, weights): 22 super().__init__() 23 self.weights = weights 24 25 def find_move(self): 26 return random.choices(POSSIBLE_MOVES, self.weights)[0]

Volání metod rodičovské třídy/objektu

Page 17: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

Piškvorky, tic-tac-toe, m,n,k-game

By DaBler - Own work, Public Domain, https://commons.wikimedia.org/w/index.php?curid=5506040

Page 18: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

skládání

Page 19: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

skládání

Page 20: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

dědění

Page 21: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

dědění

Page 22: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

dědění

Page 23: Python, základní kameny a skály IIvylepšení hráče R-P-S • Společné do základní třídy BasePlayer • Rozdílné strategie jako různí hráči • Oddělení (zapozdření)

dědění


Recommended