{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 274, "referenced_widgets": [ "1a6be648ee6a43dda4a2166fd5b55ad9", "8b1a4b9f188449b2a517defcebb98bec" ] }, "id": "P2yYMvGsL5nU", "outputId": "312bac3e-22a0-49eb-f1a4-abcd3f8eed08" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "Output()" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "1a6be648ee6a43dda4a2166fd5b55ad9" } }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "\n", "
\n", " 🎮 Commandes clavier — cliquez ici, puis utilisez ← ↑ ↓ →\n", "
Cliquez pour activer le clavier.
\n", "
\n", "\n" ] }, "metadata": {} } ], "source": [ "import os\n", "import random\n", "import ipywidgets as widgets\n", "from IPython.display import display, HTML, clear_output\n", "from google.colab import output\n", "\n", "# Zone réservée à la grille : on la réutilise à chaque déplacement.\n", "zone_grille = widgets.Output()\n", "\n", "\n", "# Taille de la grille (n lignes, m colonnes)\n", "n, m = 10, 10\n", "\n", "# Initialisation de la grille avec des murs (1), des ennemis (2), et une case de victoire (3)\n", "grille = [\n", " [0, 0, 0, 0, 1, 0, 0, 0, 2, 0],\n", " [1, 1, 0, 0, 1, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 0, 2, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0, 1, 1],\n", " [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],\n", " [0, 1, 0, 2, 1, 1, 0, 1, 1, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0, 2, 0],\n", " [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 1, 0, 1, 0, 0, 3] # Case de victoire (3) placée en bas à droite\n", "]\n", "\n", "# Position initiale du personnage\n", "x, y = 0, 0\n", "\n", "# Initialisation des ennemis (positions des '2' dans la grille)\n", "ennemis = [(i, j) for i in range(n) for j in range(m) if grille[i][j] == 2]\n", "\n", "# Case de victoire\n", "case_victoire = (9, 9) # Position de la case de victoire (ici en bas à droite)\n", "\n", "# Points de vie du joueur\n", "points = 10\n", "\n", "# Fonction pour afficher la grille avec un meilleur alignement\n", "def afficher_grille():\n", " clear_output(wait=True) # Efface uniquement le précédent tracé de la grille\n", " for i in range(n):\n", " for j in range(m):\n", " # Affichage du personnage (joueur)\n", " if i == x and j == y:\n", " print(\"\\U0001F600\", end=\" \") # 😀 icône pour le personnage\n", " # Affichage des murs\n", " elif grille[i][j] == 1:\n", " print(\"\\U0001F6A7\", end=\" \") # 🚧 icône pour le mur\n", " # Affichage des ennemis\n", " elif (i, j) in ennemis:\n", " print(\"\\U0001F47B\", end=\" \") # 👻 icône pour l'ennemi\n", " # Affichage de la case de victoire\n", " elif (i, j) == case_victoire:\n", " print(\"\\U0001F389\", end=\" \") # 🎉 icône pour la victoire\n", " else:\n", " print(\"⬜\", end=\" \") # □ icône pour une case vide\n", " print()\n", " print(f\"Points: {points}\")\n", "\n", "# Fonction pour vérifier si le déplacement est possible\n", "def peut_se_deplacer(nx, ny):\n", " global points, x ,y\n", " if nx < 0 or ny < 0 or nx >= n or ny >= m:\n", " print(\"Hors de la grille!\")\n", " return False\n", " if grille[nx][ny] == 1:\n", " print(\"Collision avec un mur!\")\n", " return False\n", " if (nx, ny) in ennemis:\n", " print(\"Collision avec un ennemi!\")\n", "\n", " x, y = 0, 0 # Remettre le personnage à la position initiale\n", " # gérer les PV par ici\n", " return False\n", " if (nx, ny) == case_victoire:\n", " print(\"Félicitations, vous avez gagné ! 🎉\")\n", " return True # Victoire !\n", " return True\n", "\n", "# Fonction pour vérifier si le déplacement est possible pour un ennemi\n", "def peut_se_deplacer_e(nx, ny):\n", " if nx < 0 or ny < 0 or nx >= n or ny >= m:\n", " return False\n", " if grille[nx][ny] == 1: # L'ennemi ne peut pas se déplacer sur un mur\n", " return False\n", " if (nx, ny) in ennemis:\n", " return False\n", " return True\n", "\n", "# Fonction pour déplacer le personnage\n", "def deplacer_personnage(direction):\n", " global x, y\n", " if direction == \"haut\" and peut_se_deplacer(x - 1, y):\n", " x -= 1\n", " elif direction == \"bas\" and peut_se_deplacer(x + 1, y):\n", " x += 1\n", " elif direction == \"droite\" and peut_se_deplacer(x , y + 1):\n", " y += 1\n", " elif direction == \"gauche\" and peut_se_deplacer(x , y - 1):\n", " y -= 1\n", "\n", "\n", "# Fonction pour déplacer un ennemi\n", "def deplacer_e(ennemi_index, direction):\n", " global ennemis\n", " xe, ye = ennemis[ennemi_index]\n", " grille[xe][ye] = 0 # Effacer l'ennemi de l'ancienne position\n", "\n", "# verification du déplacelent possible\n", "# si ok maj position\n", "\n", " ennemis[ennemi_index] = (xe, ye) # Mettre à jour la position de l'ennemi\n", " grille[xe][ye] = 2 # Ajouter l'ennemi à la nouvelle position\n", "\n", "def commande_clavier(direction):\n", " if direction not in (\"haut\", \"bas\", \"gauche\", \"droite\"):\n", " return\n", " with zone_grille:\n", " deplacer_personnage(direction)\n", "\n", " # Déplacer tous les ennemis (identique à la boucle initiale)\n", " for i in range(len(ennemis)):\n", " direction_ennemi = random.choice([\"haut\", \"bas\", \"gauche\", \"droite\"])\n", " deplacer_e(i, direction_ennemi)\n", "\n", " afficher_grille()\n", "\n", "output.register_callback('mini_jeu.deplacer', commande_clavier)\n", "\n", "# La grille garde toujours la même place dans le résultat de la cellule.\n", "display(zone_grille)\n", "with zone_grille:\n", " afficher_grille()\n", "\n", "# Cliquer dans la zone ci-dessous une fois, puis utiliser les flèches.\n", "# Le JavaScript transmet chaque appui à la fonction Python, sans touche Entrée.\n", "display(HTML(\"\"\"\n", "
\n", " 🎮 Commandes clavier — cliquez ici, puis utilisez ← ↑ ↓ →\n", "
Cliquez pour activer le clavier.
\n", "
\n", "\n", "\"\"\"))\n" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "version_major": 2, "version_minor": 0, "state": { "1a6be648ee6a43dda4a2166fd5b55ad9": { "model_module": "@jupyter-widgets/output", "model_name": "OutputModel", "model_module_version": "1.0.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_8b1a4b9f188449b2a517defcebb98bec", "msg_id": "", "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "⬜ ⬜ ⬜ ⬜ 🚧 ⬜ ⬜ ⬜ ⬜ ⬜ \n", "🚧 🚧 ⬜ ⬜ 🚧 ⬜ ⬜ 👻 ⬜ ⬜ \n", "⬜ ⬜ ⬜ 🚧 🚧 ⬜ ⬜ ⬜ ⬜ ⬜ \n", "⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🚧 ⬜ 👻 ⬜ \n", "⬜ 👻 ⬜ 🚧 ⬜ ⬜ ⬜ ⬜ 🚧 🚧 \n", "⬜ ⬜ ⬜ ⬜ ⬜ 🚧 ⬜ ⬜ ⬜ 👻 \n", "⬜ 🚧 ⬜ ⬜ 🚧 🚧 ⬜ 🚧 🚧 ⬜ \n", "⬜ 👻 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ \n", "⬜ 🚧 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ \n", "⬜ ⬜ ⬜ ⬜ 🚧 ⬜ 🚧 ⬜ ⬜ 😀 \n", "Points: 10\n" ] } ] } }, "8b1a4b9f188449b2a517defcebb98bec": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } } } } }, "nbformat": 4, "nbformat_minor": 0 }