Inscription / Connexion Nouveau Sujet
Niveau première
Partager :

jeu nim

Posté par
maroui
05-11-21 à 16:00

bonjour, j'ai un problème sur mon code sue le jeu de nim(il y a 20 allumettes, on peut retirer entre 1 et 3 allumettes et celui qui retire la derniere a gagné):
def partie_fort_boyard1():    
    nb = 20
    carac = '!'  
    j1 = 1
    j2 = 2
    j1 == '1'
    j2 == '2'
    print(nb, 'objets restants:')
    print(nb*carac)
    nb_r = int(input("Nombres d'objets retirés? "))
    while nb_r > 3 or nb_r < 1:
            print("Choisir un nombre entre 1 et 3.")
            nb_r = int(input("Nombres d'objets retirés? "))
    else:        
        print('Le joueur numéro', j1, 'enlève', nb_r, 'objets')
        nb = nb - nb_r
        print(nb, 'objets restants:')
        print(nb*carac)
    while nb > 0:
        if j1 == '1' and nb_r > 3 or nb_r < 1:
            print("Choisir un nombre entre 1 et 3.")
            nb_r = int(input("Nombres d'objets retirés? "))        
        else:  
            print("Choisir un nombre entre 1 et 3.")
            nb_r = int(input("Nombres d'objets retirés? "))
            print('Le joueur numéro', j2, 'enlève', nb_r, 'objets')
            nb = nb - nb_r
            print(nb, 'objets restants:')
        print(nb*carac)  
        print("Choisir un nombre entre 1 et 3.")
        nb_r = int(input("Nombres d'objets retirés? "))
        print('Le joueur numéro', j1, 'enlève', nb_r, 'objets')
        nb = nb - nb_r
        print(nb, 'objets restants:')
        print(nb*carac)

quand il y a plus d'allumettes, il faut faire comment pour designer (j1 ou j2) vainqueur et pour que il arrete de demander "Nombres d'objets retirés? " ?
merci

Posté par
Ulmiere
re : jeu nim 05-11-21 à 17:22

Ton code est truffé d'erreurs et je ne suis pas sûr que tu saches ce que fait

while condition:
    # truc
else:
   # autre truc


Pour en citer quelques unes :


while nb_r > 3 or nb_r < 1: 

Et si j'entre -1 ou 0, il se passe quoi ?
D'ailleurs est-ce que c'est possible physiquement qu'il reste zéro bâtons ?

else:        
        print('Le joueur numéro', j1, 'enlève', nb_r, 'objets') 


Non, sinon il reste zéro bâtons. Il faut en enlever nb_r-1 pour n'en laisser qu'un


 j1 == '1'
 j2 == '2' 


Là tu évalues juste deux booléens sans rien en faire. Ce ne sont pas des assignations.

if j1 == '1' and ...

ne sera jamais exécuté, puisque j1 est fixé et vaut 1, pas '1'.


etc...


Tu devrais découper ton code en plusieurs fonctions, ça t'aiderait


def get_input(phrase, i=1, j=3):
	while True:
		s = input()
		if len(s) == 0:
			print("Veuillez saisir un nombre")
			continue
		m = int(s)
		if i<=m and m<=j:
			return m
		print("Veuillez saisir un nombre entre")

def demander(nb, i=1, j=3):
	print("%d objets restants: %s" %(nb, '!'*nb))
	return get_input("Choisir un nombre entre %d et %d" %( i, j))
			
			
def jeu():
	nb = 20
	j = 0
	while nb>3:
		nb_r = get_input(nb)
		# ...
		j += 1
	else:
		# qui gagne si la partie démarre avec moins de 4 bâtons ?
		# ...



(Ctrl+C pour quitter la partie)
Pour savoir qui joue, regarde la parité de l'entier j. S'il est pair, c'est le joueur 1, sinon c'est le joueur 2.

Posté par
Ulmiere
re : jeu nim 05-11-21 à 18:21

nb_r = get_input(nb)

à remplacer par demander(nb), bien-sûr

et print("Veuillez saisir un nombre entre") à remplacer par print("Veuillez saisir un nombre entre %d et %d"%(i,j))



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1674 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !