Æü´©·Á¼°¤ÇHaskell¤Ê¤É¤Ë¤Ä¤¤¤Æ¤Îµ»ö¤ò¤À¤é¤À¤é¤È·ÇºÜ¤·¤È¤ê¤Þ¤¹¡£
2005 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 06 | 07 | 08 | 09 | 11 |
2007 | 03 | 04 | 05 | 07 | 08 | 09 | 12 |
2008 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 03 | 05 | 06 | 09 | 10 | 11 | 12 |
2010 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2011 | 01 | 02 | 05 |
2004ǯ08·î03Æü(²Ð) ĶÁ°±ÒŪ¥²¡¼¥à¥×¥í¥°¥é¥ß¥ó¥°ÊýË¡ÏÀ¶
ºÇ¶á»þ´Ö¤¬Ìµ¤¯¤ÆÊ¸¾Ï¤ò½½Ê¬¤Ë¿äÚʤǤ¤Ê¤¤¡Ä
¢£[Haskell][Game]¤½¤Î1³¤

ºòÆü¤Î³¤¡£
·Ñ³¤òÍѤ¤¤ÆÊÂÎóŪ¤Ê½èÍý¤Îµ½Ò¤ò¹Ô¤¦¤È¤¤¤¦¤³¤È¤Ç¤¢¤Ã¤¿¡£
º£²ó¤Ï¤½¤Î¶ñÂÎŪÊýË¡¤Ë¤Ä¤¤¤Æ½Ò¤Ù¤ë¡£
¤³¤ÎÊýË¡¤Î´ðËÜŪ¤Ê¥¢¥¤¥Ç¥¢¤ÏHaskell¤ÎPrelude¤Ë¤¢¤ëinteract¤Ç¤¢¤ë¡£
¤³¤Î¥Ú¡¼¥¸¤Ç¤â¤¿¤Ó¤¿¤Ó¼è¤ê¾å¤²¤Æ¤¤¤ë¤Î¤Ç¾Ü¤·¤¯¤Ï¤½¤Á¤é¤ò¸«¤Æ¤â¤é¤¦¤È¤·¤Æ¡¢
¤ï¤«¤ëÊý¤Ï¤â¤¦¤³¤ì¤À¤±¤Ç¤ï¤«¤Ã¤Æ¤·¤Þ¤¦¤Î¤Ç¤Ï̵¤¤¤«¤È»×¤¦¡£
interact¤ÇÃٱ䤹¤ëÆþÎϤËÂФ·¤Æ½ÐÎϤòÄêµÁ¤¹¤ë¤È¡¢
¤½¤Î½ÐÎϤâÃٱ䤹¤ë¤Î¤Ç¤½¤ì¤òÍѤ¤¤Æ¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê
¥×¥í¥°¥é¥à¤¬ºî¤ì¤ë¤Î¤Ç¤¢¤ë¤¬¡¢¤½¤ì¤ÈƱ¤¸¤Ç¥²¡¼¥à¤Ç¤â
Ãٱ䤹¤ëÆþÎϤËÂФ·¤Æ¤½¤Î¥ê¥¢¥¯¥·¥ç¥ó¤¬ÄêµÁ¤Ç¤¤ì¤Ð
½ÐÎϤâÃٱ䥹¥È¥ê¡¼¥à¤Ë¤¹¤ë¤³¤È¤¬½ÐÍè¤ë¤Î¤Ç¤¢¤ë¡£
(¤³¤Î¥Ú¡¼¥¸¤ÎºÇ½é¤Î¤³¤í¤Ë½ñ¤¤¤¿¿ôÅö¤Æ¥²¡¼¥à¤ò¸«¤Æ¤â¤é¤¨¤ë¤È¡£)
interact¤Ë¤ÆÃٱ䤹¤ëÆþÎϤÏɸ½àÆþÎϤ«¤é¤ÎÆþÎÏʸ»úÎó¤Ç¤¢¤ë¡£
¥ê¥¢¥ë¥¿¥¤¥àÆþÎϤˤÆÉ¬Íפˤʤë¤Î¤Ï³Æ¥Õ¥ì¡¼¥à¤Î¥¡¼¾õÂ֤ˤʤë¤Î¤Ç¡¢
ÆþÎϤȤ·¤Æ¥¡¼¾õÂ֤Υꥹ¥È¤ò°ú¤ÃÄ¥¤Ã¤Æ¤³¤ì¤Ð¤è¤¤¡£
¥¤¥á¡¼¥¸¤È¤·¤Æ¤Ï¡¢Éô֤¿¤È¤¨¤Ð60²ó¤Î³ä¹ç¤Ç¤Ô¤ç¤³¤Ô¤ç¤³¿¤Ó¤ë¥ê¥¹¥È¤¬
ÆþÎϤǤ¢¤ë¤è¤¦¤Ê´¶¤¸¤Ç¤¢¤í¤¦¤«¡£¡£
¤È¤ê¤¢¤¨¤º¡¢interact¡Ä¤È¤¤¤¦¤«getContents¤ÎSDLÈǤȤǤâ¸À¤¦¤â¤Î
¤ò¼ÂÁõ¤·¤Æ¤ß¤ë¡£
getKeys :: IO [ [SDLKey] ] getKeys = do pumpEvents ks <- getKeyState delay 100 -- µÙ¤ß»þ´Ö¤ÏŬÅö kss <- getKeys return $ ks:kss
¥á¥Ã¥»¡¼¥¸¤ò¥Ý¥ó¥×¤·¤Æ¡¢¥¡¼¾õÂÖ¼èÆÀ¤·¤Æ¡¢¾¯¤·µÙ¤ó¤Ç
ºÆµ¢¤¹¤ë¤è¤¦¤Ê´¶¤¸¤Ç¤¢¤ë¡£
¤¿¤À¤·¡¢¤³¤ì¤Ï¤³¤Î¤Þ¤Þ¤Ç¤Ï¤¦¤Þ¤¯¹Ô¤«¤Ê¤¤¡£
Á°¤ËÃÙ±äIO¤Ç½ñ¤¤¤¿¤¬(¤³¤ó¤Ê¤Î¤Ð¤Ã¤«¤ê¤ä¤Ê¡Ä)¡¢
¤³¤ì¤Ç¤ÏÃٱ䤷¤Æ¤¯¤ì¤Ê¤¤¤Î¤Ç¤¢¤ë¡£
¤½¤³¤Ç¡¢¤³¤ì¤ÎÄêµÁ¤Ï(¸Õ»¶½¤¤¤â¤Î¤òÍѤ¤)¼¡¤Î¤è¤¦¤Ë¤¹¤ëɬÍפ¬¤¢¤ë¡£
getKeys = unsafeInterleaveIO $ do pumpEvents ks <- getKeyState delay 100 kss <- getKeys return $ ks:kss
¤³¤ì¤Ç¡¢Ãٱ䤹¤ë¥¡¼¾õÂ֥ꥹ¥È¤ò¼èÆÀ¤¹¤ë¤³¤È¤¬½ÐÍè¤ë¡£
¤¢¤È¤Ï¡¢[ [SDLKey] ] -> [¤Ê¤Ë¤«]¤Ê´Ø¿ô¤òÄêµÁ¤¹¤ì¤Ð˾¤ß¤Î½èÍý¤ò½ñ¤¯¤³¤È¤¬½ÐÍè¤ë¤Î¤Ç¤¢¤ë¤¬¡¢
[SDLKey]¤ò¤½¤Î¤Þ¤Þ»È¤¦¤Î¤Ï¤Á¤ç¤Ã¤ÈÌÌÅݤʤΤǡ¢
data KeyState = Pushed | Pushing | Released | Releasing deriving (Eq,Show) mkKeyProc (bef,cur) k | not bp && not cp = Releasing | not bp && cp = Pushed | bp && not cp = Released | bp && cp = Pushing where bp = k `elem` bef cp = k `elem` cur
¤³¤Î¤è¤¦¤Ê¤â¤Î¤ò¤Ä¤¯¤ê¡¢
main = do ... getKeys >>= process ... process dat = processReaction $ game funcs where funcs = map mkKeyProc $ zip ([]:dat) dat processReaction :: [¤Ê¤Ë¤«] -> IO () ... game :: [SDLKey -> KeyState] -> [¤Ê¤Ë¤«] ...
¤³¤Î¤è¤¦¤Ë¤¹¤ì¤Ð²¡¤·¤¿½Ö´Ö¤Ê¤É¤â¤ï¤«¤ê´öʬ¤ï¤«¤ê¤ä¤¹¤¤¡£
game¤¬¥²¡¼¥à¤ÎÄêµÁ¤È¤Ê¤ë¤¬¡¢¤É¤Î¤è¤¦¤Ê´¶¤¸¤Ë¤Ê¤ë¤Î¤«Å¬Åö¤Ëºî¤Ã¤Æ¤ß¤¿¡£
game = entryPoint entryPoint (s:ss) | s SDLK_z == Pushed = nextPoint ss | otherwise = "I am in the entry point.":entryPoint ss nextPoint (s:ss) | s SDLK_x == Pushed = entryPoint ss | s SDLK_a == Pushed = ["The end."] | otherwise = "Here is next point":nextPoint ss
Á´¤¯¥²¡¼¥à¤Ç¤Ï¤Ê¤¤¤¬¡Ä
¾å¥³¡¼¥É¤Ë¤Æ[¤Ê¤Ë¤«]¤Ï[String]¤È¤·¤Æ¤¤¤ë¤¬¡¢
(processReaction = mapM_ putStrLn ¤È¤Ç¤â¤·¤Æ¤ª¤¯)
Ê̤˲¿¤Ç¤â¤¤¤¤¤Î¤Ç¡¢[IO()]¤È¤«¤È¤¹¤ì¤Ð²¿¤Ç¤â½ÐÍè¤ë¤Ç¤¢¤í¤¦¡£
(ÆþÎϤϾå¤Î¤Þ¤Þ¤Ç¤Ï½ÐÍè¤Ê¤¤¤Î¤Ç¡¢Â¾¤Ë¹Í¤¨¤ëɬÍפ¬¤¢¤ë¤±¤É)
ºÇ½éentryPoint¤Ë¤¤¤Æ¡¢z¥Ü¥¿¥ó¤¬²¡¤µ¤ì¤ë¤ÈnextPoint¤Ë°Ü¹Ô¡¢
nextPointÃæ¤Ë¤Æx¤¬²¡¤µ¤ì¤ë¤ÈentryPoint¤Ë°Ü¹Ô¡¢
a¤¬²¡¤µ¤ì¤ë¤È¥ê¥¹¥È¤¬½ª¤ï¤ë¡£
(¤³¤³¤Ç¥ê¥¹¥È¤ò½ª¤ï¤é¤»¤ë=¥×¥í¥°¥é¥à¤¬½ª¤ï¤ë¤È¤Ê¤ë¤³¤È¤¬
¸Ä¿ÍŪ¤Ë¤Á¤ç¤Ã¤ÈÌÌÇò¤«¤Ã¤¿)
¾å¥³¡¼¥É¤Ï¥×¥í¥°¥é¥à¤ÎÊÂÎóÀ¤Ë¤Ä¤¤¤Æ¤Ï²¿¤âµ½Ò¤·¤Æ¤¤¤Ê¤¤¤¬
(Á°²ó¤Îyield()¤ËÁêÅö¤¹¤ë¤â¤Î¤È¤«)
ÃÙ±äɾ²Á¤µ¤ì¤ë¤Î¤Ç¡¢°ì¥Õ¥ì¡¼¥à¤´¤È¤ËɬÍפʷ׻»¤Î¤ß¤¬¤Ê¤µ¤ì¤Æ¡¢
¼ÂºÝ¤Ë¤ÏËè¥Õ¥ì¡¼¥à¼Â¹Ô¤¬ÃæÃǤµ¤ì¤ë¤è¤¦¤Ë¿¶Éñ¤¦¤Î¤Ç¤¢¤ë¡£
¤â¤Á¤í¤ó¡¢¤³¤ì¤ò¤³¤Î¤Þ¤Þ°ìÈÌŪ¤Ê¥²¡¼¥à¤Î¼ÂÁõ¤È¤·¤Æ»È¤¦¤Î¤Ï
¤Þ¤À¤ä¤ê¤Ë¤¯¤¤¤È»×¤¦¤Î¤Ç¡¢¤½¤Î½õ¤±¤Ë¤Ê¤ë¤è¤¦¤ÊÉÁ²è¥·¥¹¥Æ¥à¤ò
¹Í¤¨¤ë¤³¤È¤Ë¤¹¤ë¡£
(³¤¯¡Ä)