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)

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 <a href="https://www.numworks.com/legal/cookies-policy/">cookies policy</a>.