treasure.py

Created by lorem-ipsum-42

Created on April 28, 2021

6.84 KB

𝗧𝗿𝗲𝗮𝘀𝘂𝗿𝗲


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)