PYTHON : Arrêter le temps ? [résolu]

Bonjour.
Je suis novice en python et essaye de faire quelques petites choses.
Je souhaite en particulier par exemple laisser 40 secondes à un joueur pour qu’il devine un mot.
Je peux suspendre le temps avectime.sleep(40), et je peux aussi faire un compte à rebours avec for i in range(40,0,-1): print(i) time.sleep(1)mais je ne sais pas…
comment interrompre ceci pour donner une réponse ?
(le but étant que le joueur a 40 secondes pour répondre, et si il n’y arrive pas dans ce temps imparti, il perd)

merci pour vos réponses

Déjà tu peux remplacer ton for par un while et réarchitecturer ta boucle autour de ça.

hélas je n’y arrive pas.
j’ai tenté çaimport time while time.sleep(30): mot=input('mot ?') print(mot)mais sans succés

si je mets un input dans une boucle, il attend forcément une réponse… et ne continue pas à faire défiler le temps.

je cherche encore

C’est pas des court de python qu’il te faut la, mais d’algorithmique …

En gros :


pasfini = true
While (pasfini)
{
  Mot = input(mot)
  If (mot = reponse) ot (temps_ecoulé >= 40)
  {
    pasfini = false
  }
  else
  {
    sleep(1)
    temps_ecoulé ++
  }
}

–> la personne a 40 seconde pour donner la reponse, et ca s’arrete si la reponse et bonne, ca continu sinon.
A raffiner, mais tu vois l’idée.

Apres, si tu veux que le temps continu a defiler PENDANT que la personne saisie la reponse, il te faut forcement faire un thread separé pour compter le temps.

heu, oui, il me faut des cours de tout, mais…
quand tu écris mot=input(mot), si je suis pas trop nulle en algo, le programme attend une réponse, non ?
donc tant que tu ne rentres rien qui finisse pas ENTER, il ne bouge pas.
les 40 secondes auront largement le temps de défiler.
sauf si j’ai mal compris, ce que tu me proposes ne convient pas.
si j’ai mal compris, alors, sois patient et explique-moi en détail d’où viennent mes erreurs.

sur ta deuxième remarque, évidemment que je veux que le temps défile pendant qu’il cherche, sinon, aucun intérêt !
à partir du début, les 40 secondes doivent défiler ! Et dès qu’elles sont atteintes, c’est perdu.
Je pourrais faire défiler 35 secondes, et demander la réponse à ce moment là, mais si on la trouve en 4 secondes, je voudrais interrompre le temps.

deux threads, me semble la solution, mais je ne sais pas du tout comment faire ça.

La doc sur les threads est tres bien foutue.

++
Bussiere

Merci Bussiere, tes liens sont toujours très chauds !
En tout cas j’ai cliqué dessus, et, houla…
Celui d’avant était aussi houlaesque ! (le 6.0.6.1 un truc de ce genre)

Je crois que je vais abandonner cette idée… je crois, pas de certitude !

Hahaha, tu comprends meme pas l’idée d’un while/sleep et tu veux te lancer dans les threads. Bon courage.

Le plus simple, ca reste encore de repenser un peu le truc pour n’avoir qu’une seule action bloquante. Et pas 2. (Input ou sleep).

je comprends le while, et je comprends le sleep, mais c’était pour répondre à la personne précédente, et lui montrer que sa réponse ne fonctionnait pas.
pour l’instant j’ai quelque chose qui tourne, mais pas de décompte du temps ; ceci pour te répondre, voici mon code :

[code]import time
def tri(mot):
n=len(mot)
motliste=list(mot)
for i in range(n):
motliste[i]=mot[i]
for i in range(0,n-1):
min=motliste[i]
for j in range(i+1,n):
if motliste[j]<min :
min=motliste[j]
motliste[j]=motliste[i]
motliste[i]=min
mot=‹  ›.join(motliste)
return(mot)

n=int(input('Combien de joueurs êtes-vous ? ‹ ))
l=
for i in range(n):
print(‹ Nom du joueur ›,i+1, ›? ')
l.append(input())

print(l)

s=
for j in range(n):
s.append(0)

rep=‹ oui ›
while rep==‹ oui ›:
for j in range(n):
print(l[j],‹ quel mot voulez-vous faire trouver ? ›)
mot=input()
anagramme=tri(mot)
for i in range(10):
print(‹ \n\n ›)
for i in range(3,0,-1):
print(i)
time.sleep(1)
a=time.clock()
print(anagramme)
reponse=input(‹ Entrez votre reponse : ‹ )
while reponse!=mot and reponse!= › ›:
reponse=input(‹ FAUX ! Nouvelle réponse ? ‹ )
b=time.clock()
if reponse== › ›:
print(‹ Vous avez abandonné, houuuuu ›)
print(‹ la solution était ›,mot)
print(n-1,‹ points pour ›,l[j])
s[j]=s[j]+n-1
else :
print(‹ BRAVO ›)
print(‹ temps mis pour trouver la solution : ›,int(b-a),‹ secondes ›)
g=-1
while g==-1:
gagnant=input('Qui a trouvé ? ')
for k in range(n):
if l[k]==gagnant:
g=k
s[k]=s[k]+1
print(‹ 1 point pour ›,l[k])
rep=input(‹ Encore un tour ? (oui/non) ›)

print(‹ Voici les scores : ›)
for i in range(n):
print(l[i],s[i])
max=0
for i in range(n):
if s[i]>max:
max=s[i]
winner=l[i]
print(‹ \n\nC'est ›,winner,‹ qui a gagné\n\n ›)
input(‹ Appuyez sur « ENTER » pour terminer ›)
[/code]

donc j’ai quand même fait un petit quelque chose.

hé les gens calmos :slight_smile: Armitage3 a dit, dans un autre topic récent, que Python était choisi comme outil pour apprendre l’algo, normal qu’elle il fasse des erreurs d’algo :stuck_out_tongue:

edit: il ->elle. Je m’en doutais un peu mais dans le doute.

il<-elle.
mais sinon oui, merci de tempérer les ardeurs, il est vrai qu’il y a 10 jours je ne connaissais rien en Python.
j’ai quand même compris que rien de simple n’existait pour ma question, donc plutôt que de chercher des trucs plus compliqués, je préfère me limiter à ce que j’ai déjà fait, et dont je suis fière, n’en déplaise à certains.

N’hésite pas à mettre des commentaires dans ton code, déjà que Python c’est pas ce qu’il y a de plus lisible, alors sans commentaire… :devil:

Le plus facile que je vois c’est d’utiliser le signal “alarm”.
En gros tu dis à python “si je suis pas revenu dans 30 secondes, envoie la cavalerie”.

Le lien magique: Par ici

Ce qui donne:

#!/usr/bin/env python

import signal

machin = True

# Le truc qui va être appelé par le signal si le compte à rebour arrive à zero
def handler(signum, frame):
    print "too late!"
    machin = False

# Appelle moi handler à la fin du compte à rebour
signal.signal(signal.SIGALRM, handler)
# Au fait, c'est dans 5 secondes la fin du monde
signal.alarm(5)

while machin:
    # input était pas content chez moi, raw_input leve une exception à la fin s'il est pas content ... c'est pas très grave.
    foo = raw_input("Donne ta réponse: ")
    # Condition de victoire
    if (foo == 'pouet'):
        # On arrête le signal
        signal.alarm(0)
        machin = False
        print "Victoire"
print "fin du jeu"

Ha mais il n’y avait aucune ardeur dans ma reponse :slight_smile: Simplement, au vu de ce qu’elle a posté, y’a des trucs super basique d’algo qu’elle comprends pas, d’ou mon conseil de commencer par ca.

Et vu les reponses suivantes, c’est meme de cours d’archictecture logiciel qu’il faut prendre, comme le principe de fonctionnement des threads. En ayant connaissance de ca, elle aurait sut tout de suite qu’il n’y a pas de solution à « Je veux exécuter deux trucs en // avec un seul thread » :wink: (enfin si, y’a avec un scheduleur maison, mais c’est encore plus compliqué …)

Je sais pas quel livre lui conseiller, mais ca sert à rien de se perdre dans un langage, la c’est des cours generaux sur le fonctionnement des programmes, thread, semaphore, ordonnancement des instructions, pas d’execution … Toute la base du genie logiciel :slight_smile:

[quote=« fser, post:13, topic: 52676 »]
Le plus facile que je vois c’est d’utiliser le signal « alarm ».
En gros tu dis à python « si je suis pas revenu dans 30 secondes, envoie la cavalerie ».

Le lien magique: Par ici

[/quote]

Pratique ! Je savais pas que Python proposait de la création de thread aussi simplement.

Mais je maintiens mon conseil : faut comprendre comment ca fonctionne derriere pour vraiment progresser.

@cben76: je suis partagé. Autant j’aime bien ré-inventer la roue, autant je me dis que s’il faut comprendre tout ce qu’il y a en dessous, tu perds un peu de la beauté de l’abstraction.
Je trouve que la méthode signal fait un peu « boîte noire » et est assez facile à prendre en main.

Par contre ça fait pas « vraiment » de thread, en fait :slight_smile:

heu mais les threads c’est pas vraiment un truc qu’on apprend pour débuter. J’ai fait pas mal de Delphi et je n’ai jamais fait de threads bien que j’ai appris les principes à l’école.

En fait il faut trouver l’équivalent de DoEvents (VB) ou Application.ProcessMessages (Delphi) en Python.

L’algorithmie passe avant l’architecture logicielle. J’avais débuté en Pascal et on n’a abordé les threads, sémaphores, et autres qu’après avoir fait un minimum d’apprentissage en algo.

edit: ton lien a l’air effectivement d’être une solution. Les docs de python sont biens mais elles ont un gros défaut, les exemples réduits à leur stricte minimum.

J’ai trouvé, après avoir lu ton lien, ça.

edit2:

[quote=“gmargaro, post:17, topic: 52676”]Je dirais qu’avant de ce lancer dans un language, il faudrait qu’elle écrive tout son algo en “pseudo-code”. Ça aide au début.
[/quote]C’est vrai que j’ai oublié cette étape d’apprentissage que j’avais eu.

Je dirais qu’avant de ce lancer dans un language, il faudrait qu’elle écrive tout son algo en “pseudo-code”. Ça aide au début.

Oui, quand je dis Thread, je pense pas à la syntaxe de création des threads, mais au fonctionnement de l’execution d’un programme, avec le scheduling et la synchro. Et tu peux tout a fait le faire en pseudo code, comme suggeré par gmargaro. C’est comme ca que j’ai appris :slight_smile:

Mais je suis d’accord, c’est un bon compromis la, et ca permet de piger qu’un truc s’execute en // et reprends la main a un moment donné.

Alors c’est du scheduling :wink:

Oops, en fait je viens de voir que ça ne marchait que sous les unix … Pas glop pour le coup python, ils auraient pû hooker pour windows histoire que tout le monde ait les mêmes fonctionnalitées!

Y a pas un truc de style “kbhit” en python?