A moins d'être benêt comme certains, l'utilisateur de ChatGPT comprend vite qu'il faut prendre le machin pour ce qu'il est, une machine qui génère du texte, et non pour ce que certains le vendent, une entité avec qui il serait possible de papoter. Seulement voilà : un machin qui génère du texte, c'est amusant, mais pour quoi en faire ? Et dans le cas présent, quoi en faire dans le domaine de la programmation ?
Question à son tour amusante, car dès lors, c'est un renversement de perspective qui s'opère. En effet, le produit d'Open AI n'apparaît pas comme un outil, que par définition il n'est intéressant d'utiliser qu'à condition de savoir à quoi il sert. A l'inverse, il apparaît comme un machin dont il est intéressant de chercher à faire un outil en l'utilisant pour trouver à quoi il sert. Le fait que le fonctionnement de ChatGPT soit si imprévisible qu'il est volontiers qualifié de boite noire vient rajouter du sel à l'exercice, car s'il a donc son petit caractère, on sent bien que cela ne va pas être simple de dompter le bestiau.
Bref, ChatGPT, on ne sait pas à quoi ça sert, et encore moins comment ça fonctionne, mais pour le développeur, c'est justement là que réside le fun. C'est que vu ainsi, utiliser ChatGPT permet de revivre une expérience similaire à celle de l'apprentissage de la programmation : on peut visiblement demander plein de choses amusantes à faire à la machine, et pour savoir ce qu'il est exactement possible en la matière, rien de mieux que de procéder d'emblée à des expérimentations ; par la suite, il sera toujours temps de tenter de rentrer dans les détails pour comprendre le pourquoi du comment, mais ce n'est pas un prérequis pour s'y mettre.
Partant, pourquoi ne pas chercher à l'utiliser pour créer un jeu ? Mon aventure avec ChatGPT relèvera donc un peu de la mise en abime : ce sera l'aventure de mon (jeu d')aventure avec ChatGPT, avant la dernière version qui repose sur GPT-4.
Un jeu d'aventure et huit problèmes
Je n'ai jamais utilisé ChatGPT ni d'autre AI génératrice jusqu'à ce que j'entende parler de prompt injection. L'idée que l'on puisse jouer avec les règles de la machine pique mon intérêt, et je crée un compte pour tester moi-même. Je n'en tire rien de bien intéressant, mais je suis impressionné par la précision de l'interprétation de mes demandes et la rédaction des réponses. De là, j'entreprends de tester autre chose, en particulier la génération de code.
Comment s'y prendre ? Quelques recherches me permettent de tomber sur des recommandations en matière de ce que d'aucuns appellent assez pompeusement le prompt engineering, et dont ils ont parfois même fait un fonds de commerce. Visiblement, il est bien possible de faire générer du code à ChatGPT, en n'hésitant toutefois pas à se montrer précis, quitte à rédiger de longues demandes. Partant, j'entreprends donc de lui faire générer le code d'un jeu d'aventure en mode texte, en ne lésinant pas sur les détails :
Write a program for a short adventure game. Write in Python. The game must be text based. The user and the creatures in this game have those attributes: life points, strength. The user has to explore a world until he finds a treasure, at which point the game ends. If the player dies during the exploration, the game starts over.
The world is a square grid which side is 200 squares. The user is placed at a random location on the grid where there is no monster and no treasure. A random number of monsters between 50 and 100 are generated. Each monster is placed a random location on the grid where there is no monster, no treasure and no player. The treasure is placed at a random location on the grid where there is no player and no monster.
To explore the world, the player must be asked one of the following direction: north, south, east or west. If the direction leads the player outside the grid, the player must not be moved and must be asked again a direction.
If the player move to a square where there is monster, he must fight this monster. If he kills the monster, he earns experience points related to the strength of the monster and he can keep on exploring the world. If he is killed, he has to start the game again.
To explore the world, the player must be asked one of the following direction: north, south, east or west. If the direction leads the player outside the grid, the player must not be moved and must be asked again a direction.
If the player move to a square where there is monster, he must fight this monster. If he kills the monster, he earns experience points related to the strength of the monster and he can keep on exploring the world. If he is killed, he has to start the game again.
En retour, ChatGPT commencer à générer un code, mais s'arrête un peu avant la centième ligne :
import random # Define the attributes for the player and monsters player_attributes = { "life_points": 100, "strength": 10, "experience_points": 0, "x": None, "y": None } monster_attributes = { "life_points": 50, "strength": 5 } # Define the size of the world world_size = 200 # Define the number of monsters min_monsters = 50 max_monsters = 100 # Define the functions for moving the player and checking for collisions def move_player(direction): if direction == "north": player_attributes["y"] -= 1 elif direction == "south": player_attributes["y"] += 1 elif direction == "east": player_attributes["x"] += 1 elif direction == "west": player_attributes["x"] -= 1 def check_collision(): for monster in monsters: if monster["x"] == player_attributes["x"] and monster["y"] == player_attributes["y"]: return monster if treasure["x"] == player_attributes["x"] and treasure["y"] == player_attributes["y"]: return "treasure" return None # Generate the world monsters = [] while len(monsters) < random.randint(min_monsters, max_monsters): monster_x = random.randint(0, world_size-1) monster_y = random.randint(0, world_size-1) if monster_x != player_attributes["x"] and monster_y != player_attributes["y"]: monsters.append({ "life_points": monster_attributes["life_points"], "strength": monster_attributes["strength"], "x": monster_x, "y": monster_y }) treasure = { "x": random.randint(0, world_size-1), "y": random.randint(0, world_size-1) } while treasure["x"] == player_attributes["x"] and treasure["y"] == player_attributes["y"]: treasure = { "x": random.randint(0, world_size-1), "y": random.randint(0, world_size-1) } # Place the player in a random location player_attributes["x"] = random.randint(0, world_size-1) player_attributes["y"] = random.randint(0, world_size-1) while check_collision() is not None: player_attributes["x"] = random.randint(0, world_size-1) player_attributes["y"] = random.randint(0, world_size-1) # Define the main game loop while True: # Ask the player for a direction direction = input("Which direction do you want to go? (north/south/east/west) ") # Move the player and check for collisions move_player(direction) collision = check_collision() # Handle the collision if collision is None: # No collision, keep exploring print("You keep exploring...") elif collision == "treasure": # Treasure found, game over print("Congratulations! You found the treasure and won the game!") break else: # Collision with a monster, fight it