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

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.