Inscription / Connexion Nouveau Sujet
Niveau terminale
Partager :

ISN Python

Posté par
leabarlet
21-12-18 à 10:34

Bonjour,
J'ai un projet à faire mais je n'arrive pas à démarrer. Pourriez vous m'aider.
Voici l'énoncé:

[u]Cahier des charges du projet :  [/u]
Vous allez programmer une version du jeu ″la course à 20″, sans interface graphique.
Règle du jeu :  
Jeu pour deux joueurs. Le premier joueur annonce 1, 2 ou 3 comme nombre de départ. Puis l'autre joueur ajoute 1,
2 ou 3 au nombre annoncé par le premier joueur et annonce son résultat. Ensuite, chaque joueur, à son tour, choisit
le nombre 1, 2 ou 3, l'ajoute au résultat précédent et annonce le nouveau résultat. Le joueur qui annonce 20 gagne.
Stratégie gagnante pour la course à 20 en ajoutant 3 au maximum :  
Il existe une suite de nombres qu'il faut énoncer pour être sûr de dire 20 : 4, 8, 12, 16 et 20.
Stratégie gagnante dans le cas général :
Nous appelons  𝑛  le nombre à atteindre et  𝑝  le plus grand nombre que l'on peut ajouter à chaque tour.  
Dans le cas précédent, nous avions  𝑛 = 20  et  𝑝 = 3 .  
La  division  euclidienne  de  𝑛 = 20   par  (𝑝 + 1) = 4   est  20 = 4 × 5 + 0 .  La  suite  des  nombres  gagnants  est
constituée des multiples de 4, on compte de 4 en 4 en commençant à 0.  
Dans le cas  𝑛 = 20  et  𝑝 = 2 , la division euclidienne de 20 par 3 est  20 = 3 × 6 + 2 . La suite des nombres gagnants
est obtenue en comptant de 3 en 3 en commençant à 2. Il faut énoncer les nombres de la forme  3 × 𝑘 + 2  avec  𝑘  
entier variant de 0 à 6 (inclus).
Pour  𝑛  et  𝑝  entiers naturels quelconques avec  𝑝 < 𝑛 , on note  𝑟  le reste de la division euclidienne de  𝑛  par  𝑝 . Les
nombres gagnants sont les entiers inférieurs à  𝑛  de la forme  𝑟 + 𝑘 × (𝑝 + 1)  avec  𝑘  entier naturel. Ce sont les
premiers termes d'une suite arithmétique de raison  (𝑝 + 1)  et de premier terme  𝑟 . Quelle est la valeur maximale
prise par  𝑘  ?
Consigne de base :
Réaliser un programme qui permette de joueur contre l'ordinateur dans le cas  𝑛 = 20  et  𝑝 = 3 .  
Le programme doit donner au joueur le choix de commencer ou de laisser commencer l'ordinateur. L'ordinateur
devra annoncer un nombre gagnant si c'est possible et sinon un nombre au hasard (en respectant la règle du jeu).
Amélioration 1 :
Le programme doit permettre de joueur contre l'ordinateur dans le cas  𝑛  et  𝑝  quelconques.
Amélioration 2 :
Le programme doit vérifier que les nombres entrés dans la console sont bien des entiers positifs. Dans le cas du
nombre ajouté à son tour par le joueur, il faut vérifier en plus qu'il est inférieur ou égal à  𝑝 .

Merci d'avance

Posté par
mathafou Moderateur
re : ISN Python 21-12-18 à 11:26

Bonjour

oui, et ??
qu'as tu commencé, essayé ?
ça commence par mettre en forme en texte ("langage naturel") ce qui est dit dans l'énoncé sur la façon de gagner !

pour avoir un truc du genre

au départ reste = 20
si le joueur joue en premier
demander un nombre et retirer ce nombre du reste (de 20)

ensuite on entre dans une boucle ou l'ordi fait un coup puis le joueur un autre jusqu'à atteindre 0 :
si l'ordi sait qu'il n'a que des coups perdants à jouer
soit il fait un coup au hasard
soit il joue 1 en espérant que avec un total restant le plus grand possible le joueur serait conduit à la faute.
quand c'est au joueur de jouer l'ordi lui demande son coup (et vérifie qu'il est légal) et le retranche du reste

à toi

Posté par
mathafou Moderateur
re : ISN Python 21-12-18 à 11:48

ou en rédigeant ça en termes de total actuel comme dit l'énoncé au lieu de reste à parcourir pour atteindre 20.

Posté par
patrice rabiller
re : ISN Python 21-12-18 à 17:43

Bonjour,

C'est un grand classique : le jeu de Nim (ou sa variante, le jeu de Marienbad)..

Posté par
mathafou Moderateur
re : ISN Python 21-12-18 à 18:02

bof,

là il n'y a qu'un seul tas et une contrainte sur le nombre d'allumettes que l'on prend

donc l'article cité est inutilement compliqué dans sa généralité par rapport au présent jeu
dont la stratégie gagnante est même donnée dans l'énoncé de l'exo !!
il n'y a qu'à traduire quasi directement l'énoncé en algorithme au propre, puis en programme Python.

Posté par
verdurin
re : ISN Python 21-12-18 à 22:14

Bonsoir,
il me semble qu'il y a une seule question vraiment délicate d'un point de vue informatique : contrôler ce qu'entre le joueur.
Par exemple rejeter une entrée du genre 2,5.

Posté par
cercus
re : ISN Python 22-12-18 à 00:15

Suffit de faire un try except :


try:
        x = int(input('Saisir un nombre '))
        break
except:
        print('Entrez un nombre  ')
        pass

Posté par
leabarlet
re : ISN Python 27-12-18 à 15:09

Merci pour toutes vos réponses.
Voici le script que j'ai commencé à écrire.
Il y a quelques problèmes :
D'abord je n'arrive pas à faire en sorte que le x soit choisi par le joueur. J'ai mis x=1 ici pour que la boucle while s'effectue. SI j'écris x=int(input('choisir un nombre entre 1 et 3:')), le script ne s'effectue pas car il y a apparement une erreur de syntaxe.
Aussi, quelques fois le programme ne s'arrête pas lorsque x atteint 20: lorsque le joueur entre le dernier chiffre pour que x atteigne 20, le programme s'arrête bien mais lorsque le joueur entre un nombre ce qui donne ensuite 18 par exemple, l'ordinateur peut ajouter 2 par exemple ce qui donne 20 mais le programme ne s'arrête pas et propose une derniere fois au joueur d'entrer un nombre.
J'aimerais aussi définir des fonctions afin de répondre au mieux aux demandes du professeur
Merci d'avance

from random import randint

debut=str(input('Veux-tu commencer à jouer?(oui ou non)'))
if debut=='oui' :
    print('tu commences')
else:
    print('l\'ordinateur commence')

if debut=='oui' :
x=1
while x<20:
    a=randint(1,3)
    x=x+a
    print('l\'ordinateur a choisi', a, 'ce qui donne', x)
    y=int(input('choisissez un nombre entre 1 et 3:'))
    x=x+y
    print('vous avez choisi', y, 'ce qui donne', x)

else:
    print('   ')

Posté par
mathafou Moderateur
re : ISN Python 27-12-18 à 15:33

Citation :
x=int(input('choisir un nombre entre 1 et 3:')), le script ne s'effectue pas car il y a apparemment une erreur de syntaxe.
l'erreur n'est pas là en copiant telle quelle cette seule ligne dans Python ça fonctionne très bien
(suivie juste d'un print(x) pou vérifier)
par contre tu n'as pas mis d'indentation après ton if (le "x=int(..)" doit être indenté)
et c'est quoi ce "else" incongru à la fin ???

tu n'as pas suivi mon canevas :
Citation :
pour avoir un truc du genre

au départ reste = 20 total = 0 (on n'a pas encore commencé à jouer quoi que ce soit !! donc 0 et pas 1)

si le joueur joue en premier
demander un nombre et retirer ce nombre du reste (de 20) ajouter ce nombre au total
ensuite on entre dans une boucle ou l'ordi fait un coup puis le joueur un autre jusqu'à atteindre un reste de 0 un total de 20 :
si l'ordi sait qu'il n'a que des coups perdants à jouer
soit il fait un coup au hasard
soit il joue 1 en espérant que avec un total restant le plus grand possible le joueur serait conduit à la faute.
sinon bien sur il joue le coup gagnant !!
quand c'est au joueur de jouer (c'est à dire si l'ordinateur n'a pas déja gagné !)
l'ordi lui demande son coup (et vérifie qu'il est légal) et le retranche du reste l'ajoute au total

Posté par
leabarlet
re : ISN Python 27-12-18 à 15:45

mathafou
je ne comprends pas pourquoi faire ce que tu dis.  on ne demande pas à l'ordinateur de gagner à tous les coups il faut juste qu'il choisisse un chiffre au ahsard en 1 et 3 pour l'ajouter au total.
Par contre pour la premiere partie de ton message j'ai vérifié et ça marche maintenant,merci

Posté par
mathafou Moderateur
re : ISN Python 27-12-18 à 16:09

bien sur que non, ça n'aurait aucun intérêt de décrire dans l'énoncé la stratégie gagnante !!

le but de la programmation de tous ces jeux sur ordi est que l'ordi gagne si le joueur commet une erreur.
et les parties ne sont intéressantes que si au départ le joueur humain peut gagner (s'il joue bien !)
si la configuration de départ est déja perdante pour le joueur ça n'offre aucun intérêt de jouer à un jeu où on a la certitude de perdre avant même de commencer !

de toute façon tu peux commencer par un jeu où l'ordinateur est bête et joue au hasard, (modifier légèrement mon canevas : le reste est valable, en particulier le "si l'ordi n'a pas déja gagné", à ajouter dans ton programme)

rien ne t'empêchera de l'améliorer ensuite en remplaçant le tirage au sort par le choix d'un coup gagnant !

Posté par
leabarlet
re : ISN Python 28-12-18 à 14:40

mathafou
je voudrais déjà essayer de commencer à programmer le jeu simplement sans que l'ordinateur ne gagne à chaque partie.

from random import randint

debut=str(input('Veux-tu commencer à jouer?(oui ou non)'))
if debut=='oui' :
    print('tu commences')
else:
    print('l\'ordinateur commence')

if debut=='oui' :
    x=int(input('choisir un nombre entre 1 et 3:'))
    print('vous avez choisi',x)
    while x<20:
        a=randint(1,3)
        x=x+a
        print('l\'ordinateur a choisi', a, 'ce qui donne', x)
        y=int(input('choisissez un nombre entre 1 et 3:'))
        x=x+y
        print('vous avez choisi', y, 'ce qui donne', x)

else:
    x=randint(1,3)
    print('l\'ordinateur a choisi',x)
    while x<20:
        y=int(input('choisissez un nombre entre 1 et 3:'))
        x=x+y
        print('vous avez choisi', y, 'ce qui donne', x)
        a=randint(1,3)
        x=x+a
        print('l\'ordinateur a choisi', a, 'ce qui donne', x)


j'ai déjà fait ça mais ça ne marche pas totalement : le jeu ne s'arrête pas lorsque qu'on atteint 20 mais il s'arrête plus tard, à 22 ou 23
comment je peux régler ça?

Posté par
leabarlet
isn la course à 20 28-12-18 à 14:43

Bonjour,
je dois faire un programme qui répond à ce cahier des charges :

"Vous allez programmer une version du jeu ″la course à 20″, sans interface graphique.
Règle du jeu :  
Jeu pour deux joueurs. Le premier joueur annonce 1, 2 ou 3 comme nombre de départ. Puis l'autre joueur ajoute 1,
2 ou 3 au nombre annoncé par le premier joueur et annonce son résultat. Ensuite, chaque joueur, à son tour, choisit
le nombre 1, 2 ou 3, l'ajoute au résultat précédent et annonce le nouveau résultat. Le joueur qui annonce 20 gagne. "

j'ai commencé à faire ça:

from random import randint

debut=str(input('Veux-tu commencer à jouer?(oui ou non)'))
if debut=='oui' :
    print('tu commences')
else:
    print('l\'ordinateur commence')

if debut=='oui' :
    x=int(input('choisir un nombre entre 1 et 3:'))
    print('vous avez choisi',x)
    while x<20:
        a=randint(1,3)
        x=x+a
        print('l\'ordinateur a choisi', a, 'ce qui donne', x)
        y=int(input('choisissez un nombre entre 1 et 3:'))
        x=x+y
        print('vous avez choisi', y, 'ce qui donne', x)

else:
    x=randint(1,3)
    print('l\'ordinateur a choisi',x)
    while x<20:
        y=int(input('choisissez un nombre entre 1 et 3:'))
        x=x+y
        print('vous avez choisi', y, 'ce qui donne', x)
        a=randint(1,3)
        x=x+a
        print('l\'ordinateur a choisi', a, 'ce qui donne', x)


Mais ça ne marceh pas totalement : la parie ne s'arrête pas lorsqu'on atteint 20 mais plus tard, à 22 ou 23..

*** message déplacé ***

Posté par
cocolaricotte
re : ISN Python 28-12-18 à 14:48

Le multipost est interdit

Posté par
cocolaricotte
re : isn la course à 20 28-12-18 à 14:49

Tu as eu pas mal d'aide pour y arriver !

Ceci est un multipost

*** message déplacé ***

Posté par
mathafou Moderateur
re : ISN Python 28-12-18 à 15:12

tu n'as pas traduit ça :

Citation :
quand c'est au joueur de jouer (c'est à dire si l'ordinateur n'a pas déja gagné !)

tu dois donc avoir avoir un "si" dans ta boucle pour savoir si le joueur (si l'ordi avec ton architecture !!) doit effectivement jouer la deuxième partie de la boucle.

de plus il est assez maladroit de rédiger deux fois une boucle ...

si ça te gêne de rédiger deux fois la demande du joueur comme j'ai fait
(une fois en dehors si c'est à lui de commencer et ne rien faire du tout sinon
puis boucle systématique unique dans tous les cas)

on peut aussi faire ainsi :

ordi = oui ou non selon que c'est à l'ordi de commencer ou au joueur
une seule boucle en tout et pour tout :
tant que le total est différent de 20 (par sécurité < 20 strictement)
si c'est à l'ordi de jouer
jouer le coup de l'ordi et dire que c'est au joueur de jouer (mettre ordi à "non")
sinon
jouer le coup du joueur et dire que c'est à l'ordi de jouer. (mettre ordi à "oui")

on exécutera deux fois plus de boucles mais deux fois moins longues (un seul "demi-coup", au lieu de la paire ordi + joueur)

Posté par
malou Webmaster
re : ISN Python 28-12-18 à 15:16

la personne qui t'a aidé appréciera....

attentionextrait de c_faq la FAQ du forum :

Q03 - Pourquoi ne faut-il pas faire du ''multi-post'' ?



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 1742 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 !