← Retour au Portfolio

🗡️ Zelda II: The Adventure of Link

A Python Terminal-Based RPG Adventure

Un hommage à la célèbre franchise Zelda, recréé entièrement en Python avec des graphismes ASCII et des séquences d'échappement ANSI pour une expérience rétro authentique dans votre terminal.

Python 3 Terminal Game ASCII Art RPG Open Source
Voir sur GitHub
La carte du jeu, dessinée en caractères dans le terminal et jouable directement dans le navigateur.
🎮 Jouable dans le navigateur — emulation Pyodide (Python/WebAssembly), sans installation
Jouer →

📖 À propos du projet

Ce projet est une recréation du jeu classique "Zelda 2: The Adventure of Link" développé entièrement en Python. Le jeu utilise le terminal comme interface, avec des graphismes ASCII colorés et des animations en temps réel.

🎮 Gameplay Complet

Système de combat, exploration de carte, rencontres aléatoires, NPCs interactifs et boss à affronter.

🗺️ Monde Ouvert

Explorez différents biomes : plaines, forêts, déserts, grottes, temples et palais.

⚔️ Système RPG

Leveling, stats (vie, mana, attaque), objets à collecter et quêtes à accomplir.

🎨 ASCII Art

Graphismes ASCII détaillés avec couleurs ANSI pour une expérience visuelle rétro.

👾 Monstres Variés

Différents types d'ennemis avec des comportements d'IA uniques.

💬 NPCs Interactifs

Dialogues, quêtes secondaires et système de récompenses.

🎬 Prévisualisation du Jeu

Écran de Démarrage
-------------------------------------------------------------------------------- Hi Welcome In Zelda II The Adventure Of Link The goal is to save the population of Hyrule By Ganondorf the scourge Tap your player name --------------------------------------------------------------------------------
Carte du Monde
###############-- -- ###############-- -------------- --- ###############-- -----~~~~~~~~~~~~--- ---~~-- ################-------~~~~~~~###~~~~~~~--- ---~~~~-- ###################~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--- --~~~~P~-- ## ##############~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--- ~~~~~~-- ## V #############~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--- ~~~~~~~~-- ## #########~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-- ~~~ttt~~~-- ## #######~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--- ~~~~~~-- ## ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~-- --~~~tt~~-- ## ########ttttttttt ~~~~~~~~~~~~777777~~~-------~~tt~~~~-- ## ########tttttttttttttt ~~~~~~~77777777777----######A###~~~-- ## ########ttttttttttttttt ~~~777777777t777################~~--

Commandes : ZQSD pour se déplacer sur la carte | QD + Espace pour les combats | M pour attaquer | C pour s'accroupir | Entrée pour interagir avec les NPCs

💻 Extraits de Code

Système de Joueur (Player.py)

import os
import sys

class Player: pass

def create(Name):
    player = Player()
    player.name = Name
    player.level = {"Player_xp": 0, "Xp_for_new_level": 50}
    player.stats = {"Life": 5, "Mana": 5, "Attack": 5}
    player.items = {"Candle": 0, "O": 0, "Village1_statue": 0}
    player.life = 20 * player.stats["Life"]
    player.active_life = player.life
    player.attack = 2 * player.stats["Attack"]
    player.pos = [26, 27]
    player.in_fight = False
    return player

Boucle de Jeu Principale (main.py)

def run(data):
    # Boucle de simulation principale
    while 1:
        interact(data)  # Gestion des entrées clavier
        show(data)      # Affichage du jeu
        live(data)      # Logique du jeu (IA, physics, etc.)
        time.sleep(data['timeStep'])

def interact(data):
    if is_data():
        KeyEnter = sys.stdin.read(1)

        if KeyEnter == 'q':
            new_pos = (pos[0], pos[1] - 1)
        elif KeyEnter == 'd':
            new_pos = (pos[0], pos[1] + 1)
        elif KeyEnter == 'm':
            Player.set_attack_cd(data['player'], 5)

Système de Rencontres Aléatoires

# Détection des rencontres aléatoires dans les plaines
if cara_on_new_pos == '7':
    Encounter = random.randint(0, 100)
    if Encounter > 100 - data['Encounter_Chance']:
        # Création des monstres
        Mons1 = Monster.create("Blob", "W", 20, [10, 14], 30, 25, 1)
        Mons2 = Monster.create("Humanoid", "T", 20, [10, 28], 40, 30, 2)
        data['monster_list'] = [Mons1, Mons2]
        Player.set_fight(data['player'], True)

🛠️ Technologies Utilisées

Python 3
termios (Linux/Unix)
sys & os modules
ANSI Escape Sequences
ASCII Graphics
OOP (Object-Oriented)

Architecture du Projet

Projet IPI 2024/
├── main.py              # Point d'entrée et boucle de jeu principale
├── Player.py            # Gestion du joueur (stats, inventaire, mouvement)
├── Monster.py           # Système de monstres et IA ennemie
├── PNJ.py               # NPCs et système de dialogue
├── Background.py        # Gestion des cartes et affichage
├── Map.txt              # Carte du monde principal
├── Temple.txt           # Carte du temple de départ
├── Forest.txt           # Arène de combat en forêt
├── Desert.txt           # Arène de combat dans le désert
├── Cave*.txt            # Différentes grottes avec objets
├── Town1.txt / Town2.txt  # Villages avec NPCs
├── Palace*.txt          # Palais final avec boss
└── Readme.txt           # Instructions du jeu

⚙️ Fonctionnalités Techniques

🎯 Gestion des Inputs

Lecture des touches en temps réel avec termios et tty pour une expérience fluide.

🎨 Rendu ANSI

Utilisation des séquences d'échappement ANSI pour les couleurs et le positionnement du curseur.

🤖 Intelligence Artificielle

IA simple pour les monstres qui poursuivent le joueur et gèrent les collisions.

💾 Système de Données

Structure de données complète pour gérer l'état du jeu, les stats et l'inventaire.

🗺️ Chargement de Cartes

Système modulaire de chargement de cartes depuis des fichiers texte.

🎮 Mode Admin

Commandes de débogage pour tester rapidement différentes parties du jeu.

🚀 Comment Lancer le Jeu

Prérequis

Installation et Lancement

# Cloner le repository
git clone https://github.com/MateoBourdin/ZeldaProject.git

# Naviguer dans le dossier du projet
cd ZeldaProject/"Projet IPI 2024"

# Lancer le jeu
python3 main.py

Pour Windows (WSL)

# Installer WSL
wsl --install

# Une fois dans WSL
cd /mnt/p/S1/Zelda/"Projet IPI 2024"
python3 main.py

🎓 Défis Techniques Relevés

🖥️ Rendu Terminal en Temps Réel

Gestion de l'affichage avec les séquences d'échappement ANSI pour positionner le curseur et afficher des graphismes colorés dans le terminal sans bibliothèque externe.

⌨️ Input Non-Bloquant

Utilisation de termios et select pour lire les entrées clavier sans bloquer la boucle de jeu, permettant une réactivité en temps réel.

🎮 Physique de Plateforme

Implémentation d'un système de gravité, de sauts et de collisions pour les combats en side-scrolling.

🗺️ Système de Monde Ouvert

Transition fluide entre la carte du monde et les scènes de combat, avec sauvegarde de position et gestion des différents biomes.

🌟 Découvrez le Code Source

Le projet complet est disponible sur GitHub avec tout le code source, les assets et la documentation.

Explorer le Repository GitHub