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()