mastermind.py

Created by arthurjacquin

Created on July 10, 2021

2.62 KB


# Mastermind - August 2020
# Arthur Jacquin (arthur@jacquin.xyz)
# https://github.com/arthur-jacquin/numworks-games

# Modules
from ion import keydown
from kandinsky import *
from random import randint

# Colors
COL = ((255, 63, 63), (255, 128, 0), (255, 255, 0), (46, 184, 46), (51, 153, 255), (153, 102, 255))

# Interface drawing
draw_string('MASTERMIND', 110, 5)
draw_string('Keys', 6+10, 35)
draw_string('Decoding board', 74+50, 35)
draw_string('Review', 6, 135+12)
for col in range(6):
    fill_rect(6+20*(col%3)+1, 55+20*(col > 2)+1, 18, 18, COL[col])
    draw_string(str(col+1), 6+20*(col%3)+5, 55+20*(col > 2)+1, (0,)*3, COL[col])
fill_rect(6+1, 95+1, 58, 18, (200,)*3)
draw_string('DEL', 6+15, 95+1, (0,)*3, (200,)*3)
fill_rect(6+1, 115+1, 58, 18, (200,)*3)
draw_string('EXE', 6+15, 115+1, (0,)*3, (200,)*3)

def wait(buttons): # Wait for keypress
    while True:
        for i in buttons:
            if keydown(i):
                while keydown(i): pass
                return i

while True:
    # Initialisation
    code = [randint(0,5) for i in range(4)]
    row = 0
    draw_string('Guess :', 80, 190)

    # Main loop
    while True:
        guess = []
        while True:
            k = wait((42, 43, 44, 36, 37, 38, 17, 52))
            if k == 52:
                if len(guess)!=4: continue
                break
            elif k == 17:
                if len(guess)==0: continue
                guess = guess[:-1]
                draw_string('  ', 160+20*len(guess), 190)
            else:
                if len(guess)==4: continue
                number = 1*(k==42)+2*(k==43)+3*(k==44)+4*(k==36)+5*(k==37)+6*(k==38)
                guess.append(number-1)
                fill_rect(142+20*len(guess), 191, 16, 16, COL[guess[-1]])
        draw_string(' '*8, 160, 190)
        for i in range(4): fill_rect(74+2+20*row, 55+20*i+2, 16, 16, COL[guess[i]])
        correct = sum([guess[i] == code[i] for i in range(4)])
        misplac, mirr = -1*correct, code[:]
        for i in range(4):
            if guess[i] in mirr:
                misplac += 1
                mirr.remove(guess[i])
        draw_string(str(misplac), 79+20*row, 137)
        draw_string(str(correct), 79+20*row, 157)
        if guess == code or row == 11:
            draw_string(' '*8, 80, 190)
            if guess == code: draw_string('You won in '+str(row+1)+' guesses !', 55, 180)
            else: draw_string('You lost !', 110, 180)
            draw_string('(Press OK to restart)', 55, 200)
            while not(keydown(4)): pass
            fill_rect(0, 180, 320, 40, (255,)*3)
            fill_rect(74, 55, 240, 120, (255,)*3)
            break
        else: row += 1

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.