1

Haskell は初めてで、簡単な三目並べゲームを実装する必要があります。AIは必要ありません。

マトリックスを更新する必要がありますが、その方法がわかりません。

ここに私のくだらないコードがあります:

import Array

table :: Array (Int, Int) Char
table = array ((1,1),(3,3))
            [
            ((1,1), '0'), ((1,2), '0'), ((1,3), '0'),
            ((2,1), '0'), ((2,2), '0'), ((2,3), '0'),
            ((3,1), '0'), ((3,2), '0'), ((3,3), '0')
            ]

getGrid :: IO()
getGrid = do
    print (elems table)
    putStr "Escolha o numero da casa em que deseja jogar: "
    n <- getChar
    if isValid n == (0, 0) then
        getGrid
    else if (table ! isValid n) == '0'  then do
            putStr "\nProssiga: "
            getPlayer n
        else do
            putStr "\nCasa ocupada, tente novamente: "
            getGrid

getPlayer :: Char -> IO()
getPlayer n = do
    putStr "\nJogador X: "
    j <- getChar
    if (j /= 'b' && j /= 'B' && j /= 'p' && j /= 'P') then do
        getPlayer n
    else    do
        (table ! isValid n) = j
        getGrid


isValid :: Char -> (Int,Int)
isValid n
    | n == '0' = (1, 1)
    | n == '1' = (1, 2)
    | n == '2' = (1, 3)
    | n == '3' = (2, 1)
    | n == '4' = (2, 2)
    | n == '5' = (2, 3) 
    | n == '6' = (3, 1)
    | n == '7' = (3, 2)
    | n == '8' = (3, 3)
    | otherwise = (0, 0)

0 を他の値に置き換える方法がわかりません... :/

4

2 に答える 2

3

デフォルトの型は不変であるため、配列を in-placeで更新することはできません。Array

ただし、とにかくやりたいことをするのはとても簡単です。//演算子 ( documentation ) を使用して、新しい配列を生成するだけです。

あなたはするかもしれません:

setValue :: (Int, Int) -> Int -> Array -> Array
setValue (x,y) a ar = ar // [((x,y), a)]

たとえば、私のチェス コードには次のようなものがあります。

applyMove :: PieceMove -> Board -> Board
applyMove ((x,y), (a,b)) board = board // [((x,y), (Square Nothing)),
                                           ((x+a,y+b), board!(x,y))]
于 2013-10-30T23:50:48.723 に答える
2

(//)新しい値を設定するために使用できる配列の関数があります。

于 2013-10-30T23:48:53.107 に答える