carre_magique.py

Created by schraf

Created on June 30, 2023

1.51 KB

Explications en vidéo

Version pour TI-83 Plus , TI-84 Plus, TI-84 Pocket. Mettre le programme sur la calculatrice puis le lancer en faisant 2nde CATALOG Asm( PRGM MERLIN. Vous avez à l’écran Asm(prgmMERLIN puis ENTER

Version pour HP Prime

Il s’agit de la réécriture de “carré magique” qui existait sur un jeu électronique de 1978 nommé MERLIN.

La règle est simple :

  • 9 points sont allumés (noir) ou éteints (gris)
  • Dans la version normale, vous devez allumer tous les points sauf le central (touche 5 du clavier)
  • Les touches 1,3,7 ou 9 du clavier inversent les 4 points d'un côté (un point allumé s'éteint et inversement). Par exemple la touche 1 inverse les points 1,2,4 et 5
  • Les touches 2,4,6 et 8 inversent les 3 points d'une rangée. Par exemple la touche 2 va inverser la rangée 1-2-3
  • La touche 5 inverse les points suivant une croix (2,4,5,6 et 8)

Une fois que vous serez à l’aise avec la version de base, tentez >> go(2)


from random import *
from kandinsky import *
from ion import *
from time import *

T = [432,448,216,292,186,73,54,7,27]
NR, GR = (0,0,0), (230,230,230)
TOUCHES = [KEY_ZERO,KEY_ONE,KEY_TWO,KEY_THREE,KEY_FOUR,KEY_FIVE,KEY_SIX,KEY_SEVEN,KEY_EIGHT,KEY_NINE]

def binaire(p):
  return ("0"*8 + bin(p)[2:])[-9:]

def grille():
  for c in [70, 140]:
   fill_rect(c, 5, 1, 215, GR)
   fill_rect(0, c, 210, 1, GR)

def dessin(p, x = 31, y = 176, t = 70, w = 10):
  b = binaire(p)
  for c in range(9):
    coul = NR if b[c] == "1" else GR
    fill_rect(x + t * (c%3), y - t * (c//3), w, w, coul)
  sleep(0.2)
  
def solution(d, g):
  for p in range(512):
    r, b = d, binaire(p)
    for c in range(9):
      if b[c] == "1": r ^= T[c]
    if r == g: break
  sol = ""
  for c in range(9):
    if b[c] == "1": sol += str(c+1)
  draw_string(sol[:5], 240, 160)  
  draw_string(sol[5:], 240, 180)
  return len(sol)
  
def go(n = 1): 
  GA = 495 if n == 1 else randint(0, 511)
  dessin(GA, 270, 30, 10, 5)
  pos = GA
  grille()
  cp = 0
  while pos == GA: pos = randint(0, 511)
  depart = pos
  while pos != GA:
   dessin(pos)
   wait = True
   while wait:
     for (i, t) in enumerate(TOUCHES):
      if keydown(t): 
        n = i
        wait = False
   if n == 0:
     cp, pos = 0, depart
     dessin(pos)
     solution(pos, GA)
   else:
     cp += 1
     pos ^= T[n - 1]
  if n > 0:
    draw_string("GAGNE !", 230, 85)
    best = solution(depart, GA)
    sc = int(100 * best / cp)
    draw_string(str(sc) + "%", 235, 110)
  dessin(GA)