Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function haskell Tictatoe游戏_Function_Haskell_Tic Tac Toe - Fatal编程技术网

Function haskell Tictatoe游戏

Function haskell Tictatoe游戏,function,haskell,tic-tac-toe,Function,Haskell,Tic Tac Toe,我正在尝试在haskell中构建一个tic-tac-toe游戏,但我在Haswen的函数方面遇到了问题。如果对于给定的玩家p和游戏板bs,该函数应返回True,否则返回False 代码如下: Int -> [((Int,Int),Int)] -> Bool haswon p [((a,d), x), ((b,e), y), ((c,f), z)] = (x == y && y == z && x == p) && ( ((a == b)

我正在尝试在haskell中构建一个tic-tac-toe游戏,但我在Haswen的函数方面遇到了问题。如果对于给定的玩家
p
和游戏板
bs
,该函数应返回
True
,否则返回
False

代码如下:

Int -> [((Int,Int),Int)] -> Bool
haswon p [((a,d), x), ((b,e), y), ((c,f), z)] = (x == y && y == z && x == p) && ( ((a == b) && (b == c)) || ((d == e) && (e == f)) || ( (a == d) && (b == e) && (c == f) && (a /= b) && (b /= c)) || ( (a == f) && (c == d) && (b==e)&&(a/=b)&&(b/=c)) )
你能告诉我,对于一个大于3个元素的输入列表,我该如何概括它? 例如,输入可以是:
[((1,1),1),((1,2),1),((2,1),2),((2,2),2),((3,1),1),((3,2),1),((3,3),2)]
。 多谢各位

代码如下:

Int -> [((Int,Int),Int)] -> Bool
haswon p [((a,d), x), ((b,e), y), ((c,f), z)] = (x == y && y == z && x == p) && ( ((a == b) && (b == c)) || ((d == e) && (e == f)) || ( (a == d) && (b == e) && (c == f) && (a /= b) && (b /= c)) || ( (a == f) && (c == d) && (b==e)&&(a/=b)&&(b/=c)) )
以下是我的看法:

让我们首先定义适当的数据类型:

data Player = Black | White deriving (Eq, Show)
data Position = Position Int Int deriving (Eq, Show)
data Move = Move { position :: Position, player :: Player } deriving (Eq, Show)
现在,实际函数只计算有资格获胜的行数

hasWon :: Player -> [Move] -> Bool
hasWon p ms = (length $ winningLines p ms) > 0
获胜的一代是一个很大的理解:

winningLines p ms = [(x,y,z) | x <- ms,
                               y <- ms,
                               z <- ms,
                               oneLine (position x) (position y) (position z),
                               samePlayer (player x) (player y) (player z),
                               x /= y,
                               y /= z,
                               x /= z
                     ]

samePlayer px py pz = px == py && py == pz

oneLine (Position x1 y1) (Position x2 y2) (Position x3 y3) = sameRow || sameCol
    where
        sameRow = (y1 == y2 && y2 == y3)
        sameCol = (x1 == x2 && x2 == x3)
解决方案只使用了基础知识,因此您应该能够非常轻松地理解它并添加自己的修复程序;它仍然缺少对角线(很容易添加),并且它将所有行计算6次(因为它考虑了所有的排列;很容易用
Ord
实例修复位置,并且只考虑了“排序的三元组”)


当然,这不是唯一的办法;一个值得注意的替代方法是将其放入一个数组中,然后迭代地找到解决方案。不过,我认为Prolog风格的声明式风格更适合Haskell。

有三种组合可以让玩家获胜——行、列和对角。也许可以从概括每一个开始,并将它们结合在一起?