Created
January 30, 2014 16:06
-
-
Save jsam/8711991 to your computer and use it in GitHub Desktop.
[DSTG] Zadatak 1.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def pozicije(): | |
"""Funkcija koja vraca sve validne pozicije na ploci""" | |
return [i for i in xrange(11, 89) if 1 <= (i % 10) <= 8] | |
def init_ploca(): | |
"""Stvara novu plocu sa inicijalnim potezima za crnog i bijelog igraca ispunjenim""" | |
ploca = [obrub] * 100 | |
for i in pozicije(): | |
ploca[i] = prazno | |
ploca[44], ploca[45] = bijeli, crni | |
ploca[54], ploca[55] = crni, bijeli | |
return ploca | |
def ispis_ploce(ploca): | |
"""Funkcija koja vraca string reprezentaciju plocu spremnu za ispis""" | |
rep = '' | |
rep += ' %s\n' % ' '.join(map(str, range(1, 9))) | |
for row in xrange(1, 9): | |
begin, end = 10*row + 1, 10*row + 9 | |
rep += '%d %s\n' % (row, ' '.join(ploca[begin:end])) | |
return rep | |
def je_validan(move): | |
"""Da li je dani potez validan""" | |
return isinstance(move, int) and move in pozicije() | |
def protivnik(igrajer): | |
"""Vrati suprotnog igraca""" | |
return crni if igrajer is bijeli else bijeli | |
def pronadi_drzac(square, igrajer, ploca, direction): | |
bracket = square + direction | |
if ploca[bracket] == igrajer: | |
return None | |
opp = protivnik(igrajer) | |
while ploca[bracket] == opp: | |
bracket += direction | |
return None if ploca[bracket] in (obrub, prazno) else bracket | |
def je_legalan(move, igrajer, ploca): | |
""" Provjerava legalnost poteza""" | |
hasbracket = lambda direction: pronadi_drzac(move, igrajer, ploca, direction) | |
return ploca[move] == prazno and any(map(hasbracket, DIRECTIONS)) | |
def napravi_potez(move, igrajer, ploca): | |
ploca[move] = igrajer | |
for d in DIRECTIONS: | |
okreni_badzeve(move, igrajer, ploca, d) | |
return ploca | |
def okreni_badzeve(move, igrajer, ploca, direction): | |
bracket = pronadi_drzac(move, igrajer, ploca, direction) | |
if not bracket: | |
return | |
square = move + direction | |
while square != bracket: | |
ploca[square] = igrajer | |
square += direction | |
class IlegalniPotezErr(Exception): | |
def __init__(self, igrajer, move, ploca): | |
self.igrajer = igrajer | |
self.move = move | |
self.ploca = ploca | |
def __str__(self): | |
return '%s cannot move to square %d' % (igrajERS[self.igrajer], self.move) | |
def legalan_potez(igrajer, ploca): | |
return [sq for sq in pozicije() if je_legalan(sq, igrajer, ploca)] | |
def bilokoji_lPotez(igrajer, ploca): | |
return any(je_legalan(sq, igrajer, ploca) for sq in pozicije()) | |
def igraj(crni_strategy, bijeli_strategy): | |
ploca = init_ploca() | |
igrajer = crni | |
strategy = lambda who: crni_strategy if who == crni else bijeli_strategy | |
while igrajer is not None: | |
move = dohvati_potez(strategy(igrajer), igrajer, ploca) | |
napravi_potez(move, igrajer, ploca) | |
igrajer = sljedeci_igrac(ploca, igrajer) | |
return ploca, rezultat(crni, ploca) | |
def sljedeci_igrac(ploca, prev_igrajer): | |
opp = protivnik(prev_igrajer) | |
if bilokoji_lPotez(opp, ploca): | |
return opp | |
elif bilokoji_lPotez(prev_igrajer, ploca): | |
return prev_igrajer | |
return None | |
def dohvati_potez(strategy, igrajer, ploca): | |
copy = list(ploca) # copy the ploca to prevent cheating | |
move = strategy(igrajer, copy) | |
if not je_validan(move) or not je_legalan(move, igrajer, ploca): | |
raise IlegalniPotezErr(igrajer, move, copy) | |
return move | |
def rezultat(igrajer, ploca): | |
mine, theirs = 0, 0 | |
opp = protivnik(igrajer) | |
for sq in pozicije(): | |
piece = ploca[sq] | |
if piece == igrajer: mine += 1 | |
elif piece == opp: theirs += 1 | |
return mine - theirs |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment