1)Présentation du problème

Nous allons nous intéresser au déplacement du Cavalier sur l’échiquier.

L’objectif est de placer le cavalier sur une case aléatoire et d’effectuer des sauts en passant une fois et une seule sur toutes les cases de l’échiquier.

Ce problème du cavalier, appelé également problème du Cavalier d’Euler, du nom du mathématicien Suisse Leonhard Euler (1707-1783), est un célèbre casse-tête de logique dont les premières solutions connues sont présentées par deux Indiens Ratnakara et Rudrata dans un ouvrage écrit en 850. C’est à cette même époque que al-Adli ar-Rumi, très grand joueur d’échecs arabe, en donne également une solution.

Au début du 17ième siècle, Pierre Rémond de Montmort pose les bases d’une réflexion mathématique reprise et développée par Euler. En 1759 il en propose une réelle version scientifique.

On réalisera par la suite une interface graphique avec la librairie pygame

2) Gestion de projet

12 siècles d’histoire !

Corrigé

import random
import pandas as pd
from IPython.display import display

# Constantes
SAUTS = ((2, 1), (1, 2), (-1, 2), (-2, 1), (-2, -1), (-1, -2), (1, -2), (2, -1))


# Initialisation de l'échiquier
echiquier = [[0 for _ in range(8)] for _ in range(8)]

def afficher_echiquier():
    """Affiche l'échiquier sous forme de DataFrame."""
    df = pd.DataFrame(echiquier)
    display(df)

def jouer(ligne, colonne, coup):
    """Joue un coup à la position (ligne, colonne)."""
    echiquier[ligne][colonne] = coup

def est_possible(l0, c0, l1, c1):
    """Vérifie si le mouvement de (l0, c0) à (l1, c1) est possible."""
    return (
        0 <= l1 < 8 and 0 <= c1 < 8 and echiquier[l1][c1] == 0 and (l0 - l1, c0 - c1) in SAUTS
    )

def compter_chemins(l0, c0):
    """Compte le nombre de mouvements possibles à partir de (l0, c0)."""
    return sum(est_possible(l0, c0, l0 + dx, c0 + dy) for dx, dy in SAUTS)

def est_game_over(l0, c0):
    """Vérifie si la partie est terminée."""
    return compter_chemins(l0, c0) == 0

# Initialisation aléatoire de la position de départ
l0, c0 = random.randint(0, 7), random.randint(0,7)

coup = 1
print(f"Coup n° {coup}")
jouer(l0, c0, "♞")
afficher_echiquier()

continuer = True
lt, ct = l0, c0
while continuer:
    if est_game_over(lt, ct):
        print("Game Over")
        continuer = False
    else:
        lt1 = int(input("Numéro de ligne ?  "))
        ct1 = int(input("Numéro de colonne ?  "))
        while not est_possible(lt, ct, lt1, ct1):
            print("Déplacement invalide. Essayez encore.")
            lt1 = int(input("Numéro de ligne ?  "))
            ct1 = int(input("Numéro de colonne ?  "))
        
        coup += 1
        jouer(lt1, ct1, coup)
        print(f"Coup n° {coup}")
        lt, ct = lt1, ct1
        afficher_echiquier()

Vous retrouverez le code complet du jeu sans l’interface graphique dans votre fichier capytale .

Vous trouverez aussi une initiation à pygame qui ne sera jamais évaluée.

Il n’y a pas de connaissance à avoir sur la librairie pandas.

https://capytale2.ac-paris.fr/web/c/e12e-5556713

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *