nbs.py

Created by andreanx

Created on December 10, 2025

36.6 KB


F_CARRE, F_DISQUE, F_TRIANGLE_HG, F_TRIANGLE_HD, F_TRIANGLE_BG, F_TRIANGLE_BD, F_TRIANGLE_HM, F_TRIANGLE_BM, F_TRIANGLE_GM, F_TRIANGLE_DM = range(10)

def nom_forme_const(v):
  return ('F_CARRE', 'F_DISQUE', 'F_TRIANGLE_HG', 'F_TRIANGLE_HD', 'F_TRIANGLE_BG', 'F_TRIANGLE_BD', 'F_TRIANGLE_HM', 'F_TRIANGLE_BM', 'F_TRIANGLE_GM', 'F_TRIANGLE_DM')[v]
try: from nbs_defs import *
except: pass

# Dessine-nous ici Ton Beau Sapin

# liste a completer d'elements :
# (x, y, forme, taille, couleur)

#pour les formes :
# - F_CARRE       : carre
# - F_DISQUE      : O
# - F_TRIANGLE_BG :    |\
# - F_TRIANGLE_BD : /|
# - F_TRIANGLE_HG :    |/
# - F_TRIANGLE_HD : \|
# - F_TRIANGLE_HM :    /\
# - F_TRIANGLE_BM : \/
# - F_TRIANGLE_GM :    <|
# - F_TRIANGLE_DM : |>
#(triangles rectangles isoceles)

#pour les couleurs :
# -  0 : (  0,  0,128)
# -  1 : (240,244,240)
# -  2 : (  0,  4, 32)
# -  3 : ( 88, 60, 48)
# -  4 : (192,188,176)
# -  5 : (224,232,240)
# -  6 : (  0, 32,  0)
# -  7 : (216,224,224)
# -  8 : (216,196, 48)
# -  9 : (192, 32, 32)
# - 10 : (  0,  0,248)
# - 11 : ( 88,176, 64)
# - 12 : (  0,152, 24)
# - 13 : (  0,100,  0)
# - 14 : (248,128,  0)

TBS = [
#( x , y ,    forme    , t , c),( x , y ,    forme    , t , c),( x , y ,    forme    , t , c)
 ( 70, 30,F_TRIANGLE_HM, 30,13),( 70, 50,F_TRIANGLE_HM, 40,12),( 70, 70,F_TRIANGLE_HM, 60,13),
 ( 85,145,F_CARRE      , 15, 9),( 40,140,F_CARRE      , 15,10),( 55,110,F_DISQUE     ,  5, 9),
 ( 90,120,F_DISQUE     ,  5, 8),( 65, 15,F_TRIANGLE_HG, 20, 8),
]
# Voici Mon Beau Sapin
# 19-36-57-49-36

L_MBS, H_MBS = 159, 190

MBS = (
b'\xf0\1\1\2\20\xc2\1\20\22!\xb2\6\xd0\1\2\1\xf0\1\3\1\2\x90\4\xd2\1\0\xc2\2\24\x82\a\xb0\3\2\x80\4\xd2\3\1\5\22!\xf2\0\1\xc2\a\3\x92\3\0\22\20\x82\6!"\21\x82\f\20\22\0\2@\x92\5\0!\xe2\1\1\xb2\t!\x92\1\20\2\0"\0\x92\5\0\3\21\xe2\a\3\xb2\3!b\20\22\0\2\0\2'
b'\0\2\0\xa2\2\0\22\1\xa2\16\3\1\xf2\0\20\22\0\2\0"\0\xd2\2\4\xb2\17\0"\20\2@\xa2\r\1\xe2\4\0\22 \xc2\6\xa0\2\xf2\2\6\xa2\a\0\2\xf0\0\x82\4\xc0\5\xb2\3!\xc2\4\0\22\0\22\20\2\0\xb2\2\21R`\22\0"\xc0\5\xe2\2!\xf2\4\0\2\20\22 \x92\2\a\1R\0\2\21\22\0\2\x002'
b'\xc0\5\27\20\xb2\2\21\xe2\4 \22\0\22 \x82\2\x0020\2\21\0\2\0\2\20"\xc0\5\b\t@\xf2\6\0\2\0\2\20\x020\xe2\1\xc0\1\2\1\2\0\2\0\22\0\22\xc0\5\4\30\a\xc0\1\xf2\5\0\2 \2\0B\x90\3\2 \2\0\2\0\22\xb0\2\21\xe0\2\a\t(0\a\xd0\1\xe2\4\xf0\3\21`B\0\22\0\22\x90\2\2'
b'\21\xe0\1\1`H\4\x80\3\xa2\2\xc0\5!\xb0\1\22 \2\x90\2\21\xe0\1\4P\4h\4\a\xd0\n\27P\xc2\1\xc0\3\5\2P\a\48\ah)\b@\6\21\xa0\n\22\0\2@\2\20\2\xc0\4\t\30\4\b$\x88\1\t@!\xa0\n\2\20"\0\2\x002\20\2\4\x80\4\4\30\aTX\tP\2\21\xb0\n\2\20"\0\2\20\22\xd0\4\a\b\x047'
b'\24X\xf0\6\1\xc0\x042\20\22\0\2\x90\4\1\5@\a\b\x047X\xd0\3\5\xf0\a\2\xf0\0\2\0\2\xf0\3\6\1`\b\4\'H\xe0\3\2\xa0\3\3\xb0\6b\xd0\3\b\4\27\4H\xb0\3\1\xc0\3\6\1\x80\2\21\n\xe0\1\22\20b\0\2\0\xa2\1\0\2\0\2\xe0\2\a\0\b\'\4H\xc0\2\1P\3\xd0\3\6\x80\2! \xc2\1\20'
b'\xe2\3\xa0\2\a\4\'X\x80\b\1\x80\2\xc2\1\0\1\0\xf2\3\x80\2\a\4\a\b\v\34\v(\a\x90\n\xf2\0 \2@\xe2\3\x80\2\3\a\bl\b\4\xf0\1\21\xc0\3\1\2\x80\4\xf2\0\0"0\2\1\0\xe2\3\xe0\1\f\v<\r,\35 \a\xb0\1\4\1\xc0\3\1\xa0\4R\20\2\0\2\20\21\22\20\xf2\3\1\xa0\1\\\35,\r\f'
b'\r@\1\xc0\x012\21\xc2\3\5"\x80\3R \2 "\20\xb2\4`\5<\31-\3\31\r\f\a0\x060\xc2\1\21\xc2\3\1B\xc0\5\xa2\4 \a<\r\xf9\0\3,\xa2\a\xb0\5\xd2\4L\3\xf9\0\r,\v\xd2\t \2\1\xc0\2\x92\3\21R\4L\v8\a\30\a\b\rL\a\xe2\4\1\5\xa2\4\xc0\2" \x82\3\21B\4l(\aX\\\4\xd2\4\0\1'
b'\xa2\4\x90\4\2\20\xe2\1\21\0\22<\30\r<(\f\a(\x8c\1\b\5\xf2\a\0b\xb0\1\1\xd0\3\xb2\1L(\4\r<\30\f\v\b\v\x8c\1\b\34\5\xe2\a\0b\x90\5\5\x80\1\xfc\0\v\30\v\f\35\xfc\1\b\v<\5\xc2\b\xa0\6\a\b\xfc\0\33\f\31\3\r\xec\1\bL\xd2\b\20\a\1\xe0\5\a\3\x9c\1\r)\34\r\xbc'
b'\1\b<\r\6\xd2\b\20\21\xf0\5\a\26\35\26\r<\31\3<\r\x8c\1\b\fVR \xa2\1\1\x82\6\xd0\x066\4\v\xac\1\v\4\35L\b\34\4\6\4\a\xb0\3\xb2\5\xa0\a\b\6L\26\34+\f\6=,\6\xc0\4\xe2\4\x90\a\a\f\x86\1\f+\r6\30&\x90\5\x92\4\x90\a\f\r\f\r\x86\1\f\r6(\3\6\r\xe0\5\xd2\6\xc0'
b'\1\21\xf0\0"\0\1\0"\a,\xd6\1H\35\34\xd2\6\20\xb2\1\6\21\x82\3\xe0\1\2\xb0\1\xf2\0\r\34\r\xc6\1\b\3\26\b\v\6\r\34\rR\0\xc2\6\21R\21\xb2\1\0\a\5B\xb0\1\1\x040\2\3\2\xd0\1B\v\35\f\rV\r6\b\v\xf6\0\r\f\35\x82\n\a!\x90\2\2 "\xd0\x012\v,\r\x1c6\r\f\26\30\26'
b'\35V\r,\r\xe2\t\x001\x90\5\4\b-,\r\f-(\31\6\35\34M\\\v\xd2\b\x80\3\4\xd0\1\2\xa0\1\2\v\r\b\f\b\vX\34\rY\rL\r\f\r<\r\f\v\xe2\2\1\xc2\2\1R\1\xf2\1\xf0\1\4\xf0\0\1\6\x80\3\35\34\v<\6\f-\f\rI\3\rl\r\31\v\r\34\r\f\4\xd2\1\1B\21\xc2\2\6\xe2\2\6\21\6\xb0\1\2'
b'\xf0\0\22\xe0\2\4\\\v\r\34\6L\35)\3l\r\4\a\4\t\a\4L\r\5\xd2\4\1\xa2\2\6R1\xd0\1\1\2\xb0\1\2\4\xc0\1\4\rl\b\a\b\f\r\6l\r\30\rl)\35\4\a\35L\r\v\xf2\6\0R\0\22\xc0\4\1@\xac\1\b\v\f\r\6\rL\6)\r\f\r\f\r,\3\t\r\f\35\t\r\\\r\f\v\xb2\2\1\x82\5\xf0\4\1\2 \a\r'
b'\x9c\1\v,&\f\35&\t\3\34\31\35l\4\a\6\r\f\r<\r\xe2\a\xc0\5\a\6\x9c\1\v\34\v\rF\f\26\35\34\v\2\4\r<\r\f\r\31\x86\1\xe2\a\xd0\5\b\6\xfc\0\b\a\v\f\b\rl&\r\f\r\a\4\6\35,\r\31\3\f\rV\0\xd2\1\0\xf2\5\xe0\5\26\\\4(\v\x9c\1&\v\r\2\v\4F\4\a\b\34-\26\v\20\xd2\2\4'
b'\xc2\3\1\x92\1\x80\6F\30\4\a\4\v,\30l\35\20\4\a\r&\3\31\34\r\24\a\2\0\2\20\xd2\2\1\xf2\4\xc0\6\a\48\33\f\r\30L\6,\a\2\27\r\6\r\f\4\a\3\34\vB \xe2\a\xb0\6\2\r\4\b\24\a\f\v\6\35\6\3V,\4\a-\6\t\4\3\r\26\5\0"P\xf2\2 b\1\6\x82\3\xb0\4\2\xe0\1\5\r\v\30\a\v'
b'\34=\6\3\b-V-\6\31&\35\b\0\2`R\0\x92\1\0R\20b\4\21\xc2\1\1\xa2\1\xa0\3\2\xf0\2-\b\v\34\v\35\6=\bM&=\6\a\3M\b \2@R\20\x82\1\0B\0"\0R\1\xc2\1!\x92\1\xd0\1\6\5\xa0\1\1\xd0\2\a]\v\x1d6=\6\v\6\bm\6\r&-\b\35\aPb\20b 2\0\x060\xb2\2!\x92\1\xd0\1\21\x80\4-\26=6'
b'\rf\b\a\bM\26\f\r6\v\b\6\34\2@\2\0B \xf2\0\0R@\xb2\2\a\xa2\1\xd0\1\a\1\xb0\1\1\6\x80\2]f\r,F\f\v\b\3V\35\f\35\26\b\26\r\34\v@B R\0\22\x002\0B\0\xf2\3\x80\3\1\4\0\1\xe0\1\5\x8d\1F\34\35\f=\f\r\b\v\26\b\4\26\r\\\v\b\f\r<\vP2\6\20BP"P\xf2\3\x90\3\2\xd0\1'
b'\26\xad\1\xcc\1\35\b\f\v\r\f\r\30\r\f\35,\r\b\x8c\1\a\2 "0BPR0\xe2\3\xf0\0\1\x80\3\2\1\0\a=\f\xad\1\xdc\1\b\f\r\b\34\r\34\r\b\a\b-\b\35\x8c\1\r\x102@2\0\x020\22\xf0\0\xe2\1\0\xe2\1\x90\4m\34\xbd\1\x8c\1\r\v\r\v\34\t\16\t\r<\v(\f\b<\r<\35,\r2@20\2\x80\1'
b'\2\0\22\0\xa2\1\20R\21b\x80\4\bm\34\xbd\1\x8c\1\30\v\34\r\16\5\16\3\r<\r\f\35\30\r\f\r\v<\26\35\f\r\f\v\2PB\xe0\1\22\0b\x002\0"\0"\1b\x80\4\a\b\6\35\v\f\v\31\3\x9d\1\6\r<\r\34\v\30\r\f\r\v)\3\rl\b=\b\a\b\r\f\35V=\4 \2\a\1\2\0\2\xe0\1\2\20B\0\6\0\22\20'
b'\22\20\xb2\1\x80\4\30\r<\31\3\xad\1\26\35\6\33\34-\34\6)\3\26=\f\b\r<\v\b\f\r(\33\a\b6M\v\20\a\0\2 \2\xe0\1\2\x002\x002\20\2\20\2\x012\x002\xc0\3\2@\30=\3\6\r\b\xfd\0\30\v\6\3\b\v\b\rl\r\16\5\t\x036\35\b\26\35,\v\r<\r\v\30]\6\r\20\1\xe0\2\2\0" "\20\2'
b'\20R\20"\xb0\4\a\30=(\v\3\30\3\33(]l\r\36\t\6\35&\b\3\6\r\6\r\x8c\1\r\xf6\0\r\xd0\3\22\0\2\xf0\0\2\0\22\21\2\x102\xf0\0\3\xc0\3(-\b\x8d\1\b\xfd\0\\\35\16\26=\b\v=\26\r\3\t\3\r\34\r&\3\6\3\4\x90\1\6\xc0\1\6\xf0\0\22\xc0\1\4\21\22\20"`\21\3\xd0\2\21@\aH'
b'\x8d\1\vm\6\r\34\35,\r\6=\3\b]\6\169\f\35\6\a\6\r\xa0\1!\x90\1\x020\2P\2@\22`\2\21\0\2\x002`\5\1\xa0\4\b\x8d\1\3\xfd\0\6\r\f-\f\26-\v\f\vmY\3\26\r\a\34\rG\5\6 !\xd0\1\6\x80\1\2 \22\20\22@\x020"\xe0\2\1\xe0\1\2\a\5\'\bm*\xfd\0\xf6\0\r\3\30\v\bm\a\t\a\t'
b'\a\t\16\6\35\a\34\r\x97\1\4\0\6\xe0\2\2\xb0\1\2\20\2\0\2 \22\xd0\2\6\5\xb0\1\5\xf7\0\30M\n\a\5\32\x8d\x016\35\3Hm\a\t\a\t\a\31\35\27\35\4\xd7\1\4\x90\5"\x80\4\27\5W\21\27\b=\n\25:\xdd\1\3Hmi\v\'\35\x97\2\5\6\2\x80\1\6\20\2\xd0\2\2\20\22\1\xa0\3\5\xb7\1'
b'!\27\4=:\a\32\xbd\1\b\r\tH\xfd\0I\r\'\1\a\r\x97\3@\2\xa0\3\22\1\2\xf0\2\5\a\5\xc7\1\5\27\5M\32\a\5*\x9d\1\3\30\r\vH\x8d\1\6\3\6\35\n\27!\xf7\2\21\'\5@\6\2\xa0\2\2 \2\1\xe0\2\1\a\25g\5\x87\1\r\f\35\26\32\27\32\x8d\1\30\v\xfd\1\26]\4\a\21\xf7\0\6\xf7\1'
b'\21W\6\2\6\5\20\1\5\xf0\1\5 \2\xd0\2\5\21\a\x95\1\xf7\0\r\f\rF\r*\xfd\0(m\26\x8d\1&]\4W\21\27\6\xf7\1\21W\5\2\a\2\26\a\6\xf0\1\1 \2\xb0\1\21\0\6\1 \xf5\1g\r,6\35\6]\30\v\b\x9d\1&m\6\35V\35\vG\21\5\2\26\2\'\6\xa7\1\x017\5\2\x1767\x060\2@\1\0\2\5\1\2\xc0'
b'\1\6\x110\x85\2\27\5\1\'\f\33-\f\r\34\r\26\b\r86\3m\26\rF\f&\f\35V\b\35\a\2W\6G\2\x87\2\6\2\5\a\5\6\a\22\a\1\2\4\0\x040\2 \2\3\5\1\2\0\2\x80\2\xf5\1\27\1\a\21\a\r\33\r\b\v\30\f\30\v8V\35)f\r\f\r&\v\f\26\r<-\f\r\b-\x167\5\x067\26\4G\21\x87\1\6\2\26\2\26'
b'\a\22\a\5\6\2& \2\0\2\6\1\0\4\0\22\xe0\1\x85\2G\5\a\6\r\f\35\34\35\f\r\f\35\34V\35IF\r\f\r\34-\34\35l\35\b=G\2\6\2\6\'\2\a\5\xd7\1\2\6\1\x056\22\27&\2\6\2\3\5\2\6 "\0\2\xd0\1\x95\2WM\f\r(\f\r\xfc\0\r\f-\aI\26\35\xfc\0\r\3\t\v\\\r\30I-\27&\2\5\27\6"G\5g'
b'\6\4\2\a\1&\22\6\2\a\6\27\2\6\22\a\2\0\2\20\2\21\xc0\1\xd5\2\'\4M,\30\a\xcc\1\r\f7\t\5\16\xac\1)\34\v,\r\16i\b\r\f\r\4\a\2&\a\2\26\1G\2\a\4g\26\5\a&\22\6\a\2\6\2F\x057\20\22\0\aP\x95\3\27\v]\6,(\r\xbc\1\35\31\16)\r\xac\1\r\31\v<\r\v)\36\b)\r,\r\4\26\2'
b'\27&W\6\2\3\1G\23f\4\2\3\5\27\5\6\27\5\2\27\3\a\0\2\6\a\4\1\a\xf5\2\1%\27\4\xcd\1\v\6\f\v\xcc\1\3I\r\xbc\1\35<-\t\369\b\t\r\\\a\2\'\6\x027\5\6\2\a\5\xf7\0\5\a\2\26\2\27\2\26\2\6\5\2\'F\5\22\a\5\4\x95\2\1%\21\a5M\b\31\6=&\35\34(\xac\1\r\31\3\r\x8c\2\35,'
b'\ri\r\34\rL\35\4\26\22\'\5\a\6\a\5G\6\2\6\x026\2\5\2\6\2\1\5\a\4&\2\5\6\a\5\4!\6\4\a\xd5\2\x015]\24\t\b\a\b\xfd\0\34\r\b\a\xbc\1\35\xfc\1\r\6\r\f\r,\r\23\b\16\b\t\r<\26\35\f\r\34\35\4\6\27\4\6\2\6\2\1\5G\5\a\22f\5\3\a\4\2\26\2\6\2G\26\2\26\xf5\2\xfd\0'
b'\3\a\t\35\31\xfd\0,\35\v=\xac\2\35\f-\f\b\t\3,\r\b\34-\f\rL\35&\35,\r\f\a\5\27\26\2\27\1g6\1\6\27F\2\a\4\2\1\6\2\5\2\6\2\5\2\1\xc5\2\a\x9d\1\3\t-\6\t\xfd\0<-(\r\xfc\1]\v\34\31\3<\b\6\r\x9c\1MF\35\a\2\1&\x127\x057\1V\2\4\x056\2\6\1\'\6\5\1\a\5\26\5\21'
b'\x85\2\xcd\1\a\v\xad\1\6\rl\b\a\b\f\35\34\xbd\1\b,+-\34\r\v\b\6\35\26\rl\xad\1\v\3\6\22\26\2\6\1\a\6\2\'\2\6\2&\a\4\xa6\1\a\4\5\a\26\4\a\1\a\5\21\xe5\1\1\a\b\xbd\1\b\t\xcd\1L\r\6(\r\b\r,\v\r\6\r\f\r\t\3,\30\\\26\35\f\b\6M\26\35\f\35\6\xad\1\23\'\26\5\a'
b'\4\1&\2\1\a\22\4\5\22\6\2\5\2\xf6\0\2\27\2\6\2\1\22\x065\1\xa5\1\a!\b\3\xad\1\6\31\xad\1\26-\6\30\6\v\r\v\30\35+\35\26\t\3\r\f\r\b<\r\f=\3\b\x9d\1&m6\3\26\5\26\2&\2\x016\22\a\5\2!\26\x021f\2\6\5\4\1&\x025\21\xa5\1!\5\b\23\x9d\1\27\4\xbd\1&\r\30\r\b\35'
b'\3(\6\vm\6\r,\r<=\b\xfd\0\23\xad\1\6\23\v\3\6\a\22\6\1\a\26\3\26\1\6\2\26"!\6\a\25\1\xa6\1\25\21\26\x025\21\a\xf5\1\tSM\31\xed\1\b-\b=\30\x9d\1\6\34\35\34M\vm\4\a\4\t\27\x8d\1\v6\27\2V\a\5F\5\a\x056\2\26\21\5\21F\2\6\x016\22\6\xf5\2\a\38M\6\24\x9d\1\30'
b'\3\xcd\1\v\35\v]\6\r,\r\26\35\v\xfd\0\31\35\4\a\26m\4V\2&\2\1\2\6\2V"\21\26\a\25\1\26\2&\a\2\a\6\22\4\6\2\6\2\1\xb5\1\a\xd5\1\a\5\a]\3\a\t\35\6M8-\6\'\6m\b\a\bm6\35\3\vM\6-\t-\3\t\26\r\v\23+\3\xa6\2\4\a\1\5\1\26\2\6\1\5\2f\2\a\5\a\2&\2\1\6\2\xb5\1\a'
b'\xf5\1\am\31\r\26M(\v\35\23\t\16\31\3]\b\a\b\xbd\1\v\3M&]\4\a6\v\23\33\a\xa6\1\24V\2\6"\6\aV\2\6\x026\22\6%\1\5\21\6\xc5\3\a\b]\3\a6\35\6\b\r\v=\3\t\5\t\16\31\vM\30\3\v\35\6M\6\r\v\b]F=\27F\23\4\6\2&\2\1F\2\21\2F\2&\1\2\6\1\25\1\a\5\1\22\26\25\2\4\25'
b'\22F\xc5\3\27S\rF\a\b]\6\23i\r\6\xfd\0\30V\b\3]\x86\1\31\3\x96\1A6\2\4\2f\2\6\4\5\21\2\x062\26\22\3\2\26\x045!\2\26\xd5\3\27\b\23\bV\v\30=&\16\31\16\31\16\t\16&\xfd\0\b\x046\b\3\26-\x96\1\3\a\4\xa6\1!\2V\4!\2F\3\22\6\22\4\a\1\25\21\5\2\1\2\5&\2\6\2\5!'
b'\5\1\xc5\3\'\1\5&\b\a\6\b\xa6\1\t\3\31\396M6\3\b\6\30\r\xe6\1\31\xb6\1\4\1\x126\2\26\2\6\2F\2\6\1\3\a\4\1"\6\5\1\4\2\26\22\5\a\1\26\4\5\1\6\1\4\2\x95\2\a\2\x85\1\'6\r\b\a\b\xb6\1)\16\t\3\16\31\xe6\1\30\27\xd6\1\4\t\3\xa6\1-\a\26\22\26\22\4\26\x056\2\4'
b'\21\5\1\5\1\2\5\a\1\25\21\a\1\a\2\6\1\25\6B\1\xf5\1\a\1\5\2\aU\27&\3\6\3\b\r\30\3\xc6\1\31\39\3\xc6\1\v\b\6(\3\xb6\1\t\a\4\xa6\1m6\2\6\a\2\1\6\22\a\5\1\2\5\6\3\22\1\26\3\1\3\6\2\6\5\1\aE\21\5\1\5\1\2\x85\1\1e6\a%\a\b6\b\a\t6\35\xc6\1)\3\t\16\n\xc6\1\v'
b'\b\26\v\b\26\3\4\3\b\xf6\0\31\6\r\x86\1\x8d\1\6\a\3\1\4!\5\6b\6\21\6\a\4\22\a\21\6\5\21\2\27\6\25\2\21&\xf5\1\27\5\2\x046\b\a\30\v\26\v\6\r<\35\xd6\1\36\t\xc6\1\r\b\x96\1\v\b\v\b\26\30\3\6\a\x9d\3\21\2W\6\4\1\26\1\a\22\5!\6\21\2\1\27\1\5\1\6!\2\3\4\xc5'
b'\1\v\r\x96\1(Vl\r\xf6\0\35\x96\2\30F\r\v\26-6\30\a\b\26\xbd\3\v\'5\1\2\1\2\1\a\25\1\22\6\2\6\5!\4\1\5\1\4\5\21\27\xc5\1\a\xb6\1\r\b\6\r&\3\6\x8c\1M<\r\x96\1\r6\b\3V\r\4\n\a]&(\v\b\3\r\b\x9d\2&\x8d\1\v\a\5\1\6\5\2\6\2\1\4\xf1\0\2\a\5!\5!\a\xd5\1\b\xa6\2'
b'\t\b\r\x8c\2-V=\26\b\3f\n\4\5\n\x9d\1\b=\30\v-\v\b\v\xbd\1f]\5\6\2\a\1\4\a\5\21\5\1\4\26A6\1\a\6\3\2\6\x85\1\21\5\a\v\x86\29\r\xec\1\xcd\1\v8\r&-\32\5\2\a\x8d\1\b\x8d\1\v\30\a\xbd\1\xb6\1\r\2\6\1\6\27\6\2\6\1\6\21\a\6\2\a\5\1\2&\1\26\2\25\6\xf5\x001\a'
b'\b\xf6\1I\3\xbc\1\r\f\xbd\1\vX\vM\32\a\32\a\xfd\0(\x8d\1(\v\30\v\b\a=\30\xc6\1\5\21\2\1\5f\22\26\4A\5\1\a\4\25\1%\21%\a!\5\30\r\xd6\1\t\a\4\t\24\r\x9c\1\r\26\xad\1\b\v\rH\fM\n\4\5\32\am\b\27\30\xfd\0\6\vM\30\35(\a\b\xa6\1\3\25\1\6\a\1%\21\4\xa1\1\26\a%'
b'\1\25!%\27%\a\30\xd6\1Y\6\rl\35F]\b\33-H\fM\32\1\5\32m\t\24\31\x8d\1\3\26\xfd\0\3H\v\b\aV\5\4\2\6U\x91\1\4\5\21&%\1\25!%\2\3\x015\a8\35\xf6\0\t\a\t\27\5\xd6\1\23\35\33\30]H\f]\n\a\n\5\1m\b$\3\x9d\1F]\3\v\r&\v\bF\a\4\27UQ\2\26Q\2\6\a%\1\xf5\0\26\a%\6\a'
b'\5\a\r\6\3\30\3VI\4\xb6\1\r\v8\x9d\1H\f]\32\5\a\n]\26\30\x9d\1\v\4\3\xd6\2\a\5\21\4B!\22\5\21\6\22\6\2\x161\6\a\5\1E\21\5"\5&\2\6\a&\35\6\r(\r\bY\6\vV\r\b\v\3X\xdd\2:m&\x8d\1\33\4\30\a\1\x96\2\a\5!\a\21\a\1\a\21\5\a\26!\6\5\22\21\5A\a\5\x0151\26\2\a\2'
b'\6\5\22\a\xa6\1\v)\24\b\a\4\b\3(\3\30\26X]\6\xed\1\26\nmF\xfd\0\f\v\b\4(\v\xe6\1\5Q\'\25\21\5\4\6\1\22\6\2A\x021\3\2\25\x0151\6\22\5&\22\a\b\r&\30\r\26\25\r\6\t\6\5\4\v\r\x86\1\3\t\b\31\b\tM&\xdd\x016Mf]\34\b\4\1\4\a\30\xe6\1a\5\22\1%\3\6\4!\2\26!\x041'
b'\2\26\a\21U\3\a\6\22F\3\6H\a\b\16\r\5\a\5\16\26\16\a\25\6\16\xf6\0\r\t\b\31\30-F\xdd\1\x96\2=\v\f\b\4\b\4\30\a\v\xd6\1a\a\x065\a\25Q\25\2\5\21\6\1E\ae\2\26\2\6\2\5&\a\1\a\21 \b\16\a\5\a\5\16\r\v\16\5\a\5\36\x86\1H\3\xf6\0\xad\1\6\r\xe6\2\v\f8\4\30\v'
b'\xc6\1a%\6%\6\25\1\5\1\26\2\1&\1\6\x151\x85\1\3\2\xf6\0\4\22\4\2\1\a>\'\16\6.\5\a>f\r(\v\x86\1\x9d\1\x96\3\v\34\'\4\30\rV\1\x046\x81\1\'\5\1\22\25!\4\1\6\21\25\27\1\5aE\1\2\x96\1\22\1\2\a\21>\27N\25\36\r\xd6\2\x9d\1\'\xe6\2\r,\a8V\3\xe1\1\2\21\a\2\5\4'
b'\5!\2!\3\2\6\27\25\xf1\0E\4V\2\21\a\6\1\6\1\6\1\5\1\a&\4\5>\a\16\r\x96\3\x8d\1\'\xe6\2\r+\t\30\4&)\6\r\2\xd1\1\5\a\5\2\6\4\6\5!\4!\x051\2\1\5aE\22\26\2\4Q\2\4\2\a\1\5i\3\36\3Y\3\xe6\2m\a\21\a\31F\b\26\r\30\v\26\r\30\r\26\3\b\r\6\b9\a\49\6\1\5\3\xd1\1'
b'\x157\1%\a\26\2\6\a\6\1\4\x91\1E\6\22Q\a%1\a\23\31\16\1\5)\3\a\5\a\t#\xf6\2M\6GV\30\6(\v\26\f\v(\6\b\26\b\xa9\1\4\'\x91\2\25\4\2\5\'E\xb1\1E\xf1\0\27\25\1\2!\a#.S\36\t3F\r\xe6\x027\1V\rH\v\f\6\33h\4\xb9\1(\xf1\6\4\1\5\1\2\1\2\4\21\6\23.S\x1e3\v\f\r&\f+'
b'\r\xb6\2\'F\rh\33\r\33h)h)(\xf1\6\24\25a\23.C\6\36\6\23;\30[\xb6\3\xf8\0\33\6\v\xf8\0)h)(\xe1\6\27\1\5\21\5\a\5\1\0\3\31\6\36C\6\36\3\31\r\f\35\v\b\f=*\xb6\3\r8\v\b\v\6\33h)h)(\xf1\6\26\3\25\24\5\2\21\31\3\36\39\3\36\3\31\v\xfa\0\f\v*f\1\xd6\2\1\27(\f'
b'\v\30\3\4\1\4\30)h\318\xf1\6\5\1\25\a\1\27\21\a#\36#\31\6\36#\v\xfa\0\f\33\32V\21\xa6\1\3V\3V\23\v\t\23F#\31h\318\xa1\b#\36\3\t\3\31\3\36#\v\xfa\0\v\b*\1\3\26\16!\3&)\3\26#\a\6\tV8\3&\386\31h\318\xa1\b\31\3\36\39\3\36\31\3\vj\3\30*\21)!\3i\x063I6(V\v'
b'\30\3&\3\31h\318\xa1\b\3\t\3\36\23\t#\16\6\31\3\vj\3\30*\219\16\b\x99\1\23Y\23\26(V\v\30\3\6\39h\318\xa1\b\23\6\36\6\3\t#\36\3\t\6\vj\3\30*\1\a\xb9\3(V(ih\318\xa1\b\3\t\3\36\3I\36\31\3\v\3Z\3\30\32.9\a\x89\1\b\a\36\31.\27)(Y()\b)h\318\xa1\b)\36\39\6\36'
b'\31\3\v\3Z\3\30\32.\31\36\x89\1>(\31\3(\31(Y()\b)h\318\xa1\b\t\3\t\36\3\t\3\31.\t\23\v\3Z\3\30\32\36)N\bI\36H)(\1\t(\31\1\5\t\4(\5\1\x99\1\30\318\xa1\b\4\3\t\36\23\6\3\t.\3\6\3\v\3Z\3\30\32\36)^\t\b)h)\30\t\1\t(\31\1\5\t\4(\5\1)\32\39\32\318\x91\6\5'
b'\xf1\1\a\31\36\39.\31\33j\3\b\v*\16\32\tN\t\16\b\3\31\16X)(\31(Y()Z\3\t\3\32\318\x91\6\a\x81\2\t\3\36\39\36\t\3\t\33\3Z\3\b\v\a\n;\xfe\0\b)\16X\318\31(Y()Z\31*\318\x91\6\5\xb1\3\5\32\33\3Z\3\16\r\32\33\32^\b\36)\16\b\168\318\t\5(\1\4\31\5\t(\31\4Z\31*'
b'\31\b\x047\xe1\5\3\xc1\3\5\32\33\3Z\3\16\32>\n\16\b>\t.\31\16\b\168\318\t\1\4\30\21\31\1\a\30\a\4\t\1Z\31*G\xf1\5\5\1\a\6\xb1\3\a\32\33\3Z\3\16\f\v\36\b\16\n\v\b>\t.\31\16\b\168\318)\30Y\309Z\31*G\x91\6\26\1\a\x91\3\a\32\33j\3\b\a\v\36\30\v\30\xfe\0\31'
b'\16\b\168\318)\30Y\309Z\31*\27\x91\6\6\1\4\a\1\2Q\5\x91\2\a\1\a\32\33j\3\b\16\v\16(\v\30N\30\16\3\t\b\368\318\16\31\30\31\4)\30\31\4\tZ\31*\xf1\6\25\x91\3\xf7\0:\16\a\36\v\16(\v\30\x0e7.\31\b\368\318\1\31\30\31\21\t\4\30\t\5\1\tZ\31*\xf1\2\x85\3\21%\1'
b'\26\xc1\3\xb7\1\36\v\a(\v\16W.\31\b\368\318\16\31\30\31\a)\30\31\24Z\4\aA\5\x91\2\x85\1\1\x95\2\21\5\2\6\25\6\1\a\xb1\3\xa7\3\36\b\31\368\31(\16)\30Y\30)\a\5\27\1\27\xe1\2\x85\x031\25\21\25\1\2\5\1\a\4\xf1\0\25\xb1\2\xb7\3\31\368\t\3\16\'\16\4\t\30Y\30'
b'\31\4\'\xf1\2\xb5\2aU\21\aA\2\4\2\25\xe1\1\5\xc1\2\xe7\2\36\xd7\1E\27\5\a\x81\3E1\25\21\x95\1\x81\1\x151%!\5\6\5\1\4\5!\5!\25A\25\xc1\3\xf7\2\5\aA\5\xb1\3e!\5!\5\21\5\1\xf5\0Qe\1\a\x041\2\6\5\2\5\1U\21\2\x045\1\6%\xb1\4\5\xc1\5U\x015\1\5\1\25\1\5\1\25'
b'\1\5\1\25\21\5\1\xe5\1\1\25\a\6!\5\3\1\5\a\xf5\0\1\xa5\1\x91\a\5\xa1\x025\21\xf5\0\1\xf5\0\1\xa5\1\1\xb5\1\1\4\21\25\3\1\5\1\6\aU\a\2\1U\1\6\1\x065a\5\xd1\3\25\xc1\2\25\21\25\21\xd5\1\21\5\1%\1\5\21\25\1\5\21\xf5\1\x015\21\25\6\5\2\4\1\5\1\a\xa5\1\6\22'
b'\6%1\x95\1\xd1\6\5!\xc5\1\x065\x115!\x95\3\1E\x115\6\22\6\1\xf5\0!e\6\1\5\1E\21\xe5\1\xc1\4\25!\xf5\1\2\25\x015\21\25\21\5\21\25a\xc5\1\a\xf5\0\1\25\1\25\22E\a%\1\2\aE\1\5\6\1\ae\1\a\xc5\2\xf1\1\xa5\4\2%1\5A\25\21\5\1E\1\xb5\1!e\21\5\21\6\2\x065\3\a5\1'
b'\2\6\4\6\25\6\2\1\5\27e\x015\1\xf5\a\a\25\6\5\1\27!\5\21\5A\25\1\5!\5\1\xb5\1\1\a\1\xb5\1\4&\x025\1\5\26\5\21\2\25\1\a\2\4\1\2\aE\1\4\6\4\xa5\1\1U\1\25\1\x85\1\21\xf5\1\1%\1%AU\2\a!\a5\1\x151\25\21\5\1\5\1\5\1\5\1E\x015\'"\5\21\x85\1\26\1%\27\6\25\a\1'
b'\2\1\a\5\2\21&\5\aE\2\1\5\aU\1\xf5\2\1U\1\x95\2!\5\1U\a\6\5\1\2E\1\5\1\5\1\5\1\25\21\5\1\5!\5\1\x95\1\a&\1\4!%\x91\1\6\1\4\1\5!\3\5\6\2%\1\6\2\1\6\5\1E\2\3\a%\1\5\1U\1\25\21\25!\25\1\5\1\x95\2\21U\1%!\xf5\0\1\5\1\4\x115\21\5\21\25!\25\1E\1\xb5\1\6\2%'
b'\21E\2\6\5\1\2\a\2\a\5\a\5\27\25&\1\5\26\21\4!\2E\2\1\xf5\0\1\x85\1\1\25\1\5\1\5!E\1\x95\1\1\25\1\x85\3\6\1%\1\5\21\5\21\25\21%a\xb5\1\6\2\xf5\0!\25\26\22\25\2\25\a\6\1\5\4!\a\25\4\1\5\1\4\26\5\1\25\6\5\6\1U\1e\1\5\21\5\1\25\1\25\1\x95\3\1\5\1\x95\1\a5'
b'\2\6\25\21\5\x015\1\x95\3\2\4!E\6"!\aE\1\a\5\4\22\6\1\4\6\1\4\a\6\1\5\2\21\a%\6\1\5\2\ae\1E!\x0515\1%\1U\1\x95\1\1\5\1\xd5\1\26\a%\2\25\1\26\4\21\x85\1\1\xa5\2!\26\3U\4\2\26E&\21\5!\6\4\25\2\21"\1\6\1\5\27\4\1\5\21%\1\x95\1\1\25!\5\1\25\21\5\1%\1\25\21'
b'\5\1\5\1E\21\x85\2\a\1\22\25\2\21\2\1\5\4\2\x065\1\xa5\2\a5\1\6\1\6\25\1%\21\25\2\6\21\26%\1\4\6\1\6\1%\22\4\a\2\6\1\a\4\27\5\1\5\1\a\6\4\x95\1\1%\x81\1%\1\x85\2\1\x85\1\1\xb5\1\27\2\a\5\1\2\a5\1\xf5\2\a\2\26\5\1\22\1\xe5\1\3Q\22\3\6\3\25\6\4\2\6!%\27'
b'\2\1\a\6\4\2\4e\1\xa5\1\21\5!\xf5\0\1\xd5\1\1\xa5\2\26\4\xd5\1\1\xd5\1\1E\a\22\x051%Q%\x021\6!\5\21\5\1&!\5\3&\1\5\2\6\1\6%\a\25\1%\x015A\5\1\x051\25\1%\1\xb5\1\1\25\21\xa5\1\21E\1\5\1\5\aE\1\a\xa5\3Q\2\a%\xf1\0%\4\6!\22\6\1\5\1\2\5\27\5\4\6\1\a\6\25\a'
b'A\5\a\24\25\a\6e\1%\1\5\1\25!\xd5\1\1%\1%\a\1\a\x95\1\a\x015\6\2\6\1\x065\1\6\3\xc5\1\1\xa5\1\a%!&5\xa1\1%\26\x116\2\26\22\5\1\5\1\a\2\6\4\26\5\4\1\a\5\a\4\25\1\a\25\1\5\1\25\1\5\1\5\1\5\21\5\21E\1\25\1\xd5\1\21U\21\xa5\1\6\2\a%\1\6\x95\3\27%\1\6\2\5'
b'\x175\xb1\x015\1\4\6\a!\25\1\26\21\5\6\5\4\5\1\2\21\6\5\a\22\25\4\1\25\x015\1%\1\5\1\5\21\xd5\1\1\x95\1\a\1\xb5\1\2\aE\6\25\a\5\21\6\a\x95\2\1\5\1E\6\22\6\22\x85\1\xe1\1\25A%\a\2\4\5F\1\5\21\a\5\1\2\5\a\5\2\aUA\5\21\5\21\x85\2\1%\a\6\4\6\22\xb5\1\1\25'
b'\1\5\21\a\1\22\6\2\a\x85\1!E\1\xa5\1\26\22%1e\xb1\1\25!5\a1\6\5\1\3\1\5\1\2G\2\1\a\xb5\1\21%\1%\1\xf5\1\27\6\2\27\xb5\1\22\25!\26\a\25\27\25\a\1E!\x85\2\x91\1\xc5\1\xf1\0%\2\5\2\5\a\5Q\5\21&\25\27!\a\xa5\3\a\xb5\1\2\6\a\xd5\1\1\2\6!\5\2U!E1\xb5\1\a\5\6'
b'\aQ\6\4\22\a\1\x051U\x91\1%\21\5\27\1\5\xb7\1!\2\a\5\a\xd5\4\2\6\xb5\1\6\aE\26\a%\1\a\21\6\2\xf5\0\1\a\xf5\0\1\5\a\5"\6\2\6\22\26\x057\5\x81\x015\x91\1E\4\a5\xf7\0\5!\5\6\x95\3\a\5\a\x95\1\a\2\x051E\'\5\22\27\5\a\22\5\27\1\2A\a\5\a5\a\1\xd5\1\aB\26\a\5'
b'\xf1\3\5\1E\x87\1\1\6\3\4\3\a\xf5\2\a\1\25\x115\a%1\6\5\4\a5\'\5\a"\5\21\5\a!\5\1\5\26\3\5\27E\1\x95\1\1\5\a\5\a\6\2\6\2\6\x91\5\5\a\xf5\0\1\2\6\5\2\27\6\xe5\2\a%\x015\'\25\1\26\2\x85\1\27\5\27\6\25\1\5\21\6\5"\25\21\a\5\a\25\27\x017e\aE\1\x051&\2\4'
b'\xc1\4\5\1GA5\xd7\2\5\21\a\5\21W\1\2\6\5\1\5\1\5G%\2\a\5\a\26\2\6\2&\5\'!\26\'\6\3&\3\xa7\1\5\6\2\5\x031\6\a\5\27\x81\5\5\a\21\6\2\1\a\1\2\25\x97\2\1\27\5A\a\x057\1\5\1\2\6A\x87\1\2%6\2\4\5\a!&%\a\25\a\2\xb7\1\5\27\x012\6\1\26\5!'
)


PALETTE_MBS = ((0,0,128),(240,244,240),(0,4,32),(88,60,48),(192,188,176),(224,232,240),(0,32,0),(216,224,224),(216,196,48),(192,32,32),(0,0,248),(88,176,64),(0,152,24),(0,100,0),(248,128,0))



KEY_LEFT, KEY_UP, KEY_DOWN, KEY_RIGHT, KEY_EXE, KEY_OK, K_ESC, KEY_1, KEY_2, \
KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_PLUS, KEY_MINUS, KEY_MULTIPLICATION, KEY_DIVISION, KEY_LEFTPARENTHESIS, KEY_RIGHTPARENTHESIS = range(1, 23)
try: from pc8_keys import *
except ImportError: pass

fnop = lambda : None
show_screen, PC_init = fnop, fnop
draw_rect = fnop
shell_viscols = fnop
L_ECRAN, H_FONT = 0, 0

try:
    import sys
    s = sys.platform
##################
# KhiCAS/Micropy #
##################
    if s == "numworks":
      import graphic
      set_pixel = graphic.set_pixel
      def get_pixel(x, y): return graphic.get_pixel(x, y + 24)
      d_key = {
        KEY_LEFT:0, KEY_UP:1, KEY_DOWN:2, KEY_RIGHT:3, KEY_EXE:4, KEY_OK:30201, K_ESC:5,
        KEY_1:49, KEY_2:50, KEY_3:51, KEY_4:52, KEY_5:53, KEY_6:54, KEY_7:55, KEY_8:56, KEY_9:57,
        KEY_PLUS:137, KEY_MINUS:153, KEY_MULTIPLICATION:169, KEY_DIVISION:47, KEY_LEFTPARENTHESIS:40, KEY_RIGHTPARENTHESIS:41
      }
      L_ECRAN, H_ECRAN = 320, 222
######################
# NumWorks + KhiCAS #
######################
      L_FONT, H_FONT = 11, 18
##################
# KhiCAS/Micropy #
##################
      show_screen = graphic.show_screen
      def draw_rect(x, y, w, h, c): graphic.draw_rectangle(int(x), int(y), int(w) - 1, int(h) - 1, c)
      def fill_rect(x, y, w, h, c): graphic.draw_filled_rectangle(int(x), int(y), int(w), int(h), c)
      def draw_string(s, x, y, cf, cb=(255,255,255)):
        if cb: graphic.draw_string(int(x), int(y), s, cf, cb)
        else: graphic.draw_string(int(x), int(y), s, cf)
      def PC_init(): fill_rect(0, 0, L_ECRAN, H_ECRAN, C_BLANC);
      import ion
      def keydown(v): return ion.keydown(d_key[v]) >= 0
except: pass
if not L_ECRAN:
############
# NumWorks #
############
      import kandinsky, ion
      get_pixel, set_pixel = kandinsky.get_pixel, kandinsky.set_pixel
      L_ECRAN, H_ECRAN = 320, 222
      L_FONT, H_FONT = 11, 14
      def fill_rect(x, y, w, h, c): kandinsky.fill_rect(int(x), int(y), int(w), int(h), c)
      def draw_string(s, x, y, cf, cb=(255,255,255)):
        if cb: kandinsky.draw_string(s, x, y, cf, cb)
        else: kandinsky.draw_string(s, x, y, cf)
      d_key = {
        KEY_LEFT:0, KEY_UP:1, KEY_RIGHT:3, KEY_DOWN:2, KEY_EXE:52, KEY_OK:4, K_ESC:5, KEY_1:42,
        KEY_2:43, KEY_3:44, KEY_4:36, KEY_5:37, KEY_6:38, KEY_7:30, KEY_8:31, KEY_9:32, KEY_PLUS:45, KEY_MINUS:46, KEY_MULTIPLICATION:39, KEY_DIVISION:40,
        KEY_LEFTPARENTHESIS:33, KEY_RIGHTPARENTHESIS:34
      }
      def keydown(v): return ion.keydown(d_key[v])
      def shell_viscols(): return 30

def l_str(s):
  return L_FONT * len(s)
try:
  from time import sleep
except:
  try:
    from utime import sleep
  except: pass
if draw_rect == fnop:
  def draw_rect(x, y, w, h, c):
    for dy in (0, h - 1): fill_rect(x, y + dy, w, 1, c)
    for dx in (0, w - 1): fill_rect(x + dx, y + 1, 1, h - 2, c)
def escape_key(): return keydown(K_ESC)
modifie = False

try: from tbs0 import TBS
except ImportError: pass

try: from mbs import *
except ImportError: pass
try: from nbs_defs import *
except ImportError: pass
try:
  from pc8 import L_ECRAN, H_ECRAN, PC_init, show_screen, set_pixel, get_pixel, draw_rect, \
    fill_rect, draw_string, L_FONT, l_str, H_FONT, keydown, escape_key, shell_viscols, \
    KEY_LEFT, KEY_UP, KEY_DOWN, KEY_RIGHT, KEY_EXE, KEY_OK, KEY_PLUS, KEY_MINUS, KEY_MULTIPLICATION, KEY_DIVISION, \
    KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_LEFTPARENTHESIS, KEY_RIGHTPARENTHESIS, \
    sleep
except: pass

#>>>>>> CONSTANTES COULEURS <<<<<<
C_BLANC, C_NOIR, C_ROUGE, C_BLEU, C_VIOLET, C_GRIS = (248,252,248), (0,0,0), (248,0,0), (0,0,248), (128,0,128), (128,128,128)

#>>>>>> FONCTIONS COULEURS <<<<<<
def to_rgb565(c): return (c[0]>>3<<3, c[1]>>2<<2, c[2]>>3<<3)

#>>>>>>> CONSTANTES IMAGE <<<<<<<
PALETTE_MBS_CLAIR = tuple([to_rgb565(tuple([i+4*(255-i)//5 for i in c])) for c in PALETTE_MBS])

#>CONSTANTES INTERFACE GRAPHIQUE<
L_CADRE, H_CADRE, H_FONT2, H_FONT12, N_CHIFFRES_SCORE = 2*L_MBS + 2, H_MBS + 2, H_FONT * 2, H_FONT // 2, 8

#>>>>>>> CONSTANTES DESSIN <<<<<<<
FORMES = (F_CARRE, F_DISQUE, F_TRIANGLE_BG, F_TRIANGLE_BD, F_TRIANGLE_HG, F_TRIANGLE_HD, F_TRIANGLE_HM, F_TRIANGLE_BM, F_TRIANGLE_GM, F_TRIANGLE_DM)

#>>>>>>> CONSTANTES SCORE <<<<<<<
D_SCORE = 255 * 3

#>>>>>>>> FONCTIONS SCORE <<<<<<<<
def score_couleurs(c1, c2):
  (r1, g1, b1), (r2, g2, b2) = c1, c2
  return D_SCORE - abs(int(r1) - int(r2)) - abs(int(g1) - int(g2)) - abs(int(b1) - int(b2)) # a diviser par 10 ?

def score_pixel(x,y,cd=None):
  x2 = x + L_MBS*(x <= L_MBS + x0_cadre and 1 or -1)
  cg = to_rgb565(get_pixel(min(x, x2), y)) # image de gauche
  if not cd: cd = to_rgb565(get_pixel(max(x, x2), y)) # image de droite
  return score_couleurs(cg, cd in PALETTE_MBS_CLAIR and C_BLANC or cd)

#>FONCTIONS INTERFACE GRAPHIQUE <
def center_1d(pos_cadre, l_cadre, l_objet): return pos_cadre  - ((min(l_cadre, l_objet) - l_cadre)//2)
def center_2d(x0_cadre, y0_cadre, l_cadre, h_cadre, l_objet, h_objet): return (center_1d(x0_cadre, l_cadre, l_objet), center_1d(y0_cadre, h_cadre, h_objet))
def cadre_couleur(rang,clr, x0_colbox, y0_colbox): draw_rect(x0_colbox + 1 + d_colbox*(rang % nx_colbox), y0_colbox + 1 + d_colbox*(rang // nx_colbox), d_colbox - 2, d_colbox - 2, clr)
def affiche_sapin(x0, y0):
  global score
  i, x = 0, 0
  while i < len(MBS):
    v = MBS[i]; mv, c = v & 15, (v & 0x70) >> 4
    if v & 128: i += 1; c |= MBS[i] << 3
    c += 1; i += 1
    while c:
      cw = min(c, L_MBS - x)
      fill_rect(x0 + x, y0, cw, 1, PALETTE_MBS[mv])
      fill_rect(x0 + x + L_MBS, y0, cw, 1, PALETTE_MBS_CLAIR[mv])
      c -= cw; x = (x + cw) % L_MBS; y0 += x == 0
      score += score_couleurs(PALETTE_MBS[mv], C_BLANC)*cw

def curseur(Xc, Yc, clr=None, double=1, clrdef=C_NOIR):
  for (i, j) in ((-2, 0), (-1, 0), (1, 0), (2, 0), (0, -2), (0, -1), (0, 1), (0, 2)):
    for k in range(double + 1):
      x, y = Xc + L_MBS*k + i, Yc + j; c = get_pixel(x, y)
      set_pixel(x, y, clr or c and tuple([255 - v for v in get_pixel(x, y)]) or clrdef)

def score_rect(x0, y0, w, h, cd=None):
  score = 0
  for y0 in range(y0, y0 + h):
    for x in range(x0, x0 + w): score += score_pixel(x, y0, cd)
  return score

def fill_rect_interface(x, y, w, h, c, dans_menu=False):
  global score
  if dans_menu or x < x0_cadre + L_CADRE - 1 or y < H_CADRE - 1:
    if not dans_menu:
      if x <= L_MBS + x0_cadre: w += x - 1 - L_MBS - x0_cadre; x = 1 + L_MBS + x0_cadre
      if y <= 0: h += y - 1; y = 1
    if not dans_menu: w, h = dans_menu and (w, h) or (min(w, L_CADRE - x - 1), min(h, H_CADRE - y - 1))
    if w > 0 and h > 0:
      if not dans_menu: score -= score_rect(x, y, w, h)
      fill_rect(x, y, w, h, c)
      if not dans_menu: score += score_rect(x, y, w, h, c)

def dessine(x, y, forme, taille, clr, dans_menu=False):
  x += L_MBS * (1 - dans_menu)
  if forme == F_CARRE: fill_rect_interface(x, y, taille, taille, clr, dans_menu)
  elif forme == F_DISQUE:
    for i in range(-taille+1,taille):
      for j in range(taille-1,-1,-1):
        if i**2 + j**2 < taille ** 2: break
      fill_rect_interface(x-j,y+i,2*j+1,1,clr,dans_menu)
  elif forme in (F_TRIANGLE_HG, F_TRIANGLE_BG, F_TRIANGLE_HD, F_TRIANGLE_BD):
    for i in range(taille - 1): fill_rect_interface(x + (forme in (F_TRIANGLE_HD, F_TRIANGLE_BD) and i + 2 - taille), y + i*(forme in (F_TRIANGLE_HG, F_TRIANGLE_HD) and 1 or -1), taille - i - 1, 1, clr, dans_menu)
  elif forme in (F_TRIANGLE_HM, F_TRIANGLE_BM):
    for i in range(-taille, taille): fill_rect_interface(x + i, y + (forme == F_TRIANGLE_HM and abs(i) or forme == F_TRIANGLE_BM and 1 - taille), 1, taille - abs(i), clr, dans_menu)
  elif forme in (F_TRIANGLE_GM, F_TRIANGLE_DM):
    for i in range(1 - taille, taille): fill_rect_interface(x + (forme == F_TRIANGLE_GM and abs(i) or forme == F_TRIANGLE_DM and 1 - taille), y + i, taille - abs(i), 1, clr, dans_menu)

x_score, s_score = None, None
def reaffiche_score(x0_score, y0_score, l_score, c):
  global score, x_score, s_score
  if not x_score is None: draw_string(s_score, x_score, y0_score, C_BLANC)
  n_chiffres_score, s_score = len(str(abs(score))), "{:d}"
  if n_chiffres_score - 3 < N_CHIFFRES_SCORE: s_score += "." + "{:0" + str(min(3, N_CHIFFRES_SCORE - n_chiffres_score + 3)) + "}" 
  s_score = s_score.format(score // 1000, score % 1000); x_score = center_1d(x0_score, l_score, l_str(s_score))
  draw_string(s_score, x_score, y0_score, c)

def config_interface():
  global x0_cadre, x0_score_xy, y0_score, y0_xy, l_score_xy, x0_taille, y0_taille, y0_px, l_taille, x0_taille_fleches, x0_formbox, y0_formbox, n_formbox, d_formbox, d_formbox12, x0_colbox, y0_colbox, nx_colbox,ny_colbox,d_colbox
  x0_cadre = L_ECRAN <= 2 * L_MBS and -1
  n1_colbox, n2_colbox = 1, 1
  marge = H_ECRAN - H_CADRE; l_score_xy = max(l_str("." + "0"*N_CHIFFRES_SCORE), l_str("(000;000)")); l_taille = l_str("000")
  x0_score_xy, y0_score, y0_xy = 0, center_1d(H_CADRE, marge // 2, H_FONT), center_1d(H_CADRE + marge // 2, marge // 2, H_FONT)
  x0_formbox, y0_formbox, l_formbox, h_formbox = l_score_xy, H_CADRE, (L_ECRAN - l_score_xy - l_taille)//2 - H_FONT, marge; l1_formbox, l2_formbox = l_formbox, h_formbox
  x0_taille, y0_taille = x0_formbox + l_formbox, center_1d(H_CADRE, marge, H_FONT2); x0_taille_fleches = x0_taille + l_taille
  x0_colbox, y0_colbox = x0_taille + l_taille + H_FONT2, H_CADRE; l_colbox, h_colbox = L_ECRAN - x0_colbox, marge; l1_colbox, l2_colbox = l_colbox, h_colbox
  d_formbox, d_colbox = (marge - 2) * 2 // 3, marge
  if not (d_formbox % 2): d_formbox -= 1
  n_formbox, n1_colbox = l1_formbox // d_formbox, len(PALETTE_MBS)
  while l2_formbox < d_formbox * 3 // 2 or l1_formbox < d_formbox * n_formbox or not d_formbox % 2 or n_formbox < 5: d_formbox -= 1; n_formbox = l1_formbox // d_formbox
  d_formbox12 = d_formbox // 2; n_formbox -= (n_formbox % 2) + 1
  x0_formbox, y0_formbox = center_2d(x0_formbox, y0_formbox, l_formbox, h_formbox, n_formbox * d_formbox, d_formbox * 3 // 2);
  while l1_colbox < d_colbox * n1_colbox or l2_colbox < d_colbox * n2_colbox: d_colbox -= 1; n2_colbox = marge // d_colbox; n1_colbox = ceil_div(len(PALETTE_MBS), n2_colbox)
  nx_colbox, ny_colbox = n1_colbox, n2_colbox
  x0_colbox, y0_colbox = center_2d(x0_colbox, y0_colbox, l_colbox, h_colbox, nx_colbox*d_colbox, ny_colbox*d_colbox)
  y0_formbox += d_formbox12

def affiche_interface():
  draw_rect(x0_cadre, 0, L_CADRE, H_CADRE, C_BLEU)  # 9-46-59-96-123-165
  draw_string("px", center_1d(x0_taille, l_taille, l_str("px")), y0_taille + H_FONT, C_VIOLET)
  x0_fleches = x0_taille_fleches + H_FONT
  dessine(x0_fleches, y0_taille, F_TRIANGLE_HM, H_FONT, C_VIOLET, True)
  dessine(x0_fleches, y0_taille + H_FONT2, F_TRIANGLE_BM, H_FONT, C_VIOLET, True)
  for i in range(len(PALETTE_MBS)): fill_rect(x0_colbox + 2 + d_colbox*(i % nx_colbox), y0_colbox + 2 + d_colbox*(i // nx_colbox), d_colbox - 4, d_colbox - 4, PALETTE_MBS[i])
  xc_formbox, yc_formbox = x0_formbox + n_formbox*d_formbox//2, y0_formbox + d_formbox12
  draw_rect(x0_formbox, y0_formbox, d_formbox*n_formbox+1, d_formbox, C_BLEU)
  for i in range(1, n_formbox): fill_rect(x0_formbox + i*d_formbox, y0_formbox + 1, 1, d_formbox - 2, C_BLEU)
  dessine(xc_formbox, y0_formbox - 2, F_TRIANGLE_BM, d_formbox12 - 1,C_BLEU, True)
  dessine(x0_formbox - d_formbox12 - 1, y0_formbox + d_formbox12, F_TRIANGLE_GM, d_formbox12, C_BLEU, True)
  dessine(x0_formbox + d_formbox*n_formbox + d_formbox12 + 1, y0_formbox + d_formbox12, F_TRIANGLE_DM, d_formbox12, C_BLEU, True)

#>>>>>>> AUTRES FONCTIONS <<<<<<<
def ceil_div(d, n): return -((-d) // n) # quotient arrondi par exces

def print_write(s, fichier=None):
  print(s)
  if fichier: fichier.write(s + "\n")

#>>>>>>>> INITIALISATION <<<<<<<<
rangCouleur, rangForme = 11, 1 ; Clr, Forme = PALETTE_MBS[rangCouleur], FORMES[rangForme]
PC_init(); config_interface()
Xc, Yc, Taille, chgClr, chgForme, chgTaille, chgX, chgY, ajoutForme, x_taille, x_xy, score = L_MBS // 2, H_MBS // 2, 7, 1, 1, 1, 1, 1, False, None, None, 0
xc_formbox = x0_formbox + n_formbox*d_formbox//2; yc_formbox = y0_formbox + d_formbox12
affiche_interface(); affiche_sapin(x0_cadre + 1, 1)
for elt in TBS:
  dessine(elt[0] + x0_cadre, elt[1], elt[2], max(1, min(999, elt[3])), PALETTE_MBS[elt[4]])
  score -= D_SCORE
curseur(Xc,Yc); reaffiche_score(x0_score_xy, y0_score, l_score_xy, C_ROUGE)

#>>>>>>> BOUCLE PRINCIPALE <<<<<<<
try:
  while not escape_key():
    if chgClr:
      for i in range(2):
        cadre_couleur(rangCouleur, i and C_NOIR or C_BLANC, x0_colbox, y0_colbox)
        if i: break
        rangCouleur = (rangCouleur + chgClr) % len(PALETTE_MBS); Clr = PALETTE_MBS[rangCouleur];
      l_formdess = d_formbox12 - 1
      curseur(xc_formbox, yc_formbox, C_BLANC,0); dessine(xc_formbox, yc_formbox, FORMES[rangForme], l_formdess, Clr, 1);  curseur(xc_formbox, yc_formbox, None, 0, C_NOIR); sleep(0.2)
    if chgX or chgY:
      for i in range(2):
        curseur(Xc,Yc) # efface/affiche par passage en negatif
        if not x_xy is None:
          draw_string(s_xy, x_xy, y0_xy, i and C_BLEU or C_BLANC)
        if i: break
        Xc, Yc = max(1, min(L_MBS, Xc + chgX)), max(1, min(H_MBS, Yc + chgY));
        s_xy = "({:d};{:d})".format(Xc, Yc); x_xy = center_1d(x0_score_xy, l_score_xy, l_str(s_xy))
      sleep(0.05)  
    if chgTaille:
      for i in range(2):
        if not x_taille is None: draw_string(str(Taille), x_taille, y0_taille, i and C_VIOLET or C_BLANC)
        if i: break
        Taille = max(1, min(999, Taille + chgTaille)); x_taille = center_1d(x0_taille, l_taille, l_str(str(Taille)))
      sleep(0.3)
    if chgForme:
      l_formdess = d_formbox12 - 1; sleep(0.2)
      for i in range(2):
        for k in range(-(n_formbox - 1) // 2, (n_formbox + 1) // 2, 1):
          dessine(xc_formbox + k*d_formbox, yc_formbox, FORMES[(rangForme + k) % len(FORMES)], l_formdess, not i and C_BLANC or k==0 and Clr or C_GRIS, 1) # bypass : dans_menu=1
        curseur(xc_formbox, yc_formbox, not i and C_BLANC, 0)
        if i: break
        rangForme = (rangForme + chgForme) % len(FORMES); Forme = FORMES[rangForme]
    if ajoutForme:
      modifie = True; curseur(Xc, Yc); dessine(Xc, Yc, Forme, Taille, Clr); TBS.append((Xc - x0_cadre, Yc, Forme, Taille, rangCouleur)); score -= D_SCORE; curseur(Xc, Yc); reaffiche_score(x0_score_xy, y0_score, l_score_xy, C_ROUGE); sleep(0.3)
    chgClr, chgForme, chgTaille = keydown(KEY_RIGHTPARENTHESIS) or -keydown(KEY_LEFTPARENTHESIS), keydown(KEY_DIVISION) - keydown(KEY_MULTIPLICATION), keydown(KEY_PLUS) - keydown(KEY_MINUS)
    ajoutForme, chgX = keydown(KEY_EXE) or keydown(KEY_OK) or keydown(KEY_5), (keydown(KEY_RIGHT) or keydown(KEY_9) or keydown(KEY_6) or keydown(KEY_3)) - (keydown(KEY_LEFT) or keydown(KEY_7) or keydown(KEY_4) or keydown(KEY_1))
    chgY = (keydown(KEY_DOWN) or keydown(KEY_1) or keydown(KEY_2) or keydown(KEY_3)) - (keydown(KEY_UP) or keydown(KEY_7) or keydown(KEY_8) or keydown(KEY_9))
except KeyboardInterrupt: pass

#>>>>>>>>>> SAUVEGARDE <<<<<<<<<<
TBS = ["({:<3d},{:<3d},{:<13s},{:<3d},{:<2d}),".format(cmd[0], cmd[1], nom_forme_const(cmd[2]), cmd[3], cmd[4]) for cmd in TBS]
try: FileNotFoundError # HP Prime throws OSError instead of FileNotFoundError (undefined)
except: FileNotFoundError = OSError
num_fichier, fichier = 0, None
if modifie:
  while True:
    try:
      try: nom_fichier = "tbs{:d}.py".format(num_fichier); fichier = open(nom_fichier, "r"); fichier.close(); num_fichier += 1
      except (FileNotFoundError, OSError): fichier = open(nom_fichier, "w"); break
    except: break
l_line, n_cols, line_maxchars = len(TBS) and len(TBS[0]), 1, shell_viscols() - 1
if not line_maxchars is None:
  for cmd in TBS[1:]:
    if l_line + len(cmd) < line_maxchars: n_cols += 1; l_line += len(cmd)
  l_line = line_maxchars + 1; n_cols += 1
  while l_line > line_maxchars and n_cols > 1:
    n_cols -= 1; max_cols = [0] * n_cols
    for i in range(len(TBS)): max_cols[i % n_cols] = max(max_cols[i % n_cols], len(TBS[i]))
    l_line  = sum(max_cols)
if fichier:
  fichier.write("try: from nbs_defs import *\nexcept ImportError: pass\n\n# Dessine-nous ici Ton Beau Sapin\n\n# liste a completer d'elements :\n# (x, y, forme, taille, couleur)\n\n#pour les formes :\n")
  for v in FORMES:
    fichier.write("# - {:<13s} : {:s}\n".format(nom_forme_const(v), v == F_CARRE and 'carre' or v == F_DISQUE and 'O' or v == F_TRIANGLE_HG and "   |/" or v == F_TRIANGLE_HD and "\\|" or v == F_TRIANGLE_BG and "   |\\" or v == F_TRIANGLE_BD and "/|" \
      or v == F_TRIANGLE_HM and "   /\\" or v == F_TRIANGLE_BM and "\\/" or v == F_TRIANGLE_GM and "   <|" or "|>"))
  fichier.write("#(triangles rectangles isoceles)\n\n#pour les couleurs :\n")
  for i in range(len(PALETTE_MBS)): c = PALETTE_MBS[i]; fichier.write("# - {:<2d} : ({:<3d},{:<3d},{:<3d})\n".format(i, c[0], c[1], c[2]))
print("\n# Score: {:s}".format(s_score)); print_write("\nTBS = [\n#" + ",".join(["( X , Y ,    FORME    , T ,C )"]*n_cols), fichier)
for i in range(len(TBS)):
  if not (i%n_cols): s_line = " "
  s_line += ("{0: <" + str(max_cols[i%n_cols]) + "}").format(TBS[i])
  if (i % n_cols) + 1 == n_cols or i +1 == len(TBS): print_write(s_line, fichier)
print_write("]", fichier);
if fichier: fichier.close(); print("Liste ecrite dans {:s}".format(nom_fichier))

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.