- Ajouter plusieurs valeurs à une même clé python
- Clé windows 10 gratuit - Guide
- Cle usb non reconnu - Guide
- Clé bootable windows 10 - Guide
- Ajouter un compte gmail - Guide
- Citizen code python - Accueil - Outils
4 réponses
22 mai 2023 à 21:34
Au lieu d'essayer d'assigner une valeur, pourquoi ne pas assigner une liste (donc modifiable) et la modifier (ajouter un nouvel item) ?
Je me demande comment tu réussis à générer un semblant de dictionnaire avec le code que tu montres ...
La boucle intérieure s'exécute 7 fois. C'est bien ce que tu veux?
Tu pourrais évaluer la clé une seule fois dans la boucle extérieure.
Utilises .append() pour ajouter un nouveau tuple à ta liste.
Je pourrais te suggérer autre chose de plus simple si je savais ce que tu veux faire.
23 mai 2023 à 08:19
import random
#Initialisation des variables
pioche=None
def Nb_joueurs(): #On demande le nombre de joueurs
joueurs = int(input("Combien de joueurs : "))
return joueurs
#On crée les cartes
cartes={'nb':19, 'couleur':['bleu','vert','rouge','jaune'], 'valeurs':['0','1','2','3','4','5','6','7','8','9','+2','passe ton tour']}
mains_joueurs={}
def Valeur_aleatoire (): # genere une couleur aleatoire parmis celle du dico "cartes"
card_valeur = cartes.get('valeurs')
indice = random.randint(0,11)
return card_valeur[indice]
def Couleur_aleatoire (): # genere une couleur aleatoire parmis celle du dico "cartes"
card_couleur = cartes.get('couleur')
indice = random.randint(0,3)
return card_couleur[indice]
def Genere_carte_aleatoire(): # genere une carte aleatoire avec une valeur et une couleur aleatoire
valeur = Valeur_aleatoire()
couleur = Couleur_aleatoire()
return str(valeur), str(couleur)
# fonction pour distribuer les cartes en debut de parties
def Distribuer_cartes():
joueurs=Nb_joueurs()
for i in range (joueurs):
mains_joueurs['Joueurs '+str(i+1)]=None
for loop in range (1,8):
card=Genere_carte_aleatoire()
mains_joueurs['Joueurs '+str(i+1)]=card
return mains_joueurs
Voici mon code entier actuellement.
En fait je cherche à faire un UNO en python tout seul et la je voudrais faire une fonction qui distribue les 7 cartes de début de partie.
Je ne comprend pas lorsque vous me parlez du .append car j'ai déjà essayer mais comme c'est un dictionnaire ca ne marche pas.
23 mai 2023 à 10:17
Salut.
Comme dit plus haut, sers-toi de listes.
def Distribuer_cartes():
joueurs = Nb_joueurs()
mains = {f'joueur_{i}':[] for i in range(1, joueurs + 1)}
for main in mains.values():
# for i in range(joueurs):
# mains_joueurs['Joueurs '+str(i+1)]=None
for loop in range (1,8):
card = Genere_carte_aleatoire()
main.append(card)
# mains_joueurs['Joueurs '+str(i+1)]=card #c'est ici le problème
return mains
from pprint import pprint
pprint(Distribuer_cartes())
Mais en l'état on se retrouvera avec des doublons, normal puisque tu génères chaque fois une carte aléatoire sans te préoccuper de ce qui a été prélevé avant.
Tu dois d'abord générer les cartes (list), les mélanger, puis inutile de se prendre la tête, un simple pop de la pile, vers la main joueur, pas plus compliqué que ça.
Modifié le 23 mai 2023 à 13:30
Bonjour,
Je vous remercie pour votre code qui marche.
Cependant je ne connais pas "pprint" (qui après recherches sert apparemment à afficher "de manière élégante), si vous avez d'autres précisions sur ce pprint je suis preneur.
Ensuite, cette ligne de code :
mains = {f'joueur_{i}':[] for i in range(1, joueurs + 1)}
C'était mon idée de base hors je ne trouvais aucun moyen avec mes connaissances de le faire, et sur conseils de mon prof de NSI de Terminale, j'ai tenter de faire avec un dictionnaire.
J'ai compris que la ligne permet de générer une liste vide pour chaque joueurs, mais si vous pouvez m'expliquer un peu plus précisément cette ligne de code je suis également preneur (en particulier le f'joueur_{i}').
Enfin, sur le problème des doublons, je sais qu'il y en aura et je résoudrait ce problème plus tard.
En tout cas merci de votre aide.
23 mai 2023 à 13:51
Bah, c'en est toujours un exemple avec le paquet de cartes
Ensuite, la distribution par joueur est classique ... et en 30 lignes, c'est fait !
23 mai 2023 à 13:40
Bonjour,
Tu pourrais faire un truc comme ça:
import random class Pack(): def __init__(self,faces,colors): self.cards = [] for k in range(len(colors)): for j in range(len(faces)): self.cards.append(faces[j]+' '+colors[k]) random.shuffle(self.cards) faces = ['0','1','2','3','4','5','6','7','8','9'] colors = ['bleu','vert','rouge','jaune'] pack = Pack(faces,colors) players_nb = int(input("Combien de joueurs : ")) stop = False player_game = {} while(True): for k in range(players_nb): if(not player_game.get(k)): player_game[k] = [] if(pack.cards != []): player_game[k].append(pack.cards.pop()) else: stop = True break if(stop): break
Modifié le 23 mai 2023 à 14:02
Je vous remercies mais je ne suis absolument pas caler avec la programmation objet.
23 mai 2023 à 14:48
Tu dois forcément être calé, puisque tu en manipules ^^ (en python tout est objet)
Moins objet,
import random COLORS = 'bleu','vert','rouge','jaune' VALUES = '0','1','2','3','4','5','6','7','8','9','+2','passe ton tour' def deal(cards, hand_number): random.shuffle(cards) hands = [] for _ in range(hand_number): hand = [] for __ in range(7): hand.append(cards.pop()) hands.append(hand) return hands def players_show(players): for player in players: print(player['name'], ' : ') for card in player['hand']: print('\t', card) print() players_name = 'lola', 'toto', 'poupi' players = [ dict(name=name, hand=[]) for name in players_name ] cards = [(value, color) for value in VALUES for color in COLORS] for i, hand in enumerate(deal(cards, len(players))): players[i]['hand'].extend(hand) players_show(players)
23 mai 2023 à 08:22
C'est ce que j'avais pour but initialement mais je n'ai pas réussi à le faire comme je voulais.
Avez-vous des une idée, voici mon code (j'ai pour but de faire un UNO en python tout seul avec mes connaissances) :