Semestrální práce spočívá ve vytvoření funkčního hráče pro deskovku TRAX . Hráči pokládají na hrací desku dílky (znáte z HW08) s vyznačenými barevnými cestami tak, aby barevně navazovaly na již položené dílky. Hráči mají přiřazenu svoji barvu a pro tu se snaží vytvořit cyklus nebo spojit protilehlé strany. Naše hra pro předmět ALP se mírně liší od oficiálních pravidel TRAXu. Platná jsou pouze pravidla uvedená na této stránce.
player.py
do úlohy SEM.
Výchozí stav hrací desky
Hráč se rozhodne umístit dílek na pozici 'a'. Do místa na pozici 'b' tak povedou dvě cesty stejné barvy. Hráč musí umístit nějaký dílek na pozici 'b', aby tyto cesty spojil.
Po umístění dílku na pozici 'c' vznikne na pozici 'd' stejná situace - do prázného místa vedou dvě cesty svejné barvy. Jedná se opět o vynucený tah, hráč tedy musí umístit další dílek na pozici 'd'.
Konečný stav:
base.py
: základní třída, ze které jsou odvozeny další hráči. Neměňte.
player.py
: zde budete implementovat svého hráče a tento soubor (pouze tento!) odevzdávejte na Bruta
draw.py
: pomocná třída pro kreslení do png
[]
pokud nejde umístit žádný dílek
[ [r1,c1,tile1], … [rn,cn,tile2] ]
, tj. seznam dílků a kam mají být umístěny, r_i
jsou řádky (int), c_i
jsou sloupce (int), tile_i
jsou jména dílků (string délky 4).
self.board
- 2D pole hrací desky, indexování self.board[row][column]
self.board[row][col]
je string délky 4, který obsahuje buď “none” (prázná buňka) nebo jméno dílku
self.board
tak, aby obsahoval dílky umístěné vaším hráčem i spoluhráčem
self.playerName
: jméno studenta - tuto proměnnou doplňuje Brute
self.myColor
: je buď 'l' nebo 'd' a indikuje, za jakou barvu hrajete
self.tournament
: je True pokud hrajete v turnaji, jinak je False
if self.tournament: #slozita strategie, chci vyhravat else: #hraju proti Brutovi, neni treba vyhrat
self.tiles
: pole jmen platných dílků
self.algorithmName
: jméno vaší strategie - slouží k identifikaci verze vašeho hráče v turnaji
player.py
, zejména je třeba implementovat metodu move()
> cd adresar_kde_je_balicek > python3 player.py
import draw as Drawer import sys import random import copy import base as Base class Player(Base.BasePlayer): def __init__(self, board, name, color): Base.BasePlayer.__init__(self,board, name, color) #DO NOT CHANGE THIS LINE!! self.algorithmName = "My great player" def move(self): """ return list of moves: [] ... if the player cannot move [ [r1,c1,piece1], [r2,c2,piece2] ... [rn,cn,piece2] ] -place tiles to positions (r1,c1) .. (rn,cn) """ return [] if __name__ == "__main__": boardRows = 10 boardCols = boardRows board = [ [0]*boardCols for _ in range(boardRows) ] board[boardRows//2][boardCols//2] = ["lldd","dlld","ddll","lddl","dldl","ldld"][ random.randint(0,5) ] d = Drawer.Drawer() p1 = Player(board,"player1", 'l'); p2 = Player(board,"player2", 'd'); #test game. We assume that both player play correctly. In Brute/Tournament case, more things will be checked #like types of variables, validity of moves, etc... idx = 0 while True: #call player for his move rmove = p1.move() #rmove is: [ [r1,c1,tile1], ... [rn,cn,tile] ] #write to board of both players for move in rmove: row,col, tile = move p1.board[row][col] = tile p2.board[row][col] = tile #make png with resulting board d.draw(p1.board, "move-{:04d}.png".format(idx)) idx+=1 if len(rmove) == 0: print("End of game") break p1,p2 = p2,p1 #switch players