Python, jeu d'échec

Splendid13

Python, jeu d'échec

Message par Splendid13 » 29 oct. 2015 17:01

Déplacement du fou

Code : Tout sélectionner

from random import randint
R=int(input("la position de la rangée, donnez une valeur entre 1 et 8 = "))
C=int(input("la position de la colonne, donnez une valeur entre 1 et 8 = "))
Deplace=int(input("Déplacement vers la droite (1) ou vers la gauche (2) = "))
b = randint (1,2)   # b correspond au nombre de coups autorisés pour faire un déplacement du fou :  se déplaçant en diagonale,
                    # d’un nombre quelconque de positions. Un fou ne peut pas sauter par dessus une autre pièce.
if Deplace==1: # Déplacement vers la droite
    if b==1: # Premier déplacement : même colonne mais une ligne au dessus, ici on change de ligne donc la rangée
        while 1:
            a = randint(-7,7)
            R = R+a # x+a vers le haut
            C = C+a # y bouge pas, même colonne
            if R>0 and R<9 and C>0 and C<9:
                print("Pour un déplacement vers la droite, la rangée est de = ",R,"la colonne est de ",C) # Affiche les coordonnées du premier déplacement
                break

    if b==2: # Second déplacement : même ligne, colonne d'avant, donc ici on change le colonne
        while 1:
            a = randint(-7,7)
            R = R+a # x+a vers le haut
            C = C+a # y bouge pas, même colonne
            if R>0 and R<9 and C>0 and C<9:
                print("Pour un déplacement vers la droite, la rangée est de = ",R,"la colonne est de ",C) # Affiche les coordonnées du premier déplacement
                break

if Deplace==2: # Déplacement vers la gauche
    if b==1: # Premier déplacement vers la : même colonne mais une ligne au dessus, ici on change de ligne donc la rangée
        while 1:
            a = randint(-7,7)
            R = R+a # x+a vers le haut
            C = C-a # y bouge pas, même colonne
            if R>0 and R<9 and C>0 and C<9:
                print("Pour un déplacement vers la gauche, la rangée est de = ",R,"la colonne est de ",C) # Affiche les coordonnées du premier déplacement
                break

    if b==2: # Second déplacement : même ligne, colonne d'avant, donc ici on change le colonne
        while 1:
            a = randint(-7,7)
            R = R+a # x+a vers le haut
            C = C-a # y bouge pas, même colonne
            if R>0 and R<9 and C>0 and C<9:
                print("Pour un déplacement vers la gauche, la rangée est de = ",R,"la colonne est de ",C) # Affiche les coordonnées du premier déplacement
                break
maintenant si le fou doit aller à droite ou à gauche : mais en faisant "run", il me remet les mêmes nombres
où ai-je fait une erreur
et est-ce que ce genre d'idée est bonne (déplacement gauche et droite) ou c'est inutile ?
Dernière modification par Splendid13 le 29 oct. 2015 20:12, modifié 1 fois.

Splendid13

Re: Python, jeu d'échec

Message par Splendid13 » 29 oct. 2015 20:26

tout est dans mon message

Splendid13

Re: Python, jeu d'échec

Message par Splendid13 » 30 oct. 2015 18:30

en fait le prof nous demande de faire les déplacements (primaires, c'est-à-dire les premiers au début d'une partie) de chaque pièce d'un jeu d'échec
voici le devoir

Code : Tout sélectionner

# -*- coding: utf-8 -*-
"""Module contenant la classe de base Piece, ainsi qu'une classe fille pour chacun des types de pièces du jeu d'échecs.

"""
# TODO: Si votre système n'affiche pas correctement les caractères unicodes du jeu d'échecs,
# mettez cette constante (variable globale) à False. Un tutoriel est présent sur le site Web
# du cours pour vous aider à faire fonctionner les caractères Unicoe sous Windows.
UTILISER_UNICODE = True


class Piece:
    """Une classe de base représentant une pièce du jeu d'échecs. C'est cette classe qui est héritée plus bas pour fournir
    une classe par type de pièce (Pion, Tour, etc.).

    Attributes:
        couleur (str): La couleur de la pièce, soit 'blanc' ou 'noir'.
        peut_sauter (bool): Si oui ou non la pièce peut "sauter" par dessus d'autres pièces sur un échiquier.

    Args:
        couleur (str): La couleur avec laquelle créer la pièce.
        peut_sauter (bool): La valeur avec laquelle l'attribut peut_sauter doit être initialisé.

    """
    def __init__(self, couleur, peut_sauter):
        # Validation si la couleur reçue est valide.
        assert couleur in ('blanc', 'noir')

        # Création des attributs avec les valeurs reçues.
        self.couleur = couleur
        self.peut_sauter = peut_sauter

    def est_blanc(self):
        """Retourne si oui ou non la pièce est blanche.

        Returns:
            bool: True si la pièce est blanche, et False autrement.

        """
       [b] if self.couleur == 'blanc':
            print("True")
        else:
            print("False")[/b]

    def est_noir(self):
        """Retourne si oui ou non la pièce est noire.

        Returns:
            bool: True si la pièce est noire, et False autrement.

        """
       [b] if self.couleur == 'noire':
            print("True")
        else:
            print("False")
[/b]
    def peut_se_deplacer_vers(self, position_source, position_cible):
        """Vérifie si, selon les règles du jeu d'échecs, la pièce peut se déplacer d'une position à une autre.

        Une position est une chaîne de deux caractères.
            Le premier caractère est une lettre entre a et h, représentant la colonne de l'échiquier.
            Le second caractère est un chiffre entre 1 et 8, représentant la rangée de l'échiquier.

        Args:
            position_source (str): La position source, suivant le format ci-haut. Par exemple, 'a8', 'f3', etc.
            position_cible (str): La position cible, suivant le format ci-haut. Par exemple, 'b6', 'h1', etc.

        Warning:
            Comme nous sommes dans la classe de base et non dans l'une des classes filles, nous ne savons pas
            (encore) comment cette pièce se déplace. Cette méthode est donc à redéfinir dans chacune des
            classes filles.

        Warning:
            Comme la classe Piece est indépendante de l'échiquier (et donc on ne sait pas si une pièce est "dans le
            chemin"), on doit ignorer le contenu de l'échiquier : on ne se concentre que sur les règles de mouvement
            des pièces.

        Returns:
            bool: True si le déplacement est valide en suivant les règles de la pièce, et False autrement.

        """
        # On lance une exception (on y reviendra) indiquant que ce code n'a pas été implémenté. Ne touchez pas
        # à cette méthode : réimplémentez-la dans les classes filles!
        raise NotImplementedError

    def peut_faire_une_prise_vers(self, position_source, position_cible):
        """Vérifie si, selon les règles du jeu d'échecs, la pièce peut "manger" (faire une prise) une pièce ennemie.
        Pour la plupart des pièces, la règle est la même, on appelle donc la méthode peut_se_deplacer_vers.

        Si ce n'est pas le cas pour une certaine pièce, on peut simplement redéfinir cette méthode pour programmer
        la règle.

        Args:
            position_source (str): La position source, suivant le format ci-haut. Par exemple, 'a8', 'f3', etc.
            position_cible (str): La position cible, suivant le format ci-haut. Par exemple, 'b6', 'h1', etc.

        Returns:
            bool: True si la prise est valide en suivant les règles de la pièce, et False autrement.

        """
        return self.peut_se_deplacer_vers(position_source, position_cible)

[b]class Pion(Piece):
    def __init__(self, couleur):
        super().__init__(couleur, False)

    def peut_se_deplacer_vers(self, position_source, position_cible):
        # TODO: À compléter, pour définir comment un pion se déplace. Vous devez implémenter cette méthode
        # pour chacune des autres classes filles, ci-bas. Nous ne vous demandons pas de documenter ces méthodes,
        # puisque la documentation est déjà ci-haut, dans la classe mère.
        self.position_source=='position source'
        self.position_cible=='position cible'
        self.couleur=='couleur'
        Colonne=int(input("la position de la colonne, donnez une valeur entre a et h = "))
        Rangee=int(input("la position de la rangée, donnez une valeur entre 1 et 8 = "))
        # Dans le cas présent, le pion ne se déplace que vers l'avant donc uniquement avec les rangées, donc demeure
        # dans la même colonne : exemple : a2 vers a3 (vers le bas pour pions noirs, vers le haut pions blancs.
        if self.couleur == 'blanc':
            self.position_source='position source'
            self.position_cible='position cible'
            Rangee=Rangee+1
            Colonne=Colonne+0
            print("La position cible est = ",Rangee,Colonne) # Affiche les coordonnées du pion blanc
        elif self.couleur == 'noire':
            self.position_source='position source'
            self.position_cible='position cible'
            Rangee=Rangee-1
            Colonne=Colonne+0
            print("La position cible est = ",Rangee,Colonne) # Affiche les coordonnées du pion blanc


    def peut_faire_une_prise_vers(self, position_source, position_cible):
        # TODO: À compléter, pour définir comment un pion mange une pièce adverse.
        self.position_source=='position source'
        self.postion_cible=='position cible'
        self.couleur=='couleur'
        Colonne=int(input('la position de la colonne, donnez une valeur entre a et h = '))
        Rangee=int(input("la position de la rangée, donnez une valeur entre 1 et 8 = "))
        Deplace=int(input("Déplacement du pion en diagonale selon sa couleur vers la droite (1) ou vers la gauche(2)"))
        # Dans le cas présent, le pion ne se déplace que vers l'avant donc uniquement avec les rangées, donc demeure
        # dans la même colonne : exemple : a2 vers a3 (vers le bas pour pions noirs, vers le haut pions blancs.
        if self.couleur == 'blanc':
            self.position_source='position source'
            if Deplace==1:
                self.position_cible='position cible'
                Rangee = Rangee-1
                Colonne = Colonne+1
                print("La position cible est = ",Rangee,Colonne) # Affiche les coordonnées du déplacement du pion blanc vers la droite en diagonale

            if Deplace==2:
                self.position_cible='position cible'
                Rangee = Rangee-1
                Colonne = Colonne-1
                print("La position cible est = ",Rangee,Colonne) # Affiche les coordonnées du déplacement du pion blanc vers la gauche en diagonale

        if self.couleur== 'noire':
            self.position_source='position source'
            if Deplace==1:
                self.position_cible='position cible'
                Rangee = Rangee+1
                Colonne = Colonne+1
                print("La position cible est = ",Rangee,Colonne) # Affiche les coordonnées du déplacement du pion noir vers la droite en diagonale

            if Deplace==2:
                self.position_cible='position cible'
                Rangee = Rangee+1
                Colonne = Colonne-1
                print("La position cible est = ",Rangee,Colonne) # Afffiche les coordonnées du déplacement du pion noir vers la gauche en diagonale

def __repr__(self):
        """Redéfinit comment on affiche un pion à l'écran. Nous utilisons la constante UTILISER_UNICODE
        pour déterminer comment afficher le pion.

        Returns:
            str: La chaîne de caractères représentant le pion.[/b]

        """
        if self.est_blanc():
            if UTILISER_UNICODE:
                return '\u2659'
            else:
                return 'PB'
        else:
            if UTILISER_UNICODE:
                return '\u265f'
            else:
                return 'PN'



class Tour(Piece):
    def __init__(self, couleur):
        super().__init__(couleur, False)

    def __repr__(self):
        if self.est_blanc():
            if UTILISER_UNICODE:
                return '\u2656'
            else:
                return 'TB'
        else:
            if UTILISER_UNICODE:
                return '\u265c'
            else:
                return 'TN'


class Cavalier(Piece):
    def __init__(self, couleur):
        super().__init__(couleur, True)

    def __repr__(self):
        if self.est_blanc():
            if UTILISER_UNICODE:
                return '\u2658'
            else:
                return 'CB'
        else:
            if UTILISER_UNICODE:
                return '\u265e'
            else:
                return 'CN'




class Fou(Piece):
    def __init__(self, couleur):
        super().__init__(couleur, False)

    def __repr__(self):
        if self.est_blanc():
            if UTILISER_UNICODE:
                return '\u2657'
            else:
                return 'FB'
        else:
            if UTILISER_UNICODE:
                return '\u265d'
            else:
                return 'FN'



class Roi(Piece):
    def __init__(self, couleur):
        super().__init__(couleur, False)

    def __repr__(self):
        if self.est_blanc():
            if UTILISER_UNICODE:
                return '\u2654'
            else:
                return 'RB'
        else:
            if UTILISER_UNICODE:
                return '\u265a'
            else:
                return 'RN'


class Dame(Piece):
    def __init__(self, couleur):
        super().__init__(couleur, False)

    def __repr__(self):
        if self.est_blanc():
            if UTILISER_UNICODE:
                return '\u2655'
            else:
                return 'DB'
        else:
            if UTILISER_UNICODE:
                return '\u265b'
            else:
                return 'DN'
J'ai donc remplacé ce qui était demandé jusqu'à la section : déplacement du pion (voir dans le devoir, section en gras) et aussi définition des parties en gras

Ma question est d'abord si vous pourriez en des mots simples me réexpliquer la notion de self.xxxx
Ensuite, me dire si ce que j'ai fait répond à l'intitulé, en somme, l'ai-je bien compris !

Voilà, je vous demande pas de faire les programmes pour les autres pièces du jeu d'échec mais simplement vérifier et me dire si ce que j'ai fait pour les déplacements du pion et des définitions de self.xxxx vous semblent corrects, et si cela n'est pas le cas, pourriez-vous m'aider ?
Merci

Messages : 9679

Inscription : 30 juil. 2008 16:59

Profil de l'utilisateur : Élève de lycée

Re: Python, jeu d'échec

Message par fakbill » 05 nov. 2015 19:13

Qu'as tu compris de la notion de classe et de self en python ?

Au fait...la prog objet explicite n'est pas du tout dans l'esprit de l'info pour tous en prépa.

* : écrire de "class". On manipule toujours des objets en pythons mais on ne se préoccupe pas de les définir.
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

Répondre