Table of Contents

Cvičení 9: Semestrální práce - TRAX!

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.

Historie a balíček

Pravidla hry

Brute, Turnaj, bodování

Reprezentace díků

ldld dldl ddll lddl lldd dlld

Příklad vynuceného tahu

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:

Implementace

if self.tournament:
   #slozita strategie, chci vyhravat
else:
    #hraju proti Brutovi, neni treba vyhrat

player.py

> 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