# ########################################################################### # Projet : Chifoumi # Version 2 : code source corrigé et optimisé par l'IA ChatGPT # Programmeurs : Amine, Chaïma, Moïse et ChatGPT # Mai 2026 # nsi.gecif.net # ########################################################################### from turtle import * from csv import writer # -------------------------------------------------- # CONFIGURATION # -------------------------------------------------- setup(800, 800) title("Jeu de dames") tracer(0) hideturtle() speed(0) TAILLE = 600 CASE = TAILLE // 10 DEMI = TAILLE // 2 # -------------------------------------------------- # CLASSES # -------------------------------------------------- class Case: def __init__(self, lettre, chiffre, x, y, couleur): self.lettre = lettre self.chiffre = chiffre self.x = x self.y = y self.couleur = couleur # 1 = noir, 0 = blanc self.present = None def dessiner(self): up() goto(self.x, self.y) down() fillcolor("black" if self.couleur else "white") begin_fill() for _ in range(4): fd(CASE) rt(90) end_fill() class Pion: def __init__(self, couleur, case): self.couleur = couleur self.case = case case.present = self def dessiner(self): x = self.case.x + CASE / 2 y = self.case.y - CASE + 10 up() goto(x, y) color(self.couleur) begin_fill() circle(20) end_fill() # -------------------------------------------------- # CREATION DU PLATEAU # -------------------------------------------------- cases = [] for ligne in range(10): lettre = chr(ord('a') + ligne) for colonne in range(10): chiffre = colonne + 1 x = DEMI - CASE * (colonne + 1) y = -DEMI + CASE * (ligne + 1) couleur = (ligne + colonne) % 2 c = Case(lettre, chiffre, x, y, couleur) cases.append(c) # -------------------------------------------------- # DESSIN DU PLATEAU # -------------------------------------------------- for c in cases: c.dessiner() # -------------------------------------------------- # AFFICHAGE DES COORDONNEES # -------------------------------------------------- for i in range(10): y = DEMI - CASE/2 - i*CASE up() goto(DEMI + 10, y) write(chr(ord('j') - i)) for i in range(10): x = -DEMI + CASE/2 + i*CASE up() goto(x, -DEMI - 20) write(10 - i) # -------------------------------------------------- # CREATION DES PIONS # -------------------------------------------------- pions = [] for c in cases: # pions gris if c.couleur == 1 and c.lettre in ('h', 'i', 'j'): pions.append(Pion("grey", c)) # pions blancs if c.couleur == 1 and c.lettre in ('a', 'b', 'c'): pions.append(Pion("white", c)) # -------------------------------------------------- # DESSIN DES PIONS # -------------------------------------------------- def redraw(): clear() for c in cases: c.dessiner() for i in range(10): y = DEMI - CASE/2 - i*CASE up() goto(DEMI + 10, y) write(chr(ord('j') - i)) for i in range(10): x = -DEMI + CASE/2 + i*CASE up() goto(x, -DEMI - 20) write(10 - i) for p in pions: p.dessiner() update() # -------------------------------------------------- # FONCTIONS UTILES # -------------------------------------------------- def trouver_case(x, y): for c in cases: if c.x <= x <= c.x + CASE and c.y - CASE <= y <= c.y: return c return None # -------------------------------------------------- # GESTION DES DEPLACEMENTS # -------------------------------------------------- pion_selectionne = None def cliquer(x, y): global pion_selectionne case = trouver_case(x, y) if case is None: return # sélection d'un pion if pion_selectionne is None: if case.present is not None: pion_selectionne = case.present print("Pion sélectionné") else: # case vide uniquement if case.present is None and case.couleur == 1: ancienne = pion_selectionne.case # déplacement diagonal dx = abs(ord(case.lettre) - ord(ancienne.lettre)) dy = abs(case.chiffre - ancienne.chiffre) if dx == 1 and dy == 1: ancienne.present = None pion_selectionne.case = case case.present = pion_selectionne pion_selectionne = None redraw() # -------------------------------------------------- # SAUVEGARDE # -------------------------------------------------- def sauvegarder(): with open("jeu_dames.csv", "w", newline="") as f: w = writer(f) for c in cases: contenu = "" if c.present: contenu = c.present.couleur w.writerow([c.lettre, c.chiffre, contenu]) print("Sauvegarde effectuée") # -------------------------------------------------- # INITIALISATION # -------------------------------------------------- redraw() onscreenclick(cliquer, 1) onkey(sauvegarder, "s") listen() done()