DE EN

PyBuddy CLI

Das Abschlussprojekt — alle gelernten Konzepte in einem interaktiven Assistenten

🕐 90 Min 🏆 Abschlussprojekt Python 3.10+

Was erwartet dich?

In diesem Projekt baust du PyBuddy CLI — einen interaktiven Kommandozeilen-Assistenten, der alle Konzepte aus den 13 Kapiteln vereint. Am Ende hast du ein vollständiges Programm, das du stolz in dein Portfolio stellen kannst.

Projektübersicht

PyBuddy CLI ist ein persönlicher Assistent im Terminal. Er begrüßt den Nutzer, speichert ein Profil, führt kleine Tools aus und merkt sich alles in einer JSON-Datei. Das Projekt nutzt alle Kapitel-Konzepte:

Kapitel 01: Variablen für Nutzername, Level, XP
Kapitel 02: input() und f-Strings für die Begrüßung
Kapitel 03: Operatoren für XP-Berechnungen
Kapitel 04: Bedingungen für Menü-Entscheidungen
Kapitel 05: while-Schleife für das Hauptmenü
Kapitel 06: Listen für Aufgaben und Badges
Kapitel 07: Dictionary für das Nutzerprofil
Kapitel 08: Funktionen für alle Tools
Kapitel 09: Module (datetime, json, random)
Kapitel 10: JSON-Datei zum Speichern des Profils
Kapitel 11: Optional: Wetter-API-Integration
Kapitel 12: KI-gestützte Code-Review deines Projekts

Anforderungen

Dein PyBuddy CLI muss folgende Features haben. Arbeite die Punkte Schritt für Schritt ab:

  1. Begrüßung: Fragt nach dem Namen und begrüßt den Nutzer personalisiert.

  2. Profil-System: Speichert Name, Level, XP und Badges in einem Dictionary.

  3. Hauptmenü: Zeigt ein Menü mit Optionen und wiederholt sich bis "exit".

  4. XP-Rechner: Berechnet Gesamt-XP aus Basis-XP, Multiplikator und Bonus.

  5. To-Do-Liste: Aufgaben hinzufügen, anzeigen und erledigen.

  6. Zufalls-Zitat: Zeigt ein zufälliges motivierendes Zitat aus einer Liste.

  7. Speichern & Laden: Profil als JSON speichern und beim Start wieder laden.

Schritt für Schritt

Schritt 1: Projektstruktur

Erstelle einen Ordner pybuddy-cli/ mit zwei Dateien:

bash
pybuddy-cli/
├── main.py          # Hauptprogramm
└── profil.json      # Wird automatisch erstellt

Schritt 2: Die Grundstruktur

Beginne mit den Imports und der Profil-Verwaltung:

python
import json
import random
from datetime import datetime

PROFIL_DATEI = "profil.json"

ZITATE = [
    "Jeder Experte war mal ein Anfänger.",
    "Code ist wie Humor — wenn man ihn erklären muss, ist er schlecht.",
    "Der beste Weg, Python zu lernen: Tippen, nicht nur Lesen!",
    "Fehler sind keine Fehler — sie sind Debugging-Gelegenheiten.",
    "Ein Programm, das läuft, ist besser als ein perfektes, das nicht existiert."
]

def profil_laden():
    """Lädt das Profil aus der JSON-Datei oder erstellt ein neues."""
    try:
        with open(PROFIL_DATEI, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return {
            "name": "",
            "level": 1,
            "xp": 0,
            "badges": ["PyBuddy Nutzer"],
            "aufgaben": []
        }

def profil_speichern(profil):
    """Speichert das Profil als JSON."""
    with open(PROFIL_DATEI, "w", encoding="utf-8") as f:
        json.dump(profil, f, indent=2, ensure_ascii=False)

Schritt 3: Die Tool-Funktionen

Jedes Menü-Feature wird als eigene Funktion umgesetzt:

python
def zeige_status(profil):
    """Zeigt das aktuelle Profil an."""
    print(f"\n{'='*30}")
    print(f"  👤  {profil['name']}")
    print(f"  🏆  Level {profil['level']}")
    print(f"  ⭐  {profil['xp']} XP")
    print(f"  🎖️  Badges: {', '.join(profil['badges'])}")
    print(f"{'='*30}\n")

def xp_rechner(profil):
    """Berechnet neue XP und prüft auf Level-Up."""
    basis = int(input("Basis-XP: "))
    mult = float(input("Multiplikator (z.B. 1.5): "))
    bonus = int(input("Bonus-XP: "))
    
    neu = int(basis * mult + bonus)
    profil["xp"] += neu
    
    # Level-Up alle 500 XP
    neues_level = profil["xp"] // 500 + 1
    if neues_level > profil["level"]:
        profil["level"] = neues_level
        badge = f"Level {neues_level}"
        if badge not in profil["badges"]:
            profil["badges"].append(badge)
        print(f"🎉 Level-Up! Du bist jetzt Level {neues_level}!")
    
    print(f"➕ +{neu} XP erhalten!")
    print(f"⭐ Gesamt: {profil['xp']} XP")

def todo_manager(profil):
    """Verwaltet die To-Do-Liste."""
    print("\n📋 To-Do-Manager")
    print("[1] Aufgabe hinzufügen")
    print("[2] Aufgaben anzeigen")
    print("[3] Aufgabe erledigen")
    wahl = input("Wahl: ")
    
    if wahl == "1":
        task = input("Neue Aufgabe: ")
        profil["aufgaben"].append({"text": task, "done": False})
        print("✅ Hinzugefügt!")
    elif wahl == "2":
        if not profil["aufgaben"]:
            print("ℹ️ Keine Aufgaben vorhanden.")
        for i, task in enumerate(profil["aufgaben"], 1):
            status = "✓" if task["done"] else "□"
            print(f"  {i}. {status} {task['text']}")
    elif wahl == "3":
        nr = int(input("Nummer der erledigten Aufgabe: "))
        if 1 <= nr <= len(profil["aufgaben"]):
            profil["aufgaben"][nr-1]["done"] = True
            profil["xp"] += 10
            print("✅ Erledigt! +10 XP")

def zufalls_zitat():
    """Zeigt ein zufälliges Zitat."""
    print(f"\n💬 {random.choice(ZITATE)}\n")

def uhrzeit_anzeigen():
    """Zeigt die aktuelle Uhrzeit."""
    jetzt = datetime.now()
    print(f"🕐 {jetzt.strftime('%H:%M:%S')} — {jetzt.strftime('%d.%m.%Y')}")

Schritt 4: Das Hauptmenü

Das Herzstück: Eine while-Schleife, die das Menü anzeigt und die Eingabe verarbeitet:

python
def hauptmenue(profil):
    """Zeigt das Hauptmenü und verarbeitet die Eingabe."""
    while True:
        print(f"\n{'='*30}")
        print(f"  🤖  PyBuddy CLI")
        print(f"  Hallo, {profil['name']}!")
        print(f"{'='*30}")
        print("  [1] 👤  Profil anzeigen")
        print("  [2] ➕  XP berechnen")
        print("  [3] 📋  To-Do-Manager")
        print("  [4] 💬  Zufalls-Zitat")
        print("  [5] 🕐  Uhrzeit")
        print("  [0] 🚪  Beenden")
        print(f"{'='*30}")
        
        wahl = input("\nWähle (0-5): ").strip()
        
        if wahl == "0":
            profil_speichern(profil)
            print(f"💾 Profil gespeichert. Bis bald, {profil['name']}!")
            break
        elif wahl == "1":
            zeige_status(profil)
        elif wahl == "2":
            xp_rechner(profil)
        elif wahl == "3":
            todo_manager(profil)
        elif wahl == "4":
            zufalls_zitat()
        elif wahl == "5":
            uhrzeit_anzeigen()
        else:
            print("⚠️ Ungültige Eingabe. Bitte 0-5.")

Schritt 5: Der Einstiegspunkt

Verbinde alles in der main()-Funktion:

python
def main():
    print("🤖 Willkommen bei PyBuddy CLI!")
    
    profil = profil_laden()
    
    # Erster Start?
    if not profil["name"]:
        profil["name"] = input("Wie heißt du? ").strip()
        print(f"\n👋 Hallo {profil['name']}! Schön, dass du da bist.")
        profil_speichern(profil)
    else:
        print(f"\n👋 Willkommen zurück, {profil['name']}!")
    
    hauptmenue(profil)

if __name__ == "__main__":
    main()

Das komplette Programm

Hier ist der gesamte Code in einer Datei. Kopiere ihn in main.py und starte ihn mit python main.py:

python
"""
PyBuddy CLI — Abschlussprojekt Python Classic
Alle 13 Kapitel vereint in einem interaktiven Assistenten.
"""
import json
import random
from datetime import datetime

PROFIL_DATEI = "profil.json"

ZITATE = [
    "Jeder Expert*innen war mal ein*e Anfänger*in.",
    "Code ist wie Humor — wenn man ihn erklären muss, ist er schlecht.",
    "Der beste Weg, Python zu lernen: Tippen, nicht nur Lesen!",
    "Fehler sind keine Fehler — sie sind Debugging-Gelegenheiten.",
    "Ein Programm, das läuft, ist besser als ein perfektes, das nicht existiert."
]

# ── Profil-Verwaltung ───────────────────────────────
def profil_laden():
    try:
        with open(PROFIL_DATEI, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return {
            "name": "", "level": 1, "xp": 0,
            "badges": ["PyBuddy Nutzer"], "aufgaben": []
        }

def profil_speichern(profil):
    with open(PROFIL_DATEI, "w", encoding="utf-8") as f:
        json.dump(profil, f, indent=2, ensure_ascii=False)

# ── Tool-Funktionen ─────────────────────────────────
def zeige_status(profil):
    print(f"\n{'='*35}")
    print(f"  Profil: {profil['name']}")
    print(f"  Level {profil['level']}  |  {profil['xp']} XP")
    print(f"  Badges: {', '.join(profil['badges'])}")
    print(f"  Aufgaben: {len(profil['aufgaben'])}")
    print(f"{'='*35}\n")

def xp_rechner(profil):
    basis = int(input("Basis-XP: "))
    mult = float(input("Multiplikator: "))
    bonus = int(input("Bonus: "))
    neu = int(basis * mult + bonus)
    profil["xp"] += neu
    neues_level = profil["xp"] // 500 + 1
    if neues_level > profil["level"]:
        profil["level"] = neues_level
        profil["badges"].append(f"Level {neues_level}")
        print(f">>> Level-Up! Level {neues_level}!")
    print(f">>> +{neu} XP | Gesamt: {profil['xp']}")

def todo_manager(profil):
    print("\n--- To-Do-Manager ---")
    print("[1] Hinzufügen  [2] Anzeigen  [3] Erledigen")
    wahl = input("Wahl: ")
    if wahl == "1":
        profil["aufgaben"].append({"text": input("Aufgabe: "), "done": False})
        print("Hinzugefügt!")
    elif wahl == "2":
        for i, t in enumerate(profil["aufgaben"], 1):
            s = "[x]" if t["done"] else "[ ]"
            print(f"  {i}. {s} {t['text']}")
    elif wahl == "3":
        nr = int(input("Nummer: "))
        profil["aufgaben"][nr-1]["done"] = True
        profil["xp"] += 10
        print("Erledigt! +10 XP")

def zufalls_zitat():
    print(f"\n>>> {random.choice(ZITATE)}\n")

def uhrzeit_anzeigen():
    j = datetime.now()
    print(f">>> {j.strftime('%H:%M:%S')} — {j.strftime('%d.%m.%Y')}")

# ── Hauptmenü ───────────────────────────────────────
def hauptmenue(profil):
    while True:
        print(f"\n{'='*35}")
        print(f"  PyBuddy CLI — {profil['name']}")
        print(f"{'='*35}")
        print("  [1] Profil    [2] XP-Rechner")
        print("  [3] To-Do     [4] Zitat")
        print("  [5] Uhrzeit   [0] Beenden")
        print(f"{'='*35}")
        wahl = input("Wähle (0-5): ").strip()
        
        if wahl == "0":
            profil_speichern(profil)
            print(f"Gespeichert. Tschüss, {profil['name']}!")
            break
        elif wahl == "1": zeige_status(profil)
        elif wahl == "2": xp_rechner(profil)
        elif wahl == "3": todo_manager(profil)
        elif wahl == "4": zufalls_zitat()
        elif wahl == "5": uhrzeit_anzeigen()
        else: print("Ungültig. Bitte 0-5.")

# ── Start ───────────────────────────────────────────
def main():
    print("=== PyBuddy CLI ===")
    profil = profil_laden()
    if not profil["name"]:
        profil["name"] = input("Wie heißt du? ").strip()
        print(f"Hallo {profil['name']}!")
        profil_speichern(profil)
    else:
        print(f"Willkommen zurück, {profil['name']}!")
    hauptmenue(profil)

if __name__ == "__main__":
    main()

Erweiterungsideen

Dein PyBuddy CLI ist fertig — aber du kannst es noch weiter ausbauen. Hier sind Ideen, die du mit den Kapitel-Konzepten umsetzen kannst:

Wetter-Integration: Rufe mit requests das aktuelle Wetter ab (Kapitel 11)
Zahlenraten: Baue das Spiel aus Kapitel 5 als Menüpunkt ein
Statistiken: Zeige XP-Verlauf als Diagramm mit matplotlib
Passwort-Generator: Erstelle sichere Passwörter mit random
Notizbuch: Speichere Notizen als separate JSON-Dateien
Mehrere Profile: Verwalte mehrere Nutzer mit verschiedenen JSON-Dateien
🏆

🏆 Glückwunsch!

Du hast alle 13 Kapitel durchlaufen und ein vollständiges Python-Programm gebaut. Das ist mehr, als viele Programmierer in ihrem ersten Monat schaffen. Dein PyBuddy CLI nutzt Variablen, Bedingungen, Schleifen, Listen, Dictionaries, Funktionen, Module und File I/O — alles in einem Projekt. Zeig es deinen Freunden, erweitere es weiter und vor allem: Programmiere weiter!