IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Haskell Discussion :

Une horloge d'échecs en Haskell


Sujet :

Haskell

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Janvier 2007
    Messages : 65
    Par défaut Une horloge d'échecs en Haskell
    Salut!
    Je cherche à réaliser une horloge pour jouer aux échecs.
    Il s'agit juste d'afficher deux compteurs, un pour les blancs l'autre pour les noirs.
    Chaque compteur est incrémenté alternativement en frappant sur la barre espace.
    Facile?
    Pas si sur! Il y a des entrées, des sorties, des compteurs... Toutes choses qu'Haskell n'aimes pas trop.
    Comment l'auriez vous fait?

    J'ai voulu utiliser la paresse d'Haskell.
    L'idée est de créer une liste paresseuse des dates auquelles on tape sur la barre espace.
    On passe ensuite cette liste à une fonction d'affichage qui en extrait les affichages de compteurs.

    Quelques préliminaires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    {-# LANGUAGE GeneralizedNewtypeDeriving, 
    			TypeSynonymInstances, 
    			NoMonomorphismRestriction,
    			FlexibleInstances,
    			FlexibleContexts,
    			FunctionalDependencies,
    			TypeSynonymInstances,
    			MultiParamTypeClasses,
    			EmptyDataDecls,
    			UndecidableInstances,
    			ScopedTypeVariables#-}
     
     
    module Main (main) where
    import Control.Arrow
    import Data.Maybe
    import Data.IORef
    import Control.Concurrent
    import Text.Printf
    import Data.Time
    import Data.List
    import System.IO.Unsafe
    import System.IO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    data Chrono = Chrono !NominalDiffTime !NominalDiffTime deriving (Eq, Show)
    data Couleur = Blanc | Noir deriving (Eq, Show)
     
    evens [] = []
    evens [x] = [x]
    evens (x:_:xs) = x : evens xs
     
    odds [] = []
    odds [x] = []
    odds (_:x:xs) = x : odds xs
     
    --sépare une liste en éléments pairs et impairs
    cleave xs = (evens xs, odds xs)
     
    --times elapsed in each turns by white or black
    timetables l = cleave $ zipWith diffUTCTime (tail l) l
     
    --current chrono for white and black from the list of timestamps
    times :: [UTCTime] -> Chrono
    times l = uncurry Chrono $ times' l where 
    	times' l = (sum *** sum) (timetables l)
     
    --list of timestamps each time we press space bar
    buildList :: [IO UTCTime]
    buildList = (getChar >> getCurrentTime) : buildList
     
    --HORREUR on utilise unsafePerformIO!!
    unsafeList :: [UTCTime]
    unsafeList = map unsafePerformIO buildList
     
    timesClock = map times (drop 2 (inits unsafeList))
     
    main = do
    	 hSetBuffering stdin NoBuffering
    	 hSetBuffering stdout NoBuffering
    	 hSetEcho stdout False
    	 mapM print timesClock
    	 putStrLn "fin"
    Dans ce code cela vous a jaillit à la figure, horreur, un unsafePerformIO!!
    Comment s'en débarrasser?
    Toutes les tentatives que j'ai faites soit n'affichaient rien, soit affichaient une infinité de chrono à zéro.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Par défaut
    Bon bah, dans ce genre de cas, le style impératif peut venir à la rescousse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    import Data.Time.Clock
     
    type Player = (String, NominalDiffTime)
     
    updateClock :: NominalDiffTime-> IO NominalDiffTime
    updateClock accTime = do
        initTime <- getCurrentTime
        getChar -- wait for user input
        endTime <- getCurrentTime
        return $ accTime + (diffUTCTime endTime initTime)
     
    waitPrint :: (Player, Player) -> IO (Player, Player)
    waitPrint ((aName,aCounter), bCounter) = do
        aCounter' <- updateClock aCounter
        putStrLn $ aName ++ " : " ++ show aCounter'
        waitPrint (bCounter, (aName,aCounter'))
     
    main :: IO ()
    main = do
        thisDay <- getCurrentTime
        let initTime = diffUTCTime thisDay thisDay
        waitPrint (("Joueur a", initTime), ("Joueur b",initTime))
        return ()
    Vu que getCurrentTime est déjà dans IO, autant pousser le vice jusqu'au bout. WaitPrint fait une recursion infinie, pour arrêter le programme: CTRL+C.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Janvier 2007
    Messages : 65
    Par défaut
    Super TwinSide c'est ce que je voulais.
    Je vais maintenant essayer de faire deux petites horloges dont une s'incrémente toutes les secondes... A l'aide d'un deuxième thread certainement.

Discussions similaires

  1. Créer une horloge
    Par luuuuuc dans le forum Access
    Réponses: 13
    Dernier message: 03/01/2007, 13h55
  2. Permettre la modofication d'une horloge
    Par cari dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 24/01/2006, 17h01
  3. [UseCase Diagram] Représentation d'une horloge
    Par eXiaNazaire dans le forum Cas d'utilisation
    Réponses: 18
    Dernier message: 09/01/2006, 18h47
  4. Recuperer heure d'une horloge atomique (Internet) ?
    Par Mailgifson dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/07/2004, 12h00
  5. Calculer la période d'une horloge
    Par barthelv dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 08/03/2004, 16h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo