Jump to content
Laurent GODEFROY

Mini - Projet de Python (1ADS) : trois petits jeux de stratégie

Recommended Posts

Bonjour Reda,

 

En lisant https://docs.python.org/2/tutorial/controlflow.html#for-statements, tu pourras remarquer qu'en Python la déclaration `for` itère directement sur les éléments d'une séquence, comme les listes, contrairement à d'autres langages où le `for` est plus vu comme un "Pour x allant de i à j", comme on le voit en algorithmie au lycée. Cette fonctionnalité de Python nous permet alors de directement écrire :

for row in board:
    for square in row:
        # restes des instructions, avec square qui sera égal à 
        # la valeur de la case parcourue, comme 1 pour le cas
        # d'un pion.

# Et si tu as besoin de l'index, tu peux utiliser la fonction enumerate()
for row_index, row in enumerate(board):
    for square_index, square in enumerate(row):
        # intructions...

# Bon à savoir, tu peux mettre un `_` si un élément ne t'intéresse pas
for row in board:
    for square_index, _ in enumerate(row):
        # instructions...

Voilà ! :)

Share this post


Link to post
Share on other sites

Bonjour,

 

@Pierre-Louis : tu peux effectuer les mineurs changements sur les noms des fonctions que tu évoques. Si en effet tu fais une itération sur les éléments dans certains sous-programmes tu n'es pas obligé de passer les dimensions en paramètres.

 

@Reda : la réponse de Pierre-Louis est correcte. Tu trouveras d'ailleurs la même réponse dans ton cours.

Share this post


Link to post
Share on other sites

 

Bonjour,

J'ai deja posé cette question mais je n'ai pas eu de réponse alors je répète ma question:

Pour chaque jeu il y a deux versions, les deux versions doivent être dans le même fichier ou dans deux fichiers différents? 

 

 

Bonjour Chedad, peut être que ma réponse n'est pas celle que t'aurais donné Laurent Gaudefroy, mais comme cela semble important pour toi je vais te donner mon avis :

En règle générale il vaut mieux organiser ton code dans différents fichiers (un best practice si tu préfères), de manière à rendre celui-ci plus lisible et compréhensible. Après si cela n'est pas indiqué directement dans le sujet, cela veut dire que tu peux procéder de la manière que tu souhaites à partir du moment où le rendu est fonctionnel (mais n'oublie pas que souvent des points sont attribués à la propreté de ton projet).

Donc pour résumer, d'après moi il est toujours mieux de bien organiser ton code, pour toi, mais aussi pour les autres développeurs avec qui tu seras amené à collaborer.

 

Bonne soirée,

Share this post


Link to post
Share on other sites

Bonsoir,

je suis confronté au problème des alias en voulant créer mon plateau de jeu pour le First Attack :

def newBoard(n): #retourne un tableau à n lignes, p colonnes
    liste = n*[0]       #on déclare la première ligne de notre tableau, qui compte n cases vides représentées par des zéros
    board = n*[liste]   #on déclare notre variable "board" qui compte n fois la liste définie juste au dessus
    return board

Pourtant, dans mon Breaktrough, je n'ai pas ce problème alors que la base est la même, la seule différence étant que dans le second cas, on utilise deux dimensions et qu'on a besoin de configurer le plateau de jeu avec des pions déjà présents.

def newBoard(n,p): #retourne un tableau à n lignes, p colonnes
    liste = p*[0]       #on déclare la première ligne de notre tableau, qui compte p éléments
    board = n*[liste]   #on déclare notre variable "board" qui compte n fois la liste définie juste au dessus
    board[-1] = p*[2]   #on affecte la valeur 2 aux 2 dernières lignes du tableau
    board[-2] = p*[2]
    board[0] = p*[1]    #on affecte la valeur 1 aux 2 premières lignes du tableau
    board[1] = p*[1]
    return board

J'ai essayé différentes façons (dont celles mentionnées dans le cours) de contourner ce problème, sans succès. Quelle solution apporter à ce phénomène d'alias ?

Share this post


Link to post
Share on other sites

Bonsoir,

je suis confronté au problème des alias en voulant créer mon plateau de jeu pour le First Attack :

def newBoard(n): #retourne un tableau à n lignes, p colonnes
    liste = n*[0]       #on déclare la première ligne de notre tableau, qui compte n cases vides représentées par des zéros
    board = n*[liste]   #on déclare notre variable "board" qui compte n fois la liste définie juste au dessus
    return board

Pourtant, dans mon Breaktrough, je n'ai pas ce problème alors que la base est la même, la seule différence étant que dans le second cas, on utilise deux dimensions et qu'on a besoin de configurer le plateau de jeu avec des pions déjà présents.

def newBoard(n,p): #retourne un tableau à n lignes, p colonnes
    liste = p*[0]       #on déclare la première ligne de notre tableau, qui compte p éléments
    board = n*[liste]   #on déclare notre variable "board" qui compte n fois la liste définie juste au dessus
    board[-1] = p*[2]   #on affecte la valeur 2 aux 2 dernières lignes du tableau
    board[-2] = p*[2]
    board[0] = p*[1]    #on affecte la valeur 1 aux 2 premières lignes du tableau
    board[1] = p*[1]
    return board

J'ai essayé différentes façons (dont celles mentionnées dans le cours) de contourner ce problème, sans succès. Quelle solution apporter à ce phénomène d'alias ?

J'ai du mal à comprendre à quoi tu te réfères en parlant "d'alias", juste, fait attention, un objet List en Python est traitée d'une manière spéciale. Si tu assignes à une variable un tableau, cette première ne sera qu'une "référence" à notre tableau. Un peu comme si tu ne mettais qu'une étiquette de plus vers un même emplacement mémoire. C'est sûrement ce dont tu voulais parler en utilisant le terme "d'alias" (je ne sais pas du tout si c'est le terme exact, mais si ça l'est, mes excuses). Pour créer un tableau bi-dimensionnel sans se retrouver avec le même objet List à chaque ligne, tu peux essayer les compréhensions de liste :

def newBoard(n):
    return [[0 for _ in range(n)] for _ in range(n)]

Ce qui revient à faire, approximativement :

def newBoard(n):
    board = []    
    for _ in range(n):
        row = []
        for _ in range(n):
            row.append(0)
        board.append(row)
    return board
    

Comme tu peux le voir, la compréhension de liste est *un peu* plus compacte et claire.

 

Avec cela, tu n'as pas de problèmes "d'alias", car tu crées un nouvel objet List pour chaque ligne du tableau.

Share this post


Link to post
Share on other sites

Bonjour,

 

@Chedad : la réponse de Guillaume est tout à fait satisfaisante.

 

@Reda : la réponse de Pierre-Louis l'est également. Tu es par contre de mauvaise fois quand tu dis "J'ai essayé différentes façons (dont celles mentionnées dans le cours) de contourner ce problème, sans succès." Cette question a été longtemps débattue en cours, voir en particulier les slides 52 et 53 du quatrième ppt. Ton formateur a de plus largement insisté dessus. 

 

@Pierre-Louis : le terme d'alias est tout à fait pertinent.

Share this post


Link to post
Share on other sites

Bonjour, dans le premier jeu, sommes nous contraint à faire qu'on joueur ne puisse "manger" le pion de l'adversaire seulement en diagonale? Ou pouvons nous faire qu'un joueur puisse tout de même avancer tout droit sur un pion adverse?

Je tiens à préciser que ce n'est pas clair, ce n'est pas dit dans le texte est c'est sous entendu sur une image.

Share this post


Link to post
Share on other sites

oops, j'ai pas vu la ligné, désolé :( c'est bien écrit:

""Un pion peut se déplacer vers une case occupée par un pion adverse uniquement si elle est adjacente en diagonale par rapport à sa position courante. Elle « prend » alors ce pion"

Share this post


Link to post
Share on other sites

Bonjour,

@Pierre-Louis : Merci pour ta réponse, ça m'a aidé à y voir plus clair dans ma fonction.

@Laurent : Suite à notre discussion, il y a effectivement un problème d'alias dans mon premier programme, je m'en suis rendu compte en effectuant des affectations de valeurs dans mon tableau, curieusement cela n'était pas visible à l'affichage. En tout cas, maintenant c'est réglé, merci encore de m'avoir éclairé.

Share this post


Link to post
Share on other sites

Bonjour,

 

Etant arrivé à l'IA du Pleiadis, je me retrouve confronté au probleme de la tactique que doit adopter le joueur : l'IA me semble plus forte que la tactique et je me demandais si c'était handicapant que cette premiere puisse vaincre le joueur plus souvent que prévu ?

 

Aussi, par tactique, est-elle réellement obligatoire ou on peut donner des conseils ?

 

Merci par avance !  :wub:

Share this post


Link to post
Share on other sites

 

Bon, résumons :

  1. L'IA commence et utilise une tactique toujours gagnante (à implémenter).
  2. L'humain joue en second et fait ce qu'il veut, il perdra de toute façon.

 

Bonjour,

 

D'accord. Mais dans mon code soit l'IA commence la partie (et dans ce cas, elle sera toujours gagnante), soit l'humain commence la partie (et il ne sera gagnant que s'il adopte la tactique de l'IA)

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×