etiord.py for casio on Numworks, and compressed.
from kandinsky import draw_string as T,fill_rect as F,set_pixel as S from math import ceil from random import choice,randint as R from ion import keydown as K try:T("",0,0,"k","k",1);D=T except: ref="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz?!.,:;%+-*/=<>'_-[](){}";font="2jg02oN06Fd07AE04l907dE07dl079907gl07h906lj06kl03aZ06jk07dd07da03bh05lj07IN079h05kj04ad05zj01li03jk06la06jwG6kj03YE07II05jl05jg05jz05gj05gI07Ad003l04cl003d01Bl007p03ca003lE4cj026N0119g4br04aZ007z006j007l006la03l907a003M04dZ005l005g005?005L005hE07AO7A202I200020002W0220022W5Ab00NG007000ge01AKW0uu01KH04HK02G00000u4NK03IJ06IM01IH04IK03MJ06JM0" def dml(l,x,y,c1): for seq in range(4): v=ref.index(font[(ref.index(l)*4)+seq]);b=32 for i in range(6): if v>=b:S(i%3+x,i//3+(2*seq)+y,c1);v-=b b//=2 def dm(s,x,y,c1,c2=0): rx=x for l in range(len(s)): if s[l]!=" ":dml(s[l],x,y,c1) x+=4 def D(t,x,y,c1="k",c2="w",m=0): if m:dm(t,x,y,c1) else:T(t,x,y,c1,c2) def sign(x):return(x>0)-(x<0) def dxy(a):return(a==1)-(a==3),(a==2)-(a==0) L_ECRAN,H_ECRAN=320,222 GRIS=(191,)*3 def rgbTOhsv(r,g,b):cmax=max(r,g,b);d=cmax-min(r,g,b);h=d and(cmax==b and(r-g)/d+4 or cmax==g and(b-r)/d+2 or cmax==r and((g-b)/d)%6);s=cmax and d/cmax;return[h/60,s,cmax/255] def hsvTOrgb(h,s,v):h*=6;c=v*s;x=c*(1-abs((h%2)-1));r,g,b=h<1 and(c,x,0) or h<2 and(x,c,0)or h<3 and(0,c,x)or h<4 and(0,x,c)or h<5 and(x,0,c)or(c,0,x);return[round((k+v-c)*255)for k in(r,g,b)] CAR=( ' XX ', ' XXXX ', ' XXXXXX ', '_XXXXXX_', '_XX..XX_', '_X....X_', ' X.XX.X ', ' XXXXXX ', ' XXXXXX ', ' XXXXXX ', ' XXXXXX ', '_XXXXXX_', '_XXXXXX_', '_X....X_', ' XXXXXX ', ' XXXX ',) CAR_W,CAR_H=len(CAR[0]),len(CAR) RIEN,ROUE,CAROSSERIE,VITRE=' ','_','X','.' def ImEdit(data,x0,y0,a,pal,redraw=0): l,h=len(data[0]),len(data);sx,sy=dxy(a) for dy in range(h+1): for dx in range(l): px=dy>=h and RIEN or data[dy][dx] if a%2:x,y=x0-dy*sx,y0+dx*sx else:x,y=x0-dx*sy,y0-dy*sy if px!=RIEN and(1-redraw or redraw and(dy-1<0 or data[dy-1][dx]!=px)):S(x,y,pal[px]) elif redraw and px==RIEN and(dy>=h or data[dy-1][dx]!=RIEN):S(x,y,GRIS) TUILES=((32,32,("k","k",(64,28,40),(184,116,104),(40,52,64),(176,184,200),(216,224,224),(136,80,80),(136,144,168),(104,116,136),(248,252,248),(176,24,32),(72,84,96),(24,80,48),(48,16,24),(240,160,16),(240,104,0),(216,56,24),(88,44,48),(112,60,48)), b"\xe0\0\1B!\2!\xc0\1\xe1\2@\1\xe3\1\1\x80\1\4\1E\4\1E\4\1\5\1@\1C\xe1\0\3\1\xe0\0\1&\1\5\1&\1\5\1&! \2\a#\1H\1\3\1@\1\6!\6\1\6!\6\1\6!\6\1 \1\a#\tH\1\3\1@\1\6!\6\1\6!\6\1\6!\6\1\0\2'#\t\xe1\0\3\1 \1\n\5&\1\n\5&\1\n\5&!\0\1'#\1H\1\3\xe1\0\v%\b\1\v%\b\1" b"\v%\bA\a\1\a#\tH\1\3\1\5\1\n\5+\1\n\5+\1\n\5+\1\5!G#\t\xe1\0\3\1\5\1\v%\b\1\v%\b\1\v%\b\1\5\1'\1\a#\1H\1\3!\n\5+\1\n\5+\1\n\5+\1%!G#\tH\1\3!\n%\b\1\n%\b\1\n%\b\1%\1'\1\a#\t,\1\a\3\1\5\4%\1\5\4%\1\5\4%\1E!G\xe3\1\1\xa5\4\1'\1\a\xe3\1\1\xa9\4!G\xe3\1!" b"\t\1\t\1\t\1\t\1\t\1\t\1\t\1\t\1\t\1'\1\a\xe3\1\xc1\3I\1\r\1G\xa3\5\1\t\1\t\1\r'\1\a\xa3\5\1)\1-\1G\xa3\5!\t\1-'\1\a\xa3\5\1\16\1@\1G\xa3\2!\3!\3!\3!\3\1/\1 '\1\a\x83\2\1\6!\6!\6!\6\1\3\1\x0f0\1\0\1G\x83\2\5\1\3\5\1\3\5\1\3\5\1#\1\20\17\1\16\0'\1\a" b"\xa3\5\1\21\20\1 \1G\xb2\5\1\16\1@'\1\a\xb2\5\1\x80\1\1'\x92\1\4!\4A$!\4A\4\22\1\r\16\1@G\x92\1\xec\3\22\1\16/\1 \1\a\x92\1\4!\4A$!\4A\4\22A\x0f0\1\0'\x92\1\xec\3\22\1\x0e0\17\1\16\0\a\x92\1\4!\4A$!\4A\4\22\1-\23\21\20\1 \a\22A\22\xec\3\22\1M\16\1@"), (32,32,("k","k",(40,52,64),(24,80,48),(0,24,24),(216,224,224),(152,220,64),(136,144,168),(72,84,96),(0,160,40),(176,184,200),(112,60,48),(176,184,176)), b'P\21R!B\21"A\20\3\4\0\1\x85\3\1\0\3\26\0\1\5\1\27E\1\27\b\21\x87\1\5!\6\t\2\n\5\1\b\nE\1\30\1\5\18A\5\1\3\31\6\2\n\5\1\b\nE\1\30\n\5\1(\18\1\5\21\v\0\1\32\5\1\b\nE\1\30\n\5\1(\18\1\5\21\20\1\32\5\1\b\nE\1\30\n\5\1\30\1\28\1\5\21\0\2*\5\1\b\27\21\a\1(' b'\n\a\1\30\1\28\1\5\1\20\2*\5\1\xd8\1\1\2\x012\1\5\1\0\2:\5\1\xd8\1\1\2\1\2\21\2\1\5\1\0\1:\5\1(QH\2\1\2\21\2\1\n\5\21J\5\1\30\1\5\1\5\1\5\1H\2\1\2\21\2\1\n\5\21J\5\1\30\a\1\a\1\a\1h\2\21\2\1\b\n\5\1Z\5\1\xe8\1\2\21\2\1\b\n\5\1Z\5A\xf8\0\x91\1\5\1ZE\1' b'h\1\xa5\1\1:\1\n7\5\1h\n\5\1\x87\1\1Z\a\21\a\5\1h\n\5!\a\21\a\21\a\1*\1\n7\n\5\x81\1\5\1\xf7\0\1\0J\a\21\a\n\xa5\1\21\a\21\a\21\a\1\0\32\1\n7\32\xa7\1\1g\1\3\0:\a\21\a\32\a\x81\1\a\1\a\21\a\21\a\1\3\0\n\1\n7\32\xa7\1\1g\1\23\0*\a\21\a\32\a\x81\1\a\1' b'\a\21\a\21\a\1\23\0\x1a7\32\xa7\1\1g\1#\0\32\a\21\a\32\a\x81\1\a\1\a\21\a\21\a\1#\0\n7\32\xa7\1\1g\x013\0\n7\32\a\x81\1\a\1\27!\27\x013@\32\xa7\1\1\3\20,\xb0\1\32\a\x81\1\a\1\3\20,\xb0\1\n\xa7\1\1\23\20,\xb0\1\n\xa7\1\1\23\20,\xf0\0'), (32,32,("k",(40,52,64),"k",(216,224,224),(176,184,200),(104,116,136),(136,144,168),(72,84,96),(64,28,40),(184,116,104),(136,80,80),(88,44,48),(24,80,48)), b"\x80\1\1\2@\22a\2!\"\xf0\0\2\23\2 \2\xe4\1\2`\1\3\22\3\2\20\2\4\x025B%\4\2`\2\3\22\3\2\0\2\6\4\2'\x023\2\27\6\4\x020\2\b\1\24\x132\6\4\2'\x063\2\27\6\4\2 \2\31\2\24\26\2\31\26\4\2'\6\5\22\5\2\27\6\4\2 \2\31\24\6\1\2)\26\4\2\xa7\1\6\4\2\20\2\n\31\24\2" b"\23\2\31\26\4\xc2\1\4\2\20\2\n)\1\3\22\3\2\t\26\xe4\1\2\0\2\32)\2\3\22\3\2\t\26\xe5\1\2\0\2\32\31\1\24\23\2\31\26\25\2\5\2\5\2\5\2\5\2\5\2\25\22*\31\2\24\26\2\31\6\xe5\1\2\0\2*\31\24\26\2)\6\xe5\1\2\0:\31\24\26\2i\22\t\22\t\22\t\22\t\2\0:9\6\2i\2\3\2" b"2\3\22\3\22\3\2\t\2\0:\xc9\1\4\2\t\4\2\t\4\2\t\4\2\31\2\0:\x99\3\2\0:\xab\1\xe9\1\2\0:\v\2\v\2\v\2\v\2\v\2\v\xe9\1\2\0*\xab\1\nIR9\2\0*\v\2\v\2\v\2\v\2\v\2\v\n9\2\n9\29\2\0\32\xab\1\329\2\n9\29\2\0\32\v\2\v\2\v\2\v\2\v\2\v\32K\n;\2;\2\0\n\xa9\1*\v2\n" b";2\v\2\0\n\xa9\1\32K\n;\2;\2\f\0\n\xa9\1\32\v2\n;2\v\2\f\0\n\xa9\1\nK\n;\2;\2\34\0\n\xa9\1\n\v2\n;2\v\2\34\0\x8b\2\n;\2;\2,\0\v\22\v\22\v\22\v\22K\n;\2;\2,\x80\2\n;\2\f\x80\3\n\v\22\v\2\f\x80\1"), (32,32,("k",(40,52,64),"k",(24,80,48),(0,24,24),(216,224,224),(152,220,64),(0,160,40),(176,184,200),(112,60,48),(16,120,64),(176,24,32),(136,144,168),(104,116,136),(72,84,96),(248,252,248)), b'\xc0\1!\22\21"\xa0\1\3\x040\3\4\20\1\x85\1\2\x040\3\4 \3\26\4\20\3\26\4\0\2\x85\1\2\6\4\20\3\26\4\0\22\6\27\3\22\6\27\3\b\x85\1\2\27\3\22\6\27\23\27\6\22\3\27\6\22\b\x85\1\2\6\22\3\27\6\22\0\t\n\a\2\20\t\n\a\2\30\x85\1\2\a\2\20\t\n\a\2 \3\x020\3\2\v' b'\2\b\5\2\f"\f\b\5\x120\3\2\xa0\1\2\r\2\b\5\2N\b\5\2\xc0\1\21"\r"\5\2N\b\5"!\2! \x015\2\r\2%\2N\b\x95\1\1 \2\5\2\f\2\r\2<\2N\b\x8c\1\5\2\20\2\b\5\2\16\2\r\2\xce\1R\b\5\1\20\2\b\5\22\r\2\xce\1\2\5\2\5\2\5\2\b\5\1\0\2\30\5\22\r\2Qn\b\2\b\2\b\2\16\b\5\1' b'\0\2\30\5\x92\1.\2\36\x82\1\5\22(\x95\1\2\36\2\17\22\x95\1\22(\x8c\1\5\2\36\f\r\2\b\5\2\xfc\0\28\f\2\f\2\f\2\f\2\f\5\2N\b\5\22\f\2\f\2\f\2\f\2(\x8c\1\b\5\2.\2\16\b\5\2l\2\0(\f\2\f\2\f\2\f\2\f\b\5\2\36\2\17\2\b\5\2\f\2\f\2\f\2\f\2\0\30\x8c\1\30\5\2\36' b'\f\r\2\b\5\2\\\2\20\30\f\2\f\2\f\2\f\2\f\30\5\2N\b\5\22\f\2\f\2\f\2\20\bL\3\4\34(\5b\5\2L\3\4\20\b<\3\26\4\f(\x85\1\2\f\2\34\3\26\4@\22\6\27\3(\x8c\1\2 \22\6\27\x030\3\27\6\22(\f\2\f\2\f\2\f\2\f\2 \3\27\6\22\20\3\4\n\t\n\a\2(\x8c\1\2\20\3\4\n\t\n\a\2' b'\20\3\26\4\n\3\2\0(\f\2\f\2\f\2\f\2\f\2\0\3\26\4\n\3\2\20\22\6\27\3 \30\x8c\1\2\0\22\6\27\x030\3\27\6\22 \30\f\2\f\2\f\2\f\2\f\2\0\3\27\6\22@\t\n\a\x020\b\x8c\1\2 \t\n\a\2`\3\2@\b<\22,\x020\3\2P'), (32,15,("k",(184,116,72),(216,224,224),(112,60,48),"k",(176,184,200),(176,184,176),(40,40,32)), b"\0\xf1\1\2\xf1\1\2\21\xdb\1\2\21\xc3\1\1\v\2\21\23\4\5\4\5\4\5\x045\4\5\4\5\4\5\4\t\v\2\21\23\4\35\6\5\16\4\5\4=\4\t\v\2\21\23\4\x96\1\4\t\v\2\t\f\v\4\0\6\0\4'T\t\v\2\1\4\2\4\v\4\0\6\4\x91\1\v\2\1\2\f\v\4\0\6\2\x91\1\v\2\1\2\5\4\v\4\0\6\2\t\x93\1\2\1" b"\5\4\23\4\16\4\t\x93\1\2+\4\0\6\2\1\x9b\1\2-\4\0\6\2\xb5\1\4\5\4\5\4\b\6\25\4\5\4\5\x045\4\5\4\5\4\5\4"), (32,15,("k","k",(216,224,224),(104,116,136),(176,184,200),(136,144,168),(72,84,96)), b"@\1\n\1\0\1\n\1\0\1\n\t;\b1\2\t\2\1\2\t\2\1\2\t\2\1\23\31\3\0\1+\1\2\t\2\1\2\t\2\1\2\t\2\1\v\1\23\1\3\0\1#\1\f\n\1\f\n\1\f\n\1\5\v\6\23\1\6\1\5#\1\f\r\1\f\r\1\f\r\1\5\v\36\1\6\1\5\33\1\f\r\1\f\r\1\f\r\1\3\5\23&\r\33\1\f\r\1\f\r\1\f\r\1\3\5;\r\23\1\3" b"\4\r\1\3\4\r\1\3\4\r\1\v\5;\r\xa3\1\5;\r\xa3\1\5>\r\xa6\1\5\16\1\6\1\6\1\6\r\26\1\6\1\16\1\6\1\16\1\6\1\6\1\6\1\6\x056\1\5\xbe\1\1\6\1\6\1\6\1\5\xe6\1\1\xb8\1\26\t\16\1\0"), (32,15,("k","k",(64,28,40),(184,116,104),(216,224,224),(176,184,200),(24,100,72),(136,80,80),(24,80,48),(40,52,64),(136,144,168),(88,44,48),(72,84,96),(104,116,136),(176,184,176)), b" \1\22\1\22\1\2\1\xd0\2\1C\1\4\21\0\21\20\21\20\21\20\21\20\21 \x013\1\5\1\3\21\6!\6!\6!\6!\6\1\20\1\aC\27\3\1\26\1\b\26\1\b\26\1\b\26\1\b\26\1\20\1\aS\1\3\1\26\1\b\26\1\b\26\1\b\26\1\b\26\1\b\1\27C\1\4\21\26\1\t\26\1\t\26\1\t\26\1\t\26\1\b\1\x173\1" b"\5\1\3\1\6\b\1\n\1\b\1\n\1\b\1\n\1\b\1\n\1\b\1\b'C\27\3\1\b\t\n\1\n\t\n\1\n\t\n\1\n\t\n\1\n\t\1\b'\xfb\0\1\f\1\r\n\21\r\n\21\r\n\21\r\n\1\f\1\b'\33\1\33\1\33\21\r\34\1\r\34\1\r\34\1\r\34\1\f\1\b\27\xfb\0\1\f\1\r\f\21\r\f\21\r\f\21\r\f\1\f\1\b\1\27\33" b"\1\33\1\33\21\r\34\1\r\34\1\r\34\1\r\34\1\f\1\30\a\xfb\0\1\b\1\r\f\21\r\f\21\r\f\21\r\f\1\b0\a+!\33\1\b\r\34\1\r\34\1\r\34\1\r\34\1\b\xf0\0.@\f\1\b\0\f\1\b\0\f\1\b\0\f\1\x180"), (32,15,("k","k",(40,52,64),(248,252,248),(176,184,200),(216,224,224),(72,84,96),(136,144,168)), b'\30\t"\1Z\1\2\21\2\t\20\1\xd3\1\1\20\1\3$\21L)\4\3\1\b\2\5\3\1\26\1\v\1F\1\3\1\3\1\3\1\5\3\1\b\1\r\3\1\16\4\v\1>\1\4\1\4\1\4\1\2\5\3\1\0\1\r\1\5\3\1\6\17\1\2\xfe\0\5\3\1\0\1\5\3\5\1\5\3\xa9\1\3\1\2\r\1\3\5\1\5\xb3\1\t\r\3\1\3\5\1\xb4\1\1\r\1\5\3\1\3' b'\5\xb9\1\25\1\5\3\1\xb4\1\1\b\5\3\5\1\5\3\xb9\1\20\5\3\5\1\xb4\1\1 \5\3\5\xb9\1(\5\xb4\1\1\20'), (15,15,("k",(0,24,24),(64,28,40),"k",(24,80,48),(152,220,64),(184,116,72),(112,60,48),(0,160,40),(136,144,168),(40,40,32),(216,224,224),(176,184,200),(176,184,176),(16,120,64)), b"\20\1P\2\3@\4\5\1 \2\3\6\a\2 \23\30\4\2\3&\27\3\20\4\b\5\3\2\26\3\26'\2\20\a\b\3\26\3\t\3\x067\2\0\4\23\6\3\t\n\t\x037\2\4\1\3\a\6\a\v\f\3\x067\2\5\1\3\a\6\a\v\3\x167\3\35\v\a\6\27\26\22'\3\4\1\v\a&\22\t\f\2\27\2\5\1\v\a\6\22\t,\t\2\a\3\35\v\a\2\t\\" b"\t\2\3\4\1\33\f\3\f\3\f\3\f\3\f\t\3\5\1\v\x9c\1\3\0\36\vL\3<\3\0"), (15,15,("k","k",(40,52,64),(248,252,248),(176,184,200),(216,224,224),(72,84,96),(136,144,168)), b"\20\1*\1\2\21\b\2\33!\v\1\b\1\3\1\4\1\33\1\4\3\2\0\2\5\3\1\6\4\33\1\5\3\2\0\1\5\3\1\6\4\33\1\5\3\t\r\3\1\6\4\a\1\a\1\2\5\3\t\r\3\1.\2\5\3\1\25\3A\3\1\25S\1\25$\33\f\1\25\f\1\4\5\4\t\4\1\4\1\r$\5\34\t\0\r\f\1\4\5\4\t\4\1\4\1\0\5$\5\34\t\b\5\4\t\4\5\4" b"\t\4\1\4\1\b"), (15,15,("k",(184,116,72),(112,60,48),(216,224,224),"k",(176,184,200),(24,80,48),(176,184,176),(64,28,40)), b"\0\xb1\1\22\3\1\x92\1\1\22\3\1\x92\1\1\22\3\1\22\4U\4\1\22\3\1\22\4\5\4\25\4\5\4\1\22\3\1\22\4\6\a\20\a\0\4\1\22\3\1\22\4G\0\b\1\22\3\1\22\4\6\20\a\20\b\1\22\3\1\22\4\6\20\a\20\4\1\22\3\1\22$(\24\1\22\3\xb1\1\22\3\xd2\1\3\xd2\1\3\xf5\1\4\5\4\5\4%\4\5" b"\4\5\4"), (15,15,("k",(24,80,48),(152,220,64),(0,24,24),(40,52,64),(248,252,248),"k",(0,160,40),(176,184,200),(216,224,224),(112,60,48),(72,84,96),(176,184,176)), b"\0\1\22\3\20\4e\26\2\27\1\0\x065\6\b\5\1\27\2&\t\5\b\6\b\6\t\5\0\n\6$\6\t\5\6+\t\5\0\4E\t\5\6+\t\5\0\6\5\6\30\31\5F\5\6\t\5\6\33\31e\6\t\5\6\33\31h\31\5\6\33\31\b\6\b\6\b\6\b\31\5&\th\6\31E\b\6\b\6\b\6\b\6\t\xb8\1\6\0\t\30\6\b\6\b\6\b\6\b\6\b\6\f\xb8" b"\1\6\20\30\6\b&\b\6\b\6\b\6\20")) def ImComp(rle,x0,y0,w,pal,itransp=-1): i,x=0,0;nvals=len(pal)-1;nbits=0 while nvals:nvals>>=1;nbits+=1 maskval=(1<<nbits)-1;maskcnt=(0xFF>>nbits>>1)<<nbits while i<len(rle): v=rle[i];mv=v&maskval;c=(v&maskcnt)>>nbits if v&0b10000000 or nbits==8:i+=1;c|=rle[i]<<(7-nbits+(nbits==8)) c+=1 while c: cw=min(c,w-x) if mv!=itransp:F(x0+x,y0,cw,1,pal[mv]) c-=cw;x=(x+cw)%w;y0+=x==0 i+=1 QUARTIERS=( ('XXXXXXXXXXXXXXXXXXXX', 'X X', 'X X XX XXXXX XXXXX X', 'X X X', 'X X XX XXXXXXXX XX X', 'X X XX XX X', 'X X XXXXX XX XX XX X', 'X XX XX X', 'XXX XXXXX XXXXX XX X', 'XXX XX X', 'XXX XXXXXXXX XX XX X', 'XXX X', 'XXX XXXXXXXXXXX XXXX', 'XXX XXXXXXXXXXX*XXXX'), ('XXXXXXXXXXXXXXXXXXXX', 'X XXXX', 'X XXXXXX XXXXXX XXXX', 'X X X XXXX', 'X X X XX X XX X XXXX', 'X X *', 'X X X XXXX XX XXXX X', 'X X X X X', 'X X X XX XXXX XX X', 'X XXX X XX X', 'X XX XXXX XX X', 'X XXX XXXX X', 'X XXXX XXXXXXXXX', 'XXXXXXXXXX XXXXXXXXX'), ('XXXXXXXXXXXXXXXXXXXX', 'X X', 'X XXXX X XXXXX X X X', 'X X', 'X X XX XXXXXXX XXX X', 'X X X', 'X X XX X XX XX XXX X', 'X X XX *', 'X X XX X XX XXXX XXX', 'X X XXX', 'X X XX X XXXXX X XXX', 'X X X XXX', 'X XXXXXX XXXXX X XXX', 'X X', 'XXXXXXXX XXXXXXXXXXX', 'XXXXXXXX XXXXXXXXXXX'), ('XXXXXXXXXXXXXXXXXXXX', 'X X', 'X XX X XXXXX XXXXX X', 'X XX X', 'X XX XXXX XXXXX XX X', 'X XX X', 'X XX X XX XX XX XX X', 'X XX X XX XX X', 'X XX XX XX XX XX X', 'X X XX X', 'X XX X XXXXX XX XX X', 'X X XX X', 'XXXXXX XXXXXXXX XXXX', 'XXXXXX XXXXXXXX*XXXX'), ('XXXXXXXXXXXXXXXXXXXXX', 'X X', 'X XX XXXXXXXXXXXX X X', 'X XX X', 'X XX XXX XXXXXXXX X X', 'X XXX X', 'XXXX XXXXXXXX XXX X X', 'X X X', 'X XX XXX XXXX XXX X X', 'X XX XXXX X', 'X XX XXX XXXX XXX X X', 'X XXX X', 'XXXXXXXX XXXX XXXXXXX', 'XXXXXXXX XXXX*XXXXXXX'), ('XXXXXXXXXXXXXXXXXXXXX', 'X X', 'X X XXXX XXXX XX XX X', 'X X X X', 'XXX X XX X XX XX XX X', 'X XX X', 'X XXX XXXX XX XX XXXX', 'X XX X', 'X X XXXX X XX XX XX X', 'X X XX X', 'X X X XX XXXX XX XX X', 'X X XX X', 'X X X XX X XX XXXXX X', 'X XX XX X', 'X X X XXXX XXXXX XX X', 'X X *', 'XXXXXXXXXXXXXXXXXXX X')) T_RIEN,T_RUE,T_BATIMENT,T_DEPART='',' ','X','*' def typeTuile(c,l): if c<0 or c>=L_QUARTIER or l<0 or l>=H_QUARTIER:return T_RIEN return QUARTIER[l][c] def road(t):return t!=T_BATIMENT def roadAt(c,l):return typeTuile(c,l)!=T_BATIMENT def xyTuile(c,l):global X0_QUARTIER,Y0_QUARTIER;return X0_QUARTIER+c*L_TUILE,Y0_QUARTIER+l*L_TUILE def gridXY(x,y):return x//L_TUILE,y//L_TUILE def dansQuartier(c,l):return c>=0 and c<L_QUARTIER and l>=0 and l<H_QUARTIER def xyCar(x,y):return X0_QUARTIER+x,Y0_QUARTIER+y def drawCar(car):hsv=rgbTOhsv(*car[8]);hsv[1]/=2;xy=xyCar(car[0],car[1]);ImEdit(CAR,xy[0],xy[1],car[4],{ROUE:"k",CAROSSERIE:car[8],VITRE:hsvTOrgb(*hsv)}) def redrawCarMod(car):hsv=rgbTOhsv(*car[8]);hsv[1]/=2;xy=xyCar(car[0],car[1]);ImEdit(CAR,xy[0],xy[1],car[4],{ROUE:"k",CAROSSERIE:car[8],VITRE:hsvTOrgb(*hsv)},1) def clearCar(car):xy=xyCar(car[0],car[1]);dx,dy=car[5],car[6];F(xy[0],xy[1],car[4]%2 and CAR_H*-dx or CAR_W*-dy,car[4]%2 and CAR_W*dx or CAR_H*-dy,GRIS) def turnCar(car): ok=0;x,y,a,vx,vy=car[0],car[1],car[4],car[5],car[6];c,l=gridXY(x,y) if roadAt(c+(a==0)-(a==2),l+(a==1)-(a==3)): ok=1;car[9]+=1;a=(a+1)%4;vx,vy=dxy(a);c,l=gridXY(x,y) if a%2:x+=vx*(roadAt(c-vx,l)and CAR_W or CAR_H) else:y+=vy*(roadAt(c,l-vy)and CAR_W or CAR_H) car[0],car[1],car[4],car[5],car[6]=x,y,a,vx,vy return ok def infos(): F(0,0,L_ECRAN,H_ECRAN,"k");D("Escape from Etiord City",45,1,"w","k");msg=("Pour rejoindre ton lieu de villegiature au volant de ta","voiture rouge, comme tant d'autres il te faut traverser la","metropole d'Etiord.","Pour pacifier la circulation automobile, le maire vient de","decider d'un changement radical au plan de circulation, l'","interdiction de tourner a gauche (c'est-a-dire de couper","toute voie de circulation) et ce sur l'ensemble de tous les","quartiers.","Sauras-tu rejoindre la sortie d'Etiord City ?","Touches :","- [OK]/[EXE] pour tourner sur la prochaine rue a droite","Tape [OK]/[EXE] pour continuer...");n=len(msg);y=32 for i in range(n):ligne=msg[i];D(ligne,0,y,hsvTOrgb(i>n//2 and.5,abs(i-n//2)*2/n,1),"k",1);y+=11 while 1-K(4)-K(52):0 def drawInit(): for l in range(H_QUARTIER): for c in range(L_QUARTIER): tuile=typeTuile(c,l);xTuile,yTuile=xyTuile(c,l);F(xTuile,yTuile,L_TUILE,L_TUILE,tuile==T_BATIMENT and"g"or GRIS) if tuile==T_BATIMENT: for s in(-1,1): if road(typeTuile(c,l+s)):F(xTuile,yTuile+(s>0 and L_TUILE-1),L_TUILE,1,"k") if road(typeTuile(c+s,l)):F(xTuile+(s>0 and L_TUILE-1),yTuile,1,L_TUILE,"k") if road(tuile): x0,y0=xTuile+L_TUILE//2,yTuile+L_TUILE//2;S(x0,y0,"w") for d in range(L_TUILE//2): for s in(1,-1): if(d-1)%4: if roadAt(c+s,l)and(1-roadAt(c,l-1)or 1-roadAt(c,l+1)):S(x0+s*(d+1),y0,"w") if roadAt(c,l+s)and(1-roadAt(c-1,l)or 1-roadAt(c+1,l)):S(x0,y0+s*(d+1),"w") grilleRemplie=[[0]*L_QUARTIER for i in range(H_QUARTIER)] for l in range(H_QUARTIER): for c in range(L_QUARTIER): if roadAt(c,l):grilleRemplie[l][c]=1 for l in range(H_QUARTIER): for c in range(L_QUARTIER): if 1-grilleRemplie[l][c]: ok=0 while 1-ok: tuile=choice(TUILES);sl,sh=tuile[0],tuile[1];sl_c,sh_c=0,0 while sl>=(sl_c+1)*L_TUILE-2:sl_c+=1 while sh>=(sh_c+1)*L_TUILE-2:sh_c+=1 ok=1 for dl in range(sh_c): for dc in range(sl_c): if l+dl>=H_QUARTIER or c+dc>=L_QUARTIER or grilleRemplie[l+dl][c+dc]:ok=0;break if 1-ok:break if ok: for dl in range(sh_c): for dc in range(sl_c):grilleRemplie[l+dl][c+dc]=1 ImComp(tuile[3],X0_QUARTIER+c*L_TUILE+(L_TUILE>=17),Y0_QUARTIER+l*L_TUILE+(L_TUILE>=17),tuile[0],tuile[2],itransp=0);break def initQuartier(iQuartier=0): global QUARTIER,L_QUARTIER,H_QUARTIER,L_TUILE,X0_QUARTIER,Y0_QUARTIER,C0_CAR,L0_CAR,A0_CAR;QUARTIER=QUARTIERS[iQuartier];L_QUARTIER,H_QUARTIER=len(QUARTIER[0]),len(QUARTIER);L_TUILE=(H_QUARTIER-3)*17>H_ECRAN and 15 or 17;X0_QUARTIER=-(L_QUARTIER*L_TUILE-L_ECRAN)//2;Y0_QUARTIER=-(H_QUARTIER*L_TUILE-H_ECRAN)//2;aTester=[] for l in range(1,H_QUARTIER-1):aTester.extend([(0,l),(L_QUARTIER-1,l)]) for c in range(1,L_QUARTIER-1):aTester.extend([(c,0),(c,H_QUARTIER-1)]) for test in aTester: if typeTuile(test[0],test[1])==T_DEPART:C0_CAR,L0_CAR=test[:2];A0_CAR=C0_CAR==0 and 1 or C0_CAR==L_QUARTIER-1 and 3 or L0_CAR==0 and 2;break def initCar(iQuartier=0):global car;vxCar,vyCar=dxy(A0_CAR);x,y=C0_CAR,L0_CAR;car=([x*L_TUILE+(A0_CAR%2==0 and L_TUILE//2+(A0_CAR==0)-(A0_CAR==2)),y*L_TUILE+(A0_CAR%2 and L_TUILE//2+(A0_CAR==1)-(A0_CAR==3)),x,y,A0_CAR,vxCar,vyCar,0,(255,0,0),0,0]) def loopQuartier(): ok=1;r=0 while ok: aBouge=1;oldCar=list(car);aTourne=0 if(K(4)+K(52)):car[7]=1;r=5 elif r==0:car[7]=0 else:r-=1 if((car[4]%2==0 and car[1]%L_TUILE==L_TUILE//2+(car[4]==0)-(car[4]==2)or car[4]%2 and car[0]%L_TUILE==L_TUILE//2+(car[4]==3)-(car[4]==1)))and car[7]: aTourne=turnCar(car) if aTourne:car[7]=0 elif 1-roadAt(car[0]+(car[4]%2 and car[5]),car[3]+(1-(car[4]%2)and car[6])):aTourne=turnCar(car) if 1-aTourne: carX,carY=car[0]+car[5],car[1]+car[6];carXt,carYt=gridXY(carX,carY) if roadAt(carXt,carYt):car[0],car[1]=carX,carY;car[2],car[3]=carXt,carYt;car[10]+=1 else:aBouge=0 if aTourne:clearCar(oldCar);drawCar(car) elif aBouge:redrawCarMod(car) else:return 0 ok=dansQuartier(car[2],car[3]) cCar,lCar=gridXY(car[0],car[1]);return(1-dansQuartier(car[2],car[3])and(cCar==C0_CAR or lCar==L0_CAR))^1 def etiord(): infos();iQuartier,nQuartiers=-1,len(QUARTIERS);gagne=1;dist,turns=0,0 while gagne and iQuartier<nQuartiers: iQuartier+=1;initQuartier(iQuartier);print("Entree quartier #{:d}:".format(iQuartier+1));print("0 pour quitter") try:quit=int(input()) except:quit=1 if quit==0:break if quit==420:iQuartier+=1;initQuartier(iQuartier) initCar();drawInit();gagne=loopQuartier() if gagne:print("Sortie quartier #{:d} !".format(iQuartier+1));print(" {:d} tournants".format(car[9]));print(" {:.3f} km".format(car[10]/1000));dist+=car[10];turns+=car[9] else:print("Echec quartier #{:d}.".format(iQuartier+1));gagne=1;iQuartier-=1 pluri=iQuartier>1 and"s"or"";print("{:d} quartier{:s} traverse{:s}".format(iQuartier,pluri,pluri)) if iQuartier:print(" {:d} tournants cumules".format(turns));print(" {:.3f} km cumules".format(dist/1000)) iQuartier=0 etiord()