2013-10-30 106 views
0

我是Haskell的新手,我必须实现一个简单的tic tac脚趾游戏。它不需要AI。从矩阵中替换元素(Haskell)

我需要更新我的矩阵,但我不知道该怎么做。

这里是我的蹩脚的代码:

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:/

回答

2

由于默认的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))] 
+0

非常感谢!我会尝试,后来我发布结果。 :) – Celso

2

有上,你可以使用数组一个(//)功能设定新的价值。

+0

谢谢!我想我会很快阅读文档。 :D – Celso