From 265940e025297fe3c0d2da1213974957c1185e6b Mon Sep 17 00:00:00 2001 From: Pavel Date: Fri, 25 Sep 2020 22:25:38 +0200 Subject: [PATCH] initial commit --- README | 12 ++++ labygui.png | Bin 0 -> 38767 bytes labygui.py | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 196 insertions(+) create mode 100644 README create mode 100644 labygui.png create mode 100644 labygui.py diff --git a/README b/README new file mode 100644 index 0000000..49cca8b --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +This is a modified version of the Python script for the TI-Planet and +Planete Casio back to school 2020 contest. + +This modified version works with Python 3 under GNU Linux and MS Windows. + +The original code can be found at: + +https://tiplanet.org/forum/viewtopic.php?f=49&t=24276 + +This script can be executed with the following command: + + python3 labygui.py diff --git a/labygui.png b/labygui.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae05a66db357fc32286fa2115ed19f101a9d650 GIT binary patch literal 38767 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 1: + index -= 1 + path = path[:-1] + aller_selon(path) + +def next(event): + global path, index + if index < len(path) - 1: + index += 1 + aller_selon(path) + +def previous(event): + global path, index + if index > 0: + index -= 1 + aller_selon(path) + +def left(event): + global path, index + path[index] = (round(path[index][0] + 0.1, 1), path[index][1]) + aller_selon(path) + +def right(event): + global path, index + path[index] = (round(path[index][0] - 0.1, 1), path[index][1]) + aller_selon(path) + +def up(event): + global path, index + path[index] = (path[index][0], round(path[index][1] + 0.1, 1)) + aller_selon(path) + +def down(event): + global path, index + if path[index][1] > 0: + path[index] = (path[index][0], round(path[index][1] - 0.1, 1)) + aller_selon(path) + +def print_code(event): + global path + print('') + print('path = %s' % path) + print('') + print('def chemin():') + for i in range(len(path)): + print(' a_gauche(%s)' % path[i][0]) + print(' avancer(%s)' % path[i][1]) + print('') + +master.bind('', escape) +master.bind('', add) +master.bind('', remove) +master.bind('', previous) +master.bind('', next) +master.bind('', left) +master.bind('', right) +master.bind('', up) +master.bind('', down) +master.bind('p', print_code) +master.bind('P', print_code) + +canvas = Canvas(master, width = screen_w, height = screen_h + 68, bg = 'white') +canvas.pack() + +def clean_screen(): + canvas.delete('all') + +def draw_rect(x, y, w, h, color): + x += 1 + y += 1 + canvas.create_rectangle(x, y, x + w, y + h, fill = color, outline = '') + +def draw_line(x1, y1, x2, y2, color): + canvas.create_line(x1 + 1, y1 + 1, x2 + 1, y2 + 1, fill = color, width = 2.0) + +def draw_help(): + help = 'change angle: Left/Right, change length: Up/Down, add/remove element: Enter/Delete, previous/next element: PgDn/PgUp, print code: P, exit: Esc' + canvas.create_text(4, screen_h + 36, anchor = NW, text = help, fill = 'black') + +def draw_path(): + global path + canvas.create_text(4, screen_h + 4, anchor = NW, text = '%s' % path[0:14], fill = 'black') + canvas.create_text(4, screen_h + 20, anchor = NW, text = '%s' % path[14:28], fill = 'black') + +def draw_score(score): + canvas.create_text(4, screen_h + 52, anchor = NW, text = 'score: %f' % score, fill = 'black') + +def fix_angle(a): + return a * 2 * asin(1) / pi + +def cout(x): + return len(str(round(abs(x)/1.,5))) + +def tourner(a): + global state + state[7] += a + state[5] += 5 + cout(a) + state[2] -= a + +def avancer(l, color): + global state + t = fix_angle(state[2]) + dx, dy = cos(t), sin(t) + state[7] += l + state[5] += 8 + cout(l) + while(l > 0): + state[3:5] = state[0:2] + x, y = state[0] + dx/4, state[1] + dy/4 + ix, iy = int(x) - (x < 0), int(y) - (y < 0) + drx, dry = ix - int(state[3]), iy - int(state[4]) + vw = lambda y, x: wl[y] & 2**x + hw = lambda y, x: wl[y + laby_h] & 2**x + tx = drx and (ix < 0 or ix >= laby_w or vw(iy - dry, laby_w - 2 - min(ix, ix - drx))) + ty = dry and (iy < 0 or iy >= laby_h or hw(min(iy, iy - dry), laby_w - 1 - (ix - drx))) + t = dx <= 0 or int(x) < laby_w - 1 or int(y) < laby_h - 1 + if t and tx or ty or (drx and dry and (t and tx or ty)) or (drx and dry and (t and vw(iy, laby_w - 2 - min(ix, ix - drx)) or hw(min(iy, iy - dry), laby_w - 1 - ix))): + state[5] += 15 + return + l -= .25 + state[6] += (state[6] < 200) + state[0:2] = (x, y) + draw_line(state[3] * zx, state[4] * zy, state[0] * zx, state[1] * zy, color) + +def aller_selon(path): + global state + state = [0, .5, 0, 0, .5, 0, 0, 0] + clean_screen() + for i in range(2): + draw_rect(0, i * laby_h * zy, laby_w * zx + zint, zint, 'black') + draw_rect(i * laby_w * zx, (not i) * zy, zint, (laby_h - 1) * zy, 'black') + for y in range(2 * laby_h - 1): + for z in range(laby_w - (y < laby_h)): + if wl[y] & 2**z: + x = laby_w - 1 - z + if y < laby_h: + draw_rect(x * zx, y * zy, zint, zy + zint, 'black') + else: + pass + draw_rect(x * zx, (y - laby_h + 1) * zy, zx + zint, zint, 'black') + for i in range(len(path)): + tourner(path[i][0]) + if i == index: + avancer(path[i][1], 'red') + else: + avancer(path[i][1], 'blue') + state[5] += sin(fix_angle(state[7])) - state[6] // 2 + draw_help() + draw_path() + draw_score(state[5]) + +aller_selon(path) + +if __name__== "__main__": + master.mainloop()