might_and_magic.py
Created by
valmontechno
Created on
March 12, 2024
16.7 KB
_F = ' #491818 '
_E = ' #383028 '
_D = ' #aa5941 '
_C = False
_B = True
_A = ' #202020 '
try : import os ; os . environ [ ' KANDINSKY_OS_MODE ' ] = ' 0 ' ; os . environ [ ' KANDINSKY_ZOOM_RATIO ' ] = ' 3 ' ; os . environ [ ' ION_ENABLE_DEBUG ' ] = '' ; isPc = _B
except : isPc = _C
from math import *
from kandinsky import *
from ion import *
from time import *
SCREEN_WIDTH = 320
SCREEN_HEIGHT = 222
def draw_sprite ( sprite , pallet , x , y , scale = ( 1 , 1 )):
if isinstance ( scale ,( int , float )): scale = [ scale ] * 2
yPos = y
for col in sprite . split ( ' , ' ):
xPos = x ; factorStr = ' 0 '
for char in col :
if char in ' 0123456789 ' : factorStr += char
else :
factor = max ( int ( factorStr ), 1 )
if char != ' . ' : color = pallet [ ' abcdefghijklmnopqrstuvwxyz ' . index ( char )]; fill_rect ( int ( xPos ), int ( yPos ), int ( scale [ 0 ] * factor ), int ( scale [ 1 ]), color )
xPos += scale [ 0 ] * factor ; factorStr = ' 0 '
yPos += scale [ 1 ] * max ( int ( factorStr ), 1 )
def draw_line ( x0 , y0 , x1 , y1 , c = ( 0 , 0 , 0 )):
dx = x1 - x0 ; dy = y1 - y0 ; step = abs ( dx ) if abs ( dx ) > abs ( dy ) else abs ( dy ); dx = dx / step ; dy = dy / step ; x = x0 ; y = y0 ; i = 1
for i in range ( step ): set_pixel ( int ( x ), int ( y ), c ); x += dx ; y += dy
def singleton ( class_ ):
instances = {}
def getinstance ( * args , ** kwargs ):
if class_ not in instances : instances [ class_ ] = class_ ( * args , ** kwargs )
return instances [ class_ ]
return getinstance
@singleton
class GameBoard :
def __init__ ( self ): self . width = 8 ; self . height = 6 ; self . board = [[],[]]
def __str__ ( self ): return str ([ str ( e ) for e in self . board [ 0 ]]) + ' \n ' + str ([ str ( e ) for e in self . board [ 1 ]])
def drawAll ( self , team ):
self . drawBackground ( 0 , 0 , self . width , self . height )
for pawn in self . board [ team ]: pawn . draw ()
if team == 0 : cursor . draw ()
def drawCol ( self , team , col ):
self . drawBackground ( col , self . getFirstPawn ( 0 , col ). getBottom () + 1 , 1 , 2 )
for pawn in self . board [ team ]:
if pawn . colMatches ( col ): pawn . draw ()
if team == 0 and cursor . col == col : cursor . draw ()
def drawBackgroundPixel ( self , x , y ): c = 5 * ( sin ( x / 6 ) + sin ( y / 8 ) + sin (( x + y ) / 10 ) + 3 ); set_pixel ( x , y ,( 105 - c , 89 - c , 105 - c ))
def drawBackground ( self , col , row , width , height ):
for j in range ( row * Pawn . size , row * Pawn . size + height * Pawn . size ):
for i in range ( col * Pawn . size , col * Pawn . size + width * Pawn . size ): self . drawBackgroundPixel ( i , j )
def getPawn ( self , team , col , row ):
for pawn in self . board [ team ]:
if pawn . matches ( col , row ): return pawn
return Pawn ( col , row , _C )
def getFirstPawn ( self , team , col ):
first = Pawn ( col , 0 , _C )
for pawn in self . board [ team ]:
if pawn . col <= col < pawn . col + pawn . width and pawn . row + pawn . height >= first . row :
first = pawn
if first . row == gameBoard . height - 1 : return first
return first
def removePawnByCoord ( self , team , col , row ):
for i in range ( len ( self . board [ team ])):
pawn = self . board [ team ][ i ]
if pawn . matches ( col , row ): pawn2 = Pawn ( pawn . col , pawn . row ); pawn2 . width = pawn . width ; pawn2 . height = pawn . height ; return self . board [ team ]. pop ( i )
def removePawn ( self , team , pawn ): return self . removePawnByCoord ( team , pawn . col , pawn . row )
def setPawn ( self , team , pawn ): self . removePawn ( team , pawn ); self . board [ team ]. append ( pawn )
def collapse ( self , team , draw = _C ):
modifiedCols = set (); collapsedBoard = []; colsFilling = [ 0 ] * self . width
for y in range ( self . height ):
for x in range ( self . width ):
pawn = self . removePawnByCoord ( team , x , y )
if pawn :
row = max ( colsFilling [ x + i ] for i in range ( pawn . width ))
if pawn . row != row :
pawn . row = row
for i in range ( pawn . width ): modifiedCols . add ( x + i )
collapsedBoard . append ( pawn )
for i in range ( pawn . width ): colsFilling [ x + i ] = pawn . getBottom () + 1
self . board [ team ] = collapsedBoard ; cursor . row = self . getFirstPawn ( 0 , cursor . col ). getBottom ()
if draw :
for col in modifiedCols : gameBoard . drawCol ( 0 , col )
cursor . draw ()
@singleton
class Cursor :
def __init__ ( self ): self . col = 0 ; self . row = self . getFirstPawnUnder (). row ; self . pallet = ' #e3fbfb ' , _E
def draw ( self , drawDrag = _B , scale = ( 1 , 1 )):
for i in range ( 4 ): draw_sprite ( ' 9b,b7ab,baba5b,b3a2b,ba2bab,ba4b,bab,bab,3b ' , self . pallet ,( i % 2 * scale [ 0 ] + self . col ) * Pawn . size ,(( i > 1 ) * scale [ 1 ] + self . row ) * Pawn . size ,[ 1 ,( - 1 , 1 ),( 1 , - 1 ), - 1 ][ i ])
if drawDrag and type ( self . getFirstPawnUnder ()) == Unit : draw_sprite ( ' 16,a24.a,b24.b,ca22.ac,cb22.bc,2c22.2c,2c2.c16.c2.2c,4cd16.d4c,2cdc18.cd2c,b24cb,db22cbd,.24d,5.16c,5.dc12bcd,6.d2c8b2cd,7.d2c6b2cd,8.d3c2b3cd,9.d6cd,10.d4cd,11.d2cd,12.2d ' ,( ' #a2a261 ' , ' #fbc341 ' , ' #fbeb69 ' , _E ), self . col * Pawn . size , gameBoard . getFirstPawn ( 0 , self . col ). getBottom () * Pawn . size )
def getPawnUnder ( self ): return gameBoard . getPawn ( 0 , self . col , self . row )
def getFirstPawnUnder ( self , width = 1 , exclude = ()):
pawn = Pawn ( self . col , 0 , _C )
for i in range ( width ):
p = gameBoard . getFirstPawn ( 0 , self . col + i )
if not p in exclude and p . getBottom () >= pawn . getBottom (): pawn = p
return pawn
def sleepAwake ( self , key , delay ):
end = monotonic () + delay
while keydown ( key ):
if monotonic () >= end : return _B
return _C
def canMove ( self ):
def move ( col , row ):
drawnPawns = set ()
def tryDraw ( pawn ):
nonlocal drawnPawns
if not pawn in drawnPawns : pawn . draw (); drawnPawns . add ( pawn )
tryDraw ( gameBoard . getPawn ( 0 , self . col , self . row ))
for i in range ( 2 ): tryDraw ( gameBoard . getPawn ( 0 , self . col , self . getFirstPawnUnder (). getBottom () + i ))
self . col = min ( max ( self . col + col , 0 ), gameBoard . width - 1 ); self . row = self . getFirstPawnUnder (). getBottom () if col else min ( max ( self . row + row , 0 ), self . getFirstPawnUnder (). getBottom ()); self . draw ()
for i in (( KEY_RIGHT , 1 , 0 ),( KEY_LEFT , - 1 , 0 ),( KEY_DOWN , 0 , 1 ),( KEY_UP , 0 , - 1 )):
if keydown ( i [ 0 ]):
move ( i [ 1 ], i [ 2 ])
if self . sleepAwake ( i [ 0 ],. 2 ):
while _B :
move ( i [ 1 ], i [ 2 ])
if not self . sleepAwake ( i [ 0 ],. 05 ): return
return
def canGrab ( self ):
def move ( col ):
if self . row + grabbedPawn . height <= gameBoard . height : gameBoard . drawBackground ( self . col , self . row , grabbedPawn . width , grabbedPawn . height )
else :
for i in range ( grabbedPawn . width ):
for j in range ( grabbedPawn . height ): gameBoard . getPawn ( 0 , self . col + i , gameBoard . height - j - 1 ). draw ()
firstPawnUnder = self . getFirstPawnUnder ( grabbedPawn . width )
if firstPawnUnder == grabbedPawn :
firstPawnUnder . draw ()
for i in range ( grabbedPawn . col * Pawn . size , grabbedPawn . col * Pawn . size + grabbedPawn . width * Pawn . size ):
for j in range ( grabbedPawn . row * Pawn . size , grabbedPawn . row * Pawn . size + grabbedPawn . height * Pawn . size ):
if ( i + j ) % 2 == 0 == 0 : gameBoard . drawBackgroundPixel ( i , j )
self . col = min ( max ( self . col + col , 0 ), gameBoard . width - grabbedPawn . width ); firstPawnUnder = Pawn ( self . col , - 1 , _C )
for pawn in gameBoard . board [ 0 ]:
if pawn != grabbedPawn and pawn . getBottom () > firstPawnUnder . getBottom ():
for i in range ( grabbedPawn . width ):
if pawn . colMatches ( self . col + i ): firstPawnUnder = pawn ; break
self . row = firstPawnUnder . getBottom () + 1
if self . row + grabbedPawn . height <= gameBoard . height : self . draw ( _C ,( grabbedPawn . width , grabbedPawn . height ))
else :
def drw ( s , c , r ):
for i in range ( 4 ): draw_sprite ( s , self . pallet ,( i % 2 * c + self . col ) * Pawn . size ,(( i > 1 ) * r + gameBoard . height - r ) * Pawn . size ,[ 1 ,( - 1 , 1 ),( 1 , - 1 ), - 1 ][ i ])
if grabbedPawn . rank == 0 : drw ( ' 9b,b7ab,baba5b,b3a2b,ba2bab,ba3bab,bab2.bab,bab3.bab,3b4.bab,8.bab,9.bab,10.bab,11.ba ' , 1 , 1 )
elif grabbedPawn . rank == 1 : drw ( ' 9b,b7ab,baba5b,b3a2b,ba2bab,ba2bab,bab.bab,bab.bab,3b2.bab,5.bab,5.bab,6.bab,6.bab,7.bab,7.bab,7.bab,8.bab,8.bab,9.bab,9.bab,9.bab,10.bab,10.bab,11.ba,11.ba,11.ba ' , 1 , 2 )
else : drw ( ' 9b,b7ab,baba5b,b3a2b,ba2bab,ba3bab,bab2.bab,bab3.bab,3b4.bab,8.bab,9.bab,10.bab,11.bab,12.bab,13.bab,14.bab,15.bab,16.bab,17.bab,18.bab,19.bab,20.bab,21.bab,22.bab,23.bab,24.ba ' , 2 , 2 )
if keydown ( KEY_OK ):
while keydown ( KEY_OK ): 0
grabbedPawn = self . getFirstPawnUnder ()
if type ( grabbedPawn ) != Unit : return
pawn = self . getPawnUnder ()
if pawn != grabbedPawn : pawn . draw ()
gameBoard . drawBackground ( self . col , grabbedPawn . getBottom () + 1 , 1 , 1 ); self . col = grabbedPawn . col ; self . row = grabbedPawn . row ; move ( 0 )
while not keydown ( KEY_OK ) or self . row + grabbedPawn . height > gameBoard . height :
for i in (( KEY_RIGHT , 1 ),( KEY_LEFT , - 1 )):
if keydown ( i [ 0 ]):
move ( i [ 1 ])
if self . sleepAwake ( i [ 0 ],. 2 ):
while _B :
move ( i [ 1 ])
if not self . sleepAwake ( i [ 0 ],. 05 ): break
while keydown ( KEY_OK ): 0
if grabbedPawn . col != self . col : grabbedPawn . clear (); pawn = Unit ( self . col , self . row , grabbedPawn . rank , grabbedPawn . breed , grabbedPawn . color ); gameBoard . setPawn ( 0 , pawn ); gameBoard . removePawn ( 0 , grabbedPawn ); pawn . draw ()
else : grabbedPawn . draw ()
self . row = self . getFirstPawnUnder (). getBottom (); self . draw ()
class Pawn :
size = 26
def __init__ ( self , col , row , found = _B ): self . col = col ; self . row = row ; self . width = 1 ; self . height = 1 ; self . found = found
def __str__ ( self ): return str (( type ( self ), self . col , self . row , self . found ))
def matches ( self , col , row ): return self . colMatches ( col ) and self . rowMatches ( row )
def colMatches ( self , col ): return self . col <= col < self . col + self . width
def rowMatches ( self , row ): return self . row <= row < self . row + self . height
def getBottom ( self ): return self . row + self . height - 1
def draw ( self ): gameBoard . drawBackground ( self . col , self . row , self . width , self . height )
def clear ( self ): Pawn . draw ( self )
class Unit ( Pawn ):
def __init__ ( self , col , row , rank , breed , color ): Pawn . __init__ ( self , col , row ); self . rank = rank ; self . breed = breed ; self . color = color ; self . width = 1 + ( self . rank > 1 ); self . height = 1 + ( self . rank > 0 )
def draw ( self ):
M = ' #f34120 ' ; L = ' #a2bacb ' ; K = ' #618292 ' ; J = ' #fbdbba ' ; I = ' #f36969 ' ; H = ' #d39269 ' ; G = ' #693028 ' ; F = ' #593808 ' ; E = ' #8a5910 ' ; D = ' #eb9a30 ' ; C = ' #ba8a38 ' ; B = ' #fbfbfb ' ; A = ' #fbcb59 ' ; Pawn . draw ( self )
def drw ( s , p ): draw_sprite ( s , p , self . col * self . size , self . row * self . size )
r , b , c = self . rank , self . breed , self . color ; pallet = [( A , D , E , F ),( ' #59d341 ' , ' #20a230 ' , ' #106928 ' , ' #184108 ' ),( ' #49c3eb ' , ' #30a2cb ' , ' #206182 ' , ' #303051 ' )][ c ]
if r == 0 :
if b == 0 : drw ( ' ,10.4e3.fg,9.eh2ihe3.fg,8.j2hi3hj2.fg,7.j2hi5hj2.fg,7.j2hi5hj2.fg,6.fi2hb4h2ij.fg,6.f2icac5ij2.fg,4.k2lec3a2c2iej2.fg,5.klcb3a2b2c2lmlfg,5.nkl7b2lm2kfg,5.g.lmf3mfml2kn.fg,7.kom3pomlhjg.fg,6.jhkl4mlhijlckpl,5.ljhjk3lk2ijlmbmpl,4.cbjijc3bjhj3k3f,4.cncjc4bjif4.gf,4.fmf.db2n2bjd4.gf,5.f.2dg2qn2gd3.gf,6.4d2g2d2bd2.gf,6.lng4d2cbg2.gf,5.f3l5fc2nfgf,4.11f2lkgf,5.14f,7.10f ' , pallet + ( K , _A , C , B , L , ' #384959 ' , G , _D , H , A , I , J , M ))
elif b == 1 : drw ( ' ,12.3c,10.2c3b2c,9.d3b2a2bd,8.d3b2a3bed,6.fgd7behei,7.fd7bcedi,7.dcbc6b2cde,7.d2c8bcd,7.d2c4b3cbcd,3.jfkfcbc2b2c2k2cbcfkfj,4.2jkfb3c2kh2kcbfk2j,6.2jcdkl3hlkdc2j,8.cdmk3hkmdc,7.ecdf5kfdc,6.fgkfd5fdfge,7.caf2b3f2bfhj,6.jhfdf5cfdfhj,6.jh2lc5fc2lhj,6.2l.jd5cdj.2l,9.j2f3d2fj,10.3j.3j,10.l2jl2jl,8.11l,8.11l,10.7l ' , pallet + ( C , _D , A , J , ' #493020 ' , G , H , _A , I ))
else : drw ( ' 9.7e,7.fec6a2c,6.fcb8abc,5.fc2b2e5ab2ec,5.fcbe2geb2hbe2ge,4.fcbfg3ea2ha3egf,4.dcbfe2fh4gh2fef,3.fdcbfefah4ghafefc,3.cd3cd2ai4hi2adcbc,2.cbcdc2fia6iai2fcd,2.dc2dce12ie2d,3.3dce3ijh2ghj3iedf,3.dfedc2iheh2gheh2idhf,3.2fghd2e2i4g2iedf2hf,4.f2hfd2eik2jki2ed2ihf,4.fhifdj2eh2lh2ejfieif,3.f2ie2fdjek2mkejdcbfef,3.f2e4fdje2hejfcb3abc,3.f2efbcdfd4jfd2cb2abc,3.cb3abc8d2f4c,2.jcb2a3c2j2d2j2d4fdj,.3j3c3fd5jcd3fd3j,.3jd2fefed4jbdcfcd4j,2.3jf4ec6jbdb4j,4.jdfaeafb10j,6.dbdbd8j ' , pallet + ( ' #925910 ' , ' #614110 ' , A , D , ' #cb8a20 ' , _A , B , ' #9a2828 ' , M ))
elif r == 1 :
if b == 0 : drw ( ' 2,8.e15.e,8.fe13.ef,9.fe11.ef,9.ghe9.ehg,10.gh9.hg,10.fh.f5.f.hf,10.h2fg5.g2fh,9.hfg9.gfh,9.fg11.gf,8.hfg11.gfh,.b4.b.bab11.bab,ba3.2b.bab11.bab,cab.bab.3c11.3c,cac.bac.gfh.hg5.gh.hfg,.cd.2c2.gf2hf7.f2hfg,2.d2.d3.gfhg7.ghfg,2.3fd3.g2fc7.c2fg,.f3hf4.cbac.3g.cabc,fhf2g2f4.c2bc3ic2bc,2fg2.gf.g3f2ca3ia2c3fg,2f3.fg2.g2hfb5ibf2hg,gf8.2j2f5i2f2j,g2f9.2cb3fb2c,.g2f8.klk3fklk,2.gf7.cbgf3ifgbc,2.g2f5.dabgf3ifgbad,3.gf2.mnopabgf3kfgbaponm,3.ghf2.2mnb2cjfkfj2cbn2m,4.gf4.mclqr3jrqlcm,4.gf4.dqlq5nqlqd,4.gf4.dqslp3nplsqd,4.gf3.cac2qm3pm2qcac,3.abc2.cbablsc3pcslb2ac,3.cbcna2npdlschphcsl2cbp,4.2cpb2p2j2q2ch2c2qjpnoc,4.2gmc4jls5csl2jcbm,4.gf.4jq2schehc2sqjpnm,4.gf2.3jqslhelehlsqjcab,4.g2f.3jqlthqlqhtlq2j2c,5.gf.2j2dq2d3t2dqd3j,5.gf2.dc11dcj,5.gf2.d2c2dc3dc2d2cd,5.gf3.2djd5cdj2d,5.gf3.kdjd5cdjd,5.gf4kut2d3c2dtu2k,4.kgf3k2tmk5dkm2t2k,4.2kg3k2m9k2m2k,6.18k,10.12k ' , pallet + ( A , E , F , C , ' #d39a41 ' , _F , _A , L , G , H , J , _D , K , I , B , ' #c35910 ' , D ))
elif b == 1 : drw ( ' ,6.2e11.2e,5.ef13.fe,4.eg15.ge,3.eg17.ge,2.eg19.ge,2.fg2.2e11.2e2.gf,.eg.feg4.5h4.gef.ge,.fgfeh3.2h5g2h3.hefgf,.fgeh3.h3g3f3gh3.hegf,.fgec3.h2g5f2gh3.cegf,.hfcac.h4g3f4gh.cacfh,.hc2bachgeg5fgeghca2bch,2.dcbcfhgegf3gfgeghfcbcd,3.2dcf3eh5gh3efc2d,5.di3fe5he3fid,6.3hfgb3gbgf3h,4.ih3bhga3gagh3bhi,5.ij2cf2gbgb2gf2cji,6.ijc2egbgbg2ecji,7.2ifie3geif2i,6.hghfifgegfifhgh,6.hbhg2f3e2fghbh,6.h2bigf3efgi2bh,6.cabhigfgfgihbac,5.hcbhgif3ifighbch,5.hac3gififi3gcah,5.hbc4g3i4gcbh,5.hbcb2gf3gf2gbcbh,5.h2cb2g5f2gb2ch,5.2hc2bg5fg2bc2h,5.ih2cabgfbfgba2chi,5.i2h2c3ba3b2c2hi,6.ih3cbajab3chi,6.hih3caja3chih,6.ihcih2cb2chichi,6.ihb3h3c3hbhi,6.ihghi2hc2hghghi,7.h3gi3hi3gi,7.ih2g5i2ghi,7.iba6iab2i,7.i2h6igh2i,7.ig2h5i2ghi,7.i2cd5icbci,7.ibcd5icbci,7.ibc6idcb2i,6.icbc7idbci,6.h2gh7ih2gi,6.h2gh7ih2gh,6.i3h7i3h,7.2h9i2h,10.7i ' , pallet + ( A , C , E , F , _A , B ))
else : drw ( ' ,10.2bc,9.c3bc,9.c2b2c,8.5c,7.2ce2c2e,7.feg2hge2f,6.feg6hgf,6.eg8hgf,5.fe10hf,4.feg8h3gf,4.feg7h3gef,4.feg3hb2h4gef,3.cfe2g2h2bh3g2ef,.3cfe2g2h3b2g3ei,2.2cfe2g2b2abhgfefi,4.efgh6bge2fi5.f,4.feghc2b3a2ge2i4.hi,4.f2g2c4ba2befhi.fhf,3.fe2g3chbcb2abighfhgi,3.fe2gcihg3cbabiefhgi,3.f4gigeh2c2bcgfhgi,3.f2ghgi2e2g4cfhgei,3.ifgh2giegh2gcfhgei,3.if3hie4hgfhge2i,4.fhghi2e3hgege2if,3.f2hghg3eihgfeifji,3.f2he2g2efjehgfiek,2.f3h5efke2gefei,2.ie2g7e3ge3f,2.ieg5ef3e3ge2f,2.i4ef3ef3e3gegf,3.i3ef3e2f2eh2gehf,3.i2ge2f3efiefhghfi,3.f2g2e2fe2fi2efgefi,3.f2ge7fie2gei,2.f2ge9f4i,2.f2gf2i4f2i4fi,2.ighe8ifgefi,2.i2hfc7ighgi,3.if2ec6i3hi,3.c2e2c6ighgi,3.i4c6iegei,4.3c7i3ei,4.9ic3ei,4.9ic2g2ei,5.8iegegei,7.6ib3ebi,8.5ic3bci,9.5i3ci,14.3i ' , pallet + ( ' #8292ba ' , ' #515971 ' , ' #cbbacb ' , B , _A , ' #28d3fb ' , ' #3082db ' ))
elif b == 0 : drw ( ' 26.c,18.2c5.cac5.2c,18.dbc4.cac4.cbd,18.dcb2c.cbabc.2cbcd,18.dca2bdc3acdcbacd,19.dbabdcbabcdbabd,19.dc2bcbcbcbc2b2d,19.2dcbc2bc2bcbc2d,20.d2bc5bc2bd,20.cb3c3b3cbc,20.2c2bc3bc2b2c,19.dcba2bcbc2babcd3.2c,19.d2cba5bab2cd2.cdec,14.cdfd.dcdca5bacdcd2.2dfc,13.cefe2.3dgc5bcg3d3.defc,13.cefd3.2dac2ba2bcadh4.defc,12.cafd4.dcd3ba3bdch4.defc,12.cafd4.2d2cb3ab2cd5.dfa2c,12.cafd5.ch2b3a2bhc4.def2bc,11.2cbfd5.2d3ca3c2d4.defb2c,11.c2bfed4.dhcd3cdchd3.edefbcbc,11.2cbfed2e.cdc2hdcd2hcdc.2edefbcbc,10.cbcbfedf2ecd2c5hicd2efedef2bcbc,10.cbcefeie2fcdc2i3h2icdef2edef2bcbc,9.cbcbefe2i2edb2c5i2cbd2e2ide2bc2bc,9.cbcbefe4idb2c5i2cbd4ide3bcbc,8.c2bcefed3idc2bce3ie2c2bd3idei5bc,8.cbcbefed3idbabc5ec2bab2dideic4bc,7.c2bcbefed2idca2bce3feicb2ac4deicbcbc,7.c2bcbefe3dcba2bi2ef2eic2bac4deicb2cd,7.cbc2bied.2dc3bcif3efic4bc3dei4cd,7.d2cbcied.dc4bci5fidc4b2d.dei2cd,7.d2cbcie3dc4bci5fidc3bc2d.dei2cd,8.d2cied.2dc4bdie3fe2ic3bc2d.dei2cd,8.d2cied.2d2c2bcdif3ef2idcb2c2d.deicd,8.d2cied.2d3cbcdie3f2eid4cd2.2deid,9.die2d2.d4cdi7eid3c2d2.2deid,9.die2d2.2d3cd2i6e2i3c3d.2ded,9.die6d3cd3i4e2id4c5ded,10.de6d3cd10id3c4did,10.di5d4cd10id4c4d,11.6d3c3d8i3d3c2d2cb,12.2d.d3c2d2hd6i2h2d3c3d2cb,12.c3dc2bcd3h5d3h2d2c6dc,13.2hdc2bcd11h2d2c2d4hdb,11.4hd2cbcd10h2d3c7hc,11.4hd4cd10hd4cd6hd,10.6hd4cd9hd3c2bd5hd,10.7hd3cd9hdc3bcbd4h,10.7hd4cd7hdcb2c2bdbd3h,10.6hd5cd7h3d2cdcb2d3h,11.4hdcb3cbd9hd2chdc2d2h ' , pallet + ( ' #61699a ' , ' #9aa2cb ' , B , _A , ' #495179 ' ))
class Wall ( Pawn ):
def __init__ ( self , col , row , hp ): Pawn . __init__ ( self , col , row ); self . hp = hp
def draw ( self ):
Pawn . draw ( self ); h = self . hp
def drw ( s ): A = ' #086149 ' ; draw_sprite ( s ,(( _A , _F , ' #713830 ' , _D , ' #c38259 ' , ' #286108 ' , ' #388a08 ' , A ),( _A , ' #cbbaaa ' , ' #827969 ' , ' #515141 ' , A , ' #088a61 ' ))[ h > 4 ], self . col * Pawn . size , self . row * Pawn . size )
if h > 4 : drw ( ' 2,19.dcdf2e,18.dcd2e,5.d8.ef.dcd,2.efd10.e.dcd.cd,3.2d11.d2c2fe,3.dc11.d2ced,2.3d9.efadc2da,2.ac2d2.d6.efabcefe,2.adcd.dfe6.a3cea,3.abc2de6.ab3cad,3.ad2cba5.ac2bcdacd,4.ad2bca4.a3cdadcd,3.2dad3ca2.ad2c2dadcda,3.3dad2ca.ea4dad2cd2e,.ef2dca3da2.a3dad3cd2a,2.eac2da2da2.2ad2acdc2da,3.ac2dad2a3.3a3dcda,3.acdcd2a5.2ad2cdae,2.2ad2c2da4.2adc3da,2.3a4da3.2a2dc2d2a,.4a5da2.a5da2da,.2ad2a5d2a5da3da,2.5a4d2a3d2a.3a,6.5a2.3a ' )
elif h > 2 : drw ( ' 8,19.cdcgf,7.c10.cdc2f,4.fgc8.fgcdc,5.2c9.fcdc,5.cdcgf6.2cb2gf,5.3c7.b2dbfc,3.bc2d2b5.b2dbc2dc,4.2bcdeb4.bdcbcdedc2h,5.cbc2db2.bcd2b2c2dcfa,3.fg2cbcdb2.b2c3bc3dc,4.bdc2bcb2.b3c2b2c2db,3.bcdc4b2.2b2cb2c2dcb,3.b2d2c2b4.4b3cdb,3.bd3cb6.2b2c2dcb,3.bc2dcb6.b5c2b,2.2b5cb4.b6c2b,.4bf3cb4.b2c3fb,4.5b6.3bfb ' )
else : drw ( ' 12,20.2f,6.c12.cgf,3.fgc12.cdc,4.2c12.cdc,4.cdcgf9.3c,4.3c8.cg.2cfc,4.cdc2.c4.cd2.bc2dc,4.bdc2.2c3.cd2.bcedcgf,4.b2dbcdc2.bcdb.bc2dcf,4.b2db2cb2.b3c2bc2db,3.2b3dbcb3.b2c2b2cdb,2.3bc2dc2b4.bcb2cdb,3.3b4cb5.2b3cb,5.5b6.5b ' )
gameBoard = GameBoard ()
for j in range ( 2 ):
for i in range ( 3 ): gameBoard . setPawn ( 0 , Unit ( i , j , 0 ,( i + j ) % 3 ,( i + j ) % 3 ))
for i in range ( 3 ): gameBoard . setPawn ( 0 , Unit ( 3 + i , 0 , 1 , i , i ))
gameBoard . setPawn ( 0 , Unit ( 6 , 0 , 2 , 0 , 1 ))
gameBoard . setPawn ( 0 , Unit ( 0 , gameBoard . height - 1 , 0 , 0 , 0 ))
for i in range ( 6 ): gameBoard . setPawn ( 0 , Wall ( i , 2 , i + 1 ))
cursor = Cursor ()
gameBoard . drawAll ( 0 )
while _B :
if isPc : fill_rect ( 0 , 0 , 0 , 0 , ' #000000 ' )
cursor . canMove ()
if keydown ( KEY_BACKSPACE ):
pawn = gameBoard . removePawnByCoord ( 0 , cursor . col , cursor . row ); pawn . clear (); print ( pawn )
if pawn :
gameBoard . collapse ( 0 , _B )
while keydown ( KEY_BACKSPACE ): 0
cursor . canGrab ()