Aller au contenu


Photo

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

Python algorithmique jeux de stratégie jeux combinatoires abstraits

  • Veuillez vous connecter pour répondre
51 réponses à ce sujet

#21 Theo ARGENTAIS

Theo ARGENTAIS

    Newbie

  • Étudiant
  • Pip
  • 3 messages
  • Cursus:A.Sc.1

Posté 10 novembre 2016 - 02:42

Bonjour,

La deuxième version de chaque jeu est un bonus (point bonus) ou est obligatoire et donc fait partie des 40 points du projet?



#22 Laurent GODEFROY

Laurent GODEFROY

    Member

  • Full Professors
  • 284 messages
  • LocationTours (37)

Posté 10 novembre 2016 - 02:48

Bonjour Reda,

 

Rien de bien surprenant, "display" est une procédure, c'est-à-dire qu'elle ne renvoie aucune valeur. Quand tu la composes avec un "print" il est donc normal d'obtenir un "None" comme affichage. Remplace ton "print(display(a,5,4))" par "display(a,5,4)".

 

P.S. Utiliser un mot clé du langage, "list" en l'occurence, comme nom de variable n'est pas recommandé.



#23 Laurent GODEFROY

Laurent GODEFROY

    Member

  • Full Professors
  • 284 messages
  • LocationTours (37)

Posté 10 novembre 2016 - 02:54

Bonjour Théo,

 

Ces deuxièmes versions des jeux font bien partie des 40 points du barème. Tu noteras qu'à aucun moment de ce projet on ne parle de bonus.



#24 Pierre-Louis DOURNEAU

Pierre-Louis DOURNEAU

    Member

  • Étudiant
  • PipPip
  • 13 messages
  • Cursus:A.Sc.2

Posté 11 novembre 2016 - 03:14

Bonjour,

 

Est-il obligatoire de nommer les fonctions demandées exactement comme présentées dans le sujet ?

C'est-à-dire, par exemple, peut-on renommer la fonction `newBoard` en `new_board` afin de pouvoir être le plus proche possible des recommandations de la PEP 008 ?

De même pour les arguments de ces fonctions, comme `n` et `p` que l'on pourrait tout aussi bien nommer, respectivement, `board_height` et `board_width` pour plus de clarté ?

Enfin, l'inclusion de ces paramètres est-elle aussi mandataire ? Par exemple, ma fonction `displayBoard` n'utilise pas les paramètres `n` et `p`, dois-je tout de même les laisser dans la définition des arguments requis par la fonction ?

 

Merci bien.

 

Cordialement,

DOURNEAU PIerre-Louis.



#25 Reda BELKADI

Reda BELKADI

    Newbie

  • Étudiant
  • Pip
  • 7 messages
  • Cursus:A.Sc.2

Posté 11 novembre 2016 - 10:10

Salut Pierre-Louis,

 

Plutôt que de recalculer régulièrement les dimensions de cette liste on préfèrera les passer en paramètres de nos sous-programmes.

 

as-tu tenu compte de cette consigne pour ta fonction display ? si oui, comment t'y es-tu pris sans calculer les dimensions et sans dimensions en paramètre ?



#26 Pierre-Louis DOURNEAU

Pierre-Louis DOURNEAU

    Member

  • Étudiant
  • PipPip
  • 13 messages
  • Cursus:A.Sc.2

Posté 11 novembre 2016 - 11:30

Bonjour Reda,

 

En lisant https://docs.python....#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à ! :)



#27 Laurent GODEFROY

Laurent GODEFROY

    Member

  • Full Professors
  • 284 messages
  • LocationTours (37)

Posté 14 novembre 2016 - 09:42

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.



#28 Chedad R'GUEIBI

Chedad R'GUEIBI

    Newbie

  • Étudiant
  • Pip
  • 2 messages

Posté 14 novembre 2016 - 04:54

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? 



#29 Guillaume SIVADE

Guillaume SIVADE

    Member

  • Étudiant
  • PipPip
  • 65 messages
  • LocationNice
  • Cursus:B.Sc.

Posté 14 novembre 2016 - 05:43

 

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,


A.Sc.1 Nice A.Sc.2 Nice B.Sc Nice


#30 Reda BELKADI

Reda BELKADI

    Newbie

  • Étudiant
  • Pip
  • 7 messages
  • Cursus:A.Sc.2

Posté 15 novembre 2016 - 12:23

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 ?



#31 Pierre-Louis DOURNEAU

Pierre-Louis DOURNEAU

    Member

  • Étudiant
  • PipPip
  • 13 messages
  • Cursus:A.Sc.2

Posté 15 novembre 2016 - 09:31

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.



#32 Laurent GODEFROY

Laurent GODEFROY

    Member

  • Full Professors
  • 284 messages
  • LocationTours (37)

Posté 15 novembre 2016 - 11:31

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.



#33 Romain CARUANA

Romain CARUANA

    Newbie

  • Étudiant
  • Pip
  • 4 messages
  • Cursus:A.Sc.1

Posté 15 novembre 2016 - 04:25

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.



#34 Romain CARUANA

Romain CARUANA

    Newbie

  • Étudiant
  • Pip
  • 4 messages
  • Cursus:A.Sc.1

Posté 15 novembre 2016 - 04:27

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"



#35 Reda BELKADI

Reda BELKADI

    Newbie

  • Étudiant
  • Pip
  • 7 messages
  • Cursus:A.Sc.2

Posté 15 novembre 2016 - 05:06

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é.



#36 Romain BÉNAT

Romain BÉNAT

    Newbie

  • Étudiant
  • Pip
  • 7 messages
  • Cursus:A.Sc.2

Posté 16 novembre 2016 - 04:22

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:



#37 Laurent GODEFROY

Laurent GODEFROY

    Member

  • Full Professors
  • 284 messages
  • LocationTours (37)

Posté 16 novembre 2016 - 04:34

Bonjour Romain,

 

Je ne comprends pas bien ta question. Le but de cette partie est justement d'implémenter une IA qui sera toujours gagnante si elle commence la partie.



#38 Romain BÉNAT

Romain BÉNAT

    Newbie

  • Étudiant
  • Pip
  • 7 messages
  • Cursus:A.Sc.2

Posté 16 novembre 2016 - 04:40

Mon problème est de trouver une tactique à proposer au joueur, si il commence, qui lui donne de grandes probabilités de gagner car l'IA se defend mieux que prévu..



#39 Laurent GODEFROY

Laurent GODEFROY

    Member

  • Full Professors
  • 284 messages
  • LocationTours (37)

Posté 16 novembre 2016 - 04:42

je ne comprends toujours pas. Si l'IA commence et qu'elle est bien conçue elle est sûre de gagner. Quelle que soit la façon de jouer de l'humain en face d'elle.



#40 Aurel Landry KENGNI NKONGTCHOU

Aurel Landry KENGNI NKONGTCHOU

    Newbie

  • Étudiant
  • Pip
  • 8 messages
  • Cursus:A.Sc.2

Posté 16 novembre 2016 - 04:42

Bonjour,

 

Alors au niveau de la deuxième version du 3e jeu, si l'utilisateur commence la partie (donc c'est lui le joueur 1) , est-ce que c'est forcément lui qui doit gagner aussi ?

 

Merci. :)







Aussi étiqueté avec au moins un de ces mots-clés : Python, algorithmique, jeux de stratégie, jeux combinatoires abstraits

0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)