player.py
do úlohy SEM
base.py
je přidána proměnná self.tournament
, kterou nastavuje náš program (hráč ji pouze čte) takto:
self.tournament
, která říká hráčovi, jestli se hraje na Brutovi (False) nebo v turnaji (True)
self.board[i][j]
odkazuje na i-tý řádek a j-tý sloupec). Řádky i sloupce jsou číslovány od nuly. Pozice self.board[0][0]
je horní levý roh. Pozice self.board[14][14]
je pravý spodní roh.
“”
(řetězec délky 0)
self.tournament
je False)
self.tournament
je True) se předchozí pravidlo upravuje takto:
BasePlayer
- viz sekce Implementace.
....... ..ABC.. .......
...A... ..ABC.. .......
....... ..ABC.. ....A..
....... ..ABCA. .......
....... ..ABC.. .......
....... .XABCY. .......
....... XYABC.. .......
..X.... ..Y.... ..ABC.. .......
....... ..ABC.. ..X.Y..
....... ..ABC.. .......
....... ..ABC.. ..XYZ..
....... ..ABC.. ....... ..XYZ..
....... ..A.X.. ...W... ..XYZ..
....... ..ARX.. ...W... ..XYZ..
.X.X.XX. .AAAAAA. ..B.B...
.XQXQXX. .AAAAAA. ..B.B...
Player
, která je potomkem třídy BasePlayer
(soubor base.py
)
base.py
defaultní verzí base.py, čili jakékoliv vaše změny v tomto souboru budou ignorovány.
BasePlayer
(a následně též třída Player
) mají tyto proměnné a metody:
self.board
- dvourozměrné pole (hrací deska), obsahuje buď “” (prázdný řetězec) nebo velké písmeno.
self.board
používejte libovolně, ale po každém volání self.move()
bude toto aktualizováno Brutem
self.rows
a self.cols
- počet řádků a sloupců v self.board
(integer)
self.weight
- váhy jednotlivých buňek hrací desky (dvourozměrné pole, velikost shodná s self.board
)
self.dictionary
- seznam slov ve formátu python-dictionary
word
je ve slovníku, použijte word in self.dictionary
self.bag
- jednorozměrné pole písmen
self.myScore
- absolutní skóre tohoto hráče (je nastaveno metodou update
)
self.otherScore
- absolutní skóre protihráče (je nastaveno metodou update
)
self.lettersInBag
- zbývající počet písmen ve velkém zásobníku
self.tournament
- pokud True, hraje se v turnajovém módu, jinak se hraje na Brutovi. Tuto proměnnou nastavuje turnajový program, hráč by ji měl pouze číst
self.cellValue(row, col)
- hodnota buňky
self.letterValue(letter)
- hodnota písmenka (písmeno musí být velké), nebo 0
self.inBoard(row, col)
- vrací True, pokud je souřadnice row,col v hrací desce
self.isEmpty(row, col)
- vrací True, pokud je self.board[row][col]
prázdné
self.print()
- výpis hrací desky
self.move()
- metoda, která bude volána Brutem (viz dále)
self.update()
- update hráče po tahu protihráče
self
před názvy metod a proměnných bude probráno na cvičení
V souboru base.py
jsou dále pomocné funkce:
base.readDictionary(soubor)
- načte soubor se slovníkem, vrací jako typ Dictionary
base.createInitialBag()
- vytvoří pole písmenek, ze kterého se dále losuje
base.createBoard(word)
- vytvoří hrací desku a umístí doprostřed zadané slovo
player.py
base
bude provedeno na cvičení
player.py
, do třídy Player
(případně jako samostatné funkce v souboru player.py
)
player.move()
, která bude volána Brutem. Jejím výstupem je:
None
, v případě, že hráč se chce zdržet hry
self.bag
return [ [0,7,'A'] ]
len(self.bag)
self.board
self.move()
bude hrací deska (self.board
), písmena (self.bag
) automaticky upravena Brutem
move()
je maximálne 0.4s!
__init__
) je maximálně 0.4s
Player
)
if name == “main”:
) ukázka použití tříd/hráčů s spolu s while cyklem, ve kterém celá hra běží.
player.py
afterMove
zde není pro přehlednost zobrazena (ale je v player.py
)
import base import random import copy class Player(base.BasePlayer): def __init__(self, name, dictionary, board, bag, bigBagSize): base.BasePlayer.__init__(self, name, dictionary, board, bag, bigBagSize) #always keep this line and DON't change it self.text = "myGreatPlayer" #fill the name of your awesome player! #bellow you can define your own variables. Don't forget to use 'self.' to adress them correctly def move(self): """ the main function of your player. This function is called by the gaming server to obtain your move. Possible moves are: return None - this means to 'pass' (score/board/bag are not changed) return "hello" - string of letters that you want to replace. Letters can repeat. Only letters in 'self.bag' can be used here. Not more than 7 letters. return [ [r1,c1,L1], [ r2,c2,L2] ... [rn,cn,Ln] ], where 'r_x' is row, 'c_x' is columns and 'Lx' is the letter that you want to place to the board. You don't have to place these letters to self.board, it will be done anyway by Brute """ return None; if __name__ == "__main__": words = base.readDictionary('dic.txt') #words is represented as python-dictionray board = base.createBoard("ABACUS") #this word should be from the dictionray board = base.createBoard(random.choice(list(words))) #random word from the dictionray bag = base.createInitialBag() player1bag = bag[0:7] #letters for the player1 player2bag = bag[7:14] #letters for the player2 bag = bag[14:] #remove first 14 letters p1 = Player("player1", words, board, player1bag); p2 = Player("player2", words, board, player2bag); p1.print() noChangeMoves = 0; while noChangeMoves < 6: result = p1.move() #first player plays s1 = afterMove(p1, result, p2, board) #determine the type of move, update both player, return change of score p1.print() result = p2.move(); #second player plays s2 = afterMove(p2, result, p1, board) #determine the type of move, update both player, return change of score p2.print() if s1 + s2 == 0: noChangeMoves+=1 else: noChangeMoves = 0 print("Game finished after " , noChangeMoves , " moves without change of score ")