Python Game for Numworks N0110 and N0100,
code by Robert V., october 2020.
nsi.xyz/treasure (FR)
Un trésor a été caché. Déplace toi et pars à sa recherche. Evite les rochers et les trous. Appuies sur [OK] pour creuser un trou. Un sonar t’aide à te guider, sauras-tu l’utiliser ? 🧐
# Treasure v1 NW 17/10/2020 # https://nsi.xyz/treasure # par Robert Vincent (cent20) from math import sqrt from kandinsky import * from ion import * from random import randint from time import sleep position = [2, 2] mvt = [2, 2] score = 666 tresor = [0, 0] def wait(buttons=(0,1,2,3,4,5,52)): # Attends qu'une des touches précisées soit pressée while True: for i in buttons: if keydown(i): while keydown(i): True # Fonction anti-rebond return i def texte_center(texte, x=160, y=110, col1=(255, 255, 255), col2=(255, 255, 255)): '''Cette fonction affiche un texte et le centre''' draw_string(texte, x - len(texte) * 10 // 2, y, col1, col2) def col_os(test=0): '''Coloration de l'interface, respecte le thème Omega ou Epsilon test = 1 pour utilisation dans get_pixel (debug)''' try: get_keys() return (192, 53 - 1 * test, 53 - 5 * test) except: return (255 - 7 * test, 183 - 3 * test, 52 - 4 * test) def personnage(aff=0): '''Affiche ou efface le personnage''' if aff == 0: fill_rect(position[0], position[1], 10, 10, (255, 255, 255)) else: fill_rect(position[0], position[1], 10, 10, col_os()) fill_rect(position[0] + 3, position[1] + 3, 1, 2, (255, 255, 255)) fill_rect(position[0] + 6, position[1] + 3, 1, 2, (255, 255, 255)) fill_rect(position[0] + 3, position[1] + 7, 4, 1, (255, 255, 255)) fill_rect(position[0] + 2, position[1] + 6, 1, 1, (255, 255, 255)) fill_rect(position[0] + 7, position[1] + 6, 1, 1, (255, 255, 255)) # On peut d'ailleurs faire une vrai dessin def start(): '''Lancement du jeu. Texte introductif, génération des obstacles''' global tresor texte_center("A treasure has been hidden", 160, 12, col_os()) texte_center("Move around to look for it,", 160, 42, (120, 120, 120)) texte_center("avoid rocks and holes,", 160, 62, (120, 120, 120)) texte_center("Press OK to dig a hole", 160, 82, (120, 120, 120)) texte_center("Press on an arrow", 160, 122, col_os()) wait() fill_rect(1, 1, 320, 204, (255, 255, 255)) for i in range(32): # On place 32 obstacles fill_rect(2 + 10 * randint(2, 29), 2 + 10 * randint(2, 18), 10, 10, (42, 42, 42)) for i in range(16): # On place 16 trous x = randint(2, 29) y = randint(2, 18) for j in range(4): fill_rect(2 + 10 * x + j, 2 + 10 * y + j, 10 - 2 * j, 10 - 2 * j, (196 - j * 32, 196 - j * 32, 196 - j * 32)) while tresor == [0, 0]: x = 2 + 10 * randint(2, 29) y = 2 + 10 * randint(2, 18) if get_pixel(x, y) == (248, 252, 248): tresor = [x, y] personnage(1) def info(penalite=0, init=0): global score score -= penalite if init == 1: fill_rect(1, 1, 320, 204, (255, 255, 255)) fill_rect(0, 204, 320, 20, col_os()) texte_center("nsi.xyz/treasure par cent20 ", 160, 184, col_os()) texte_center("x", 20, 204, (255, 255, 255), col_os()) texte_center("y", 50, 204, (255, 255, 255), col_os()) texte_center("score", 100, 204, (255, 255, 255), col_os()) texte_center("event", 160, 204, (255, 255, 255), col_os()) texte_center("distance", 250, 204, (255, 255, 255), col_os()) else: fill_rect(0, 204, 320, 20, col_os()) texte_center(str(position[0] // 10), 20, 204, (255, 255, 255), col_os()) texte_center(str(position[1] // 10), 50, 204, (255, 255, 255), col_os()) texte_center(str(score), 100, 204, (255, 255, 255), col_os()) # Afficher le score par ex def collision(): '''on vérifie les colisions, si colisions, on retourne False, sinon True On teste mvt[0] et mvt[1] ''' # Rocher if get_pixel(mvt[0], mvt[1]) == (40, 40, 40): info(10) texte_center("rock", 160, 204, (255, 255, 255), col_os()) return False # Trou elif get_pixel(mvt[0], mvt[1]) == (192, 196, 192): info(32) texte_center("hole", 160, 204, (255, 255, 255), col_os()) return False # texte_center(str(get_pixel(mvt[0], mvt[1])), 80, 2, (120,120,120)) return True def game(): '''gère les actions sur les touches''' global score, position, mvt bordure = (2, 2, 192, 302) # x min, x max, y min, y max win = False creuse = False while not keydown(5) and not win and score > 0: is_key_pressed = False if keydown(1): # fleche haut mvt[1] = max(position[1] - 10, bordure[1]) mvt[0] = position[0] is_key_pressed = True sleep(0.120) elif keydown(2): # fleche bas mvt[1] = min(position[1] + 10, bordure[2]) mvt[0] = position[0] is_key_pressed = True sleep(0.120) elif keydown(3): # fleche Droite mvt[0] = min(position[0] + 10, bordure[3]) mvt[1] = position[1] is_key_pressed = True sleep(0.120) elif keydown(0): # fleche Gauche mvt[0] = max(position[0] - 10, bordure[0]) mvt[1] = position[1] is_key_pressed = True sleep(0.120) elif keydown(4) or keydown(52): # Touche OK if position[0] == tresor[0] and position[1] == tresor[1]: texte_center("win !", 160, 204, (255, 255, 255), col_os()) win = True else: texte_center("nothing", 160, 204, (255, 255, 255), col_os()) info(32) distance = int(sqrt((position[0]//10 - tresor[0]//10) ** 2 + (position[1]//10 - tresor[1]//10) ** 2)) texte_center(str(bin(distance)[2:]), 250, 204, (255, 255, 255), col_os()) sleep(0.666) creuse = True sleep(0.120) if is_key_pressed and collision(): personnage(0) if creuse == True: for j in range(4): fill_rect(position[0] + j, position[1] + j, 10 - 2 * j, 10 - 2 * j, (196 - j * 32, 196 - j * 32, 196 - j * 32)) creuse = False position[0] = mvt[0] position[1] = mvt[1] personnage(1) info(1) if score < 1: fill_rect(80, 60, 160, 80, col_os()) texte_center("You have loose", 160, 92, (255, 255, 255), col_os()) if score > 1: fill_rect(80, 60, 160, 80, col_os()) texte_center("You have won", 160, 80, (255, 255, 255), col_os()) texte_center("score = " + str(score), 160, 105, (255, 255, 255), col_os()) def play(nb): global position, mvt, score, tresor while nb > 0: position = [2, 2] mvt = [2, 2] score = 666 tresor = [0, 0] info(0, 1) start() wait() info() game() nb -= 1 wait() play(1)