課題9

○×ゲームを作りなさい。

これは、対戦ゲームなので、例えば次のようにゲームが進行する。 (先攻は○とする)
  1. 先攻が、記入位置を入力する
  2. その位置に、○を記入した盤面を表示する
  3. 後攻が、記入位置を入力する
  4. その位置に、×を記入した盤面を表示する
  5. どちらかが勝つか盤面が埋まるまで、1)〜4)を繰り返す

*Main> gameStart
turn o > 1,1
---
-o-
---
turn x > 0,0
x--
-o-
---

turn o > 0,2
x-o
-o-
---

turn x > 1,0
x-o
xo-
---

turn o > 2,0
x-o
xo-
o--

Winner o


補足1) 「○×ゲーム」とは

3x3マスの盤に、○と×を交互に記入していき、○か×が縦横斜めのいずれかに3つ並べば、並んだ方の勝ち。

補足2) 位置を入力する関数

入力については、getCharについて簡単に説明しただけなので、 ○×を記入する位置を、入力するための関数の例を以下に示す。 これをそのまま使っても良いし、参考にして自分で考えても良いことにする。

なお、文字(型Char)を整数(型Int)にするなどのため、モジュールData.Charの関数を使っている。 そのため、1行目の"import Data.Char"をファイルの最初に書いておくこと。


import Data.Char

type Position = (Int, Int)

getInteger :: String -> Int -> (Int, String)
getInteger [] x = (x, [])
getInteger (c:cs) x | isDigit c = getInteger cs (10*x + digitToInt c)
                    | otherwise = (x, cs)

makePosition :: String -> Position
makePosition s1 = (x, y)
where (x, s2) = getInteger s1 0
(y, s3) = getInteger s2 0

valid :: Position -> Bool
valid (x, y) = (0 <= x && x <= 2) && (0 <= y && y <= 2)

getPosition :: IO Position
getPosition = do putStr "please input: "
                str <- getLine
                (x,y) <- return (makePosition str)
                if valid (x, y) then return (x, y) else getPosition


おわり