An old program that I’d never finished. This is a board game that a friend told me, and I wanted to recreate it, but at this time I didn’t had the knowledge to do some thing, such as verifying some constraints. Now, I may finish it, but as you can see, it takes already more than 8kb, so the final version would probably be around 15kb, and it will be very complicated to run on Numworks.
from kandinsky import fill_rect as rect,set_pixel as set,draw_string as ds from ion import keydown as k from time import sleep # Menu:choosing number of player def menu(): nbPlayers,first=0,1 rect(0,0,320,222,SKY) ds("POWER !",125,20,(255,0,0),SKY) ds("Number of players:",70,50,(0,0,255),SKY) ds("+",155,90,TXT,SKY) ds("-",155,150,TXT,SKY) while k(4):1 while not k(4): if not k(1)or k(2):V=0 if k(1):V=1 elif k(2):V=-1 if V!=0 or first: if first:first=0 nbPlayers=(nbPlayers+V)%3 ds(str(nbPlayers+2),155,120,TXT,SKY) while k(1)or k(2):1 return nbPlayers+2 # Drawing cell in [x,y] def draw_cell(x,y,case=0,first=0): if first: rect(3+x*24,3+y*24,23,23,COLORS[int(FIELD[y*9+x])]) for i in range(nbPlayers): for l in range(9): if l in FIELDS[y][x][i]: rect(x*24+8,y*24+8,13,13,TXT) rect(x*24+10,y*24+10,9,9,COLORS[i+3]) break if 9 in FIELDS[y][x][i]: for j in range(15): for k in range(15): if FLAG[j*15+k]=="1":set(8+x*24+k,9+y*24+j,TXT) elif FLAG[j*15+k]=="2":set(8+x*24+k,9+y*24+j,COLORS[i+3]) if case>0: if case==1:c=(255,0,255) elif case==2:c=(COLORS[int(FIELD[y*9+x])]) rect(3+x*24,3+y*24,23,2,c) rect(3+x*24,3+y*24,2,23,c) rect(26+x*24,26+y*24,-23,-2,c) rect(26+x*24,26+y*24,-2,-23,c) # Drawing arrow in bitmap def draw_arrow(x,y,c): for i in range(7): for j in range(15): if ARROW[i*15+j]=="1":set(x+j,y+i,c) # Variables SKY = (255,255,255) TXT = (0,0,0) nbPlayers=menu() FLAG = "001110000000000001122100000000001122221100000001122222211000001122222222100001122222211000001122221100000001122110000000001111000000000001100000000000001100000000000001100000000000111111000000000111111000000000000000000000000" UNITS = [["Soldat",1,1,2],["Avion",3,3,3],["tank",2,4,5],["bateau",2,10,10],["regiment",2,10,20],["chasseur",5,30,30],["char",4,40,40],["cuirasse",3,50,50],["Missile",0,100],["drapeau"]] ARROW = "000000110000000000011110000000001111111111111111111111111111001111111111111000011110000000000000110000000" FIELD = "211121112133315551133315551133315551211121112166614441166614441166614441211121112" COLORS = [(0,0,0),(0,0,255),(255,255,100),(255,0,0),(0,255,0),(0,255,255),(255,255,0)] FIELDS = [[[[]for i in range(nbPlayers)]for X in range(9)]for Y in range(9)] TYPES = ["Sea","Island","P1","P2","P3","P4"] POWER = [0 for i in range(nbPlayers)] ACTIONS = ["MOVE","GENERATE","FUSE"] BASES = [[0,0],[8,8],[0,8],[8,0]] X = 4 Y = 4 tour=0 # Adding flags to FIELDS FIELDS[0][0][0].append(9) FIELDS[8][8][1].append(9) if nbPlayers>2:FIELDS[0][8][2].append(9) if nbPlayers>3:FIELDS[8][0][3].append(9) # Tests for testing FIELDS[7][8][0].append(0) FIELDS[3][5][1].append(5) FIELDS[3][5][1].append(5) FIELDS[3][5][1].append(5) for i in range(9):FIELDS[4][4][1].append(i) # ULTIMATE MAIN LOOP while 1: tour,earn,earned,move=(tour+1)%nbPlayers,0,0,-1 # Loop of writting objects while 1: rect(0,0,320,222,SKY) rect(0,0,222,222,TXT) for y in range(9): for x in range(9): draw_cell(x,y,0,1) if int(FIELD[y*9+x])>2 and int(FIELD[y*9+x])!=tour+3 and earn==0: earned+=len(FIELDS[y][x][tour]) if earn==0:POWER[tour]+=earned ds("Round: ",230,0,TXT,SKY) ds("P"+str(tour+1),300,0,TXT,COLORS[tour+3]) ds("POWER:",240,40,TXT,(255,255,0)) ds(str(POWER[tour]),271-len(str(POWER[tour]))*5,60,(255,0,0),SKY) ds("+"+str(earned),264-len(str(earned))*5,80,(0,255,0),SKY) first,earn,brek,brak=1,1,0,0 # Loop of tests of keydown while k(4):1 while 1: if k(1):V=-1 elif k(2):V=1 else:V=0 if k(0):H=-1 elif k(3):H=1 else:H=0 if k(4):O=1 else:O=0 if k(17):C=1 else:C=0 if k(52):E=1 else:E=0 # Validation bloc if E: choice,second=0,1 rect(100,71,120,70,TXT) rect(103,74,114,64,SKY) ds("Valider?",120,81,TXT,SKY) ds("Oui",115,111,(0,255,0),SKY) ds("Non",175,111,(255,0,0),SKY) while k(4):1 while not k(4): if k(0):H=-1 elif k(3):H=1 else:H=0 if H!=0 or second: if second:second=0 rect(105+choice*60,111,10,18,SKY) rect(145+choice*60,111,10,18,SKY) choice=(choice+H)%2 ds("[",105+choice*60,111,TXT,SKY) ds("]",145+choice*60,111,TXT,SKY) while k(0) or k(3):1 if choice==0:brek=1 break # Selection bloc if H!=0 or V!=0 or C or first: vmove,first=0,0 draw_cell(X,Y,2) rect(225,100,80,40,SKY) if move>-1: ds("Select a",225,120,(0,0,255),SKY) ds("cell:",225,140,(0,0,255),SKY) ds("[OK]",280,140,(255,0,0),SKY) if C: move=-1 break elif X+H>=0 and X+H<=8: if Y+V>=0 and Y+V<=8: if max(X+H,cell[0])-min(X+H,cell[0])<=UNITS[units_cell[move]][1]: if max(Y+V,cell[1])-min(Y+V,cell[1])<=UNITS[units_cell[move]][1]: vmove=1 # if move==0 or move==1 or move==4 or move==5: # if # elif move==2 or move==6: # elif move==3 or move==7: else: rect(225,120,100,60,SKY) vmove=1 if vmove==1:X,Y=(X+H)%9,(Y+V)%9 draw_cell(X,Y,1) ds("→ "+TYPES[int(FIELD[Y*9+X])-1]+" ",222,182,TXT,SKY) ds("["+str(X)+";"+str(Y)+"]",246,202,(255,0,0),SKY) while k(0) or k(1) or k(2) or k(3):1 # Action bloc if O and len(FIELDS[Y][X][tour])>0 and move==-1: units,second,action,actions,units_cell,cell=-1,1,0,[],[],[X,Y] rect(10,10,300,202,TXT) rect(13,13,294,196,SKY) ds("CELL:",15,15,TXT,SKY) ds("["+str(X)+" "+str(Y)+"]",70,15,(255,0,0),SKY) ds("ACTIONS:",180,50,(255,0,0),SKY) if 9 in FIELDS[Y][X][tour]:ds("YOUR FLAG",210,15,TXT,COLORS[3+tour]) for i in range(9): if i in FIELDS[Y][X][tour]: units+=1 units_cell.append(i) if units==0:ds("UNITS:",15,33,(255,0,0),SKY) ds((str(FIELDS[Y][X][tour].count(i))+" "+UNITS[i][0]),15,51+units*17,TXT,SKY) # Calculating possibles actions for i in range(9): if i in FIELDS[Y][X][tour] and 0 not in actions:actions.append(0) if BASES[tour][0]==Y and BASES[tour][1]==X:actions.append(1) for i in range(len(FIELDS[Y][X][tour])): if FIELDS[Y][X][tour].count(FIELDS[Y][X][tour][i])>2 and 2 not in actions:actions.append(2) for i in range(len(actions)):ds(ACTIONS[actions[i]],220-len(ACTIONS[actions[i]])*5,80+i*30,TXT,SKY) # Choosing an action while k(4) or k(17):1 while 1: V,O,C=0,0,0 if k(1):V=-1 elif k(2):V=1 elif k(4):O=1 elif k(17):C=1 if V!=0 or second: rect(210-len(ACTIONS[actions[action]])*5,80+action*30,10,18,SKY) rect(220+len(ACTIONS[actions[action]])*5,80+action*30,10,18,SKY) action,second=(action+V)%len(actions),0 ds("[",210-len(ACTIONS[actions[action]])*5,80+action*30,(255,0,0),SKY) ds("]",220+len(ACTIONS[actions[action]])*5,80+action*30,(255,0,0),SKY) while k(1) or k(2):1 elif O or C: if O and actions[action]==0: second=1 rect(180,50,90,120,SKY) ds("MOVE:",180,35,(255,0,0),SKY) ds("[OK]",150,65,(255,0,0),SKY) ds("to valide",200,65,TXT,SKY) ds("[CLEAR]",140,85,(255,0,0),SKY) ds("to quit",220,85,TXT,SKY) move=0 while k(4):1 while not k(4): V=0 if k(1):V=-1 elif k(2):V=1 if V!=0 or second: draw_arrow(20+len(str(FIELDS[Y][X][tour].count(move))+" "+UNITS[units_cell[move]][0])*10,57+move*17,SKY) move,second=(move+V)%(units+1),0 draw_arrow(20+len(str(FIELDS[Y][X][tour].count(move))+" "+UNITS[units_cell[move]][0])*10,57+move*17,(255,0,0)) while k(1) or k(2):1 print(move) print(FIELDS[Y][X][tour]) if k(17): move=-1 break if O and actions[action]==1: generate=1 if O and actions[action]==2: fuse=1 brak=1 if brak:break if brak:break # Mooving bloc if O and move>-1: allow=0 if units_cell[move]==0 or units_cell[move]==1 or units_cell[move]==4 or units_cell[move]==5 and FIELD[Y*9+X]!=2:allow=1 elif units_cell[move]==2 or units_cell[move]==6 and FIELD[Y*9+X]==3 or FIELD[Y*9+X]==4 or FIELD[Y*9+X]==5 or FIELD[Y*9+X]==6:allow=1 elif units_cell[move]==3 or units_cell[move]==7 and FIELD[Y*9+X]==1 or FIELD[Y*9+X]==2:allow=1 if allow: FIELDS[Y][X][tour].append(FIELDS[cell[1]][cell[0]][tour][move]) FIELDS[cell[1]][cell[0]][tour].pop(move) move=-1 break if brek:break