#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Connect Four (Puissance 4) — jeu console pour 2 joueurs
Usage: python connect4.py
Auteur: généré par ChatGPT pour Le J
"""

import os
import time

ROWS = 6
COLS = 7
EMPTY = "."

# Symbols for players
PLAYER_SYMBOLS = ["X", "O"]

def clear():
    os.system("cls" if os.name == "nt" else "clear")

def make_board():
    return [[EMPTY for _ in range(COLS)] for _ in range(ROWS)]

def print_board(board):
    clear()
    # header with column numbers
    print("  " + " ".join(str(i+1) for i in range(COLS)))
    for row in board:
        print(" |" + "|".join(row) + "|")
    print("-" * (COLS * 2 + 3))

def is_valid_col(board, col):
    return 0 <= col < COLS and board[0][col] == EMPTY

def drop_piece(board, col, symbol, animate=True):
    # find the lowest empty row
    for r in range(ROWS-1, -1, -1):
        if board[r][col] == EMPTY:
            if animate:
                # small drop animation (textual)
                for step in range(r+1):
                    # draw a temporary board with the piece at current step
                    temp = [row[:] for row in board]
                    temp[step][col] = symbol
                    print_board(temp)
                    time.sleep(0.03)
                # final position
            board[r][col] = symbol
            return r, col
    return None

def check_direction(board, start_r, start_c, dr, dc, symbol):
    count = 0
    r, c = start_r, start_c
    # go backwards
    while 0 <= r < ROWS and 0 <= c < COLS and board[r][c] == symbol:
        count += 1
        r -= dr
        c -= dc
    # go forward (excluding start)
    r, c = start_r + dr, start_c + dc
    while 0 <= r < ROWS and 0 <= c < COLS and board[r][c] == symbol:
        count += 1
        r += dr
        c += dc
    return count

def is_winner(board, r, c, symbol):
    # check horizontal (0,1), vertical (1,0), diag up-right (1,1), diag down-right (1,-1)
    directions = [(0,1), (1,0), (1,1), (1,-1)]
    for dr, dc in directions:
        if check_direction(board, r, c, dr, dc, symbol) >= 4:
            return True
    return False

def board_full(board):
    return all(cell != EMPTY for cell in board[0])

def ask_column(player):
    while True:
        choice = input(f"Joueur {player+1} ({PLAYER_SYMBOLS[player]}), choisis une colonne (1-{COLS}) ou 'q' pour quitter: ").strip()
        if choice.lower() == 'q':
            return "q"
        if not choice.isdigit():
            print("Entrée invalide — entre un numéro.")
            continue
        col = int(choice) - 1
        if col < 0 or col >= COLS:
            print(f"Choisis une colonne entre 1 et {COLS}.")
            continue
        return col

def main():
    print("=== Connect Four (Puissance 4) — 2 joueurs ===")
    print("Règles rapides : place ton jeton dans une colonne ; il tombe tout en bas ou sur le dernier jeton.")
    print("Le premier qui aligne 4 jetons de suite (horizontale, verticale ou diagonale) gagne.")
    print("Appuie sur Entrée pour commencer...")
    input()
    while True:
        board = make_board()
        current = 0  # joueur 0 commence
        winner = None

        print_board(board)
        while True:
            col = ask_column(current)
            if col == "q":
                print("Partie quittée. À plus !")
                return
            if not is_valid_col(board, col):
                print("Colonne pleine ou invalide, choisis-en une autre.")
                time.sleep(0.7)
                continue

            # drop piece (with animation)
            r, c = drop_piece(board, col, PLAYER_SYMBOLS[current], animate=True)
            print_board(board)

            # check win
            if is_winner(board, r, c, PLAYER_SYMBOLS[current]):
                winner = current
                break

            # check draw
            if board_full(board):
                break

            # next player
            current = 1 - current

        if winner is not None:
            print(f"🎉 Joueur {winner+1} ({PLAYER_SYMBOLS[winner]}) a gagné ! Bravo !")
        else:
            print("Match nul — le tableau est plein.")

        # play again?
        again = input("Rejouer ? (o/n) : ").strip().lower()
        if again not in ("o", "oui", "y", "yes"):
            print("Merci d'avoir joué — à la prochaine !")
            break

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\nInterrompu — bye !")
