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)
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.
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 !
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]
hé les gens calmos 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
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.
#!/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 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 » (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
[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 ».
@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
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.
[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.
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
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é.
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!