Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
Haskell小游戏:检查迷宫的可解性(更新) check::String->Int->Int->IO() 选中映射len n=do 让current=searchMap'@' if(洪水图当前向上长度n) 然后printf“\n此映射是可解的。\n” else printf“\n此映射无法解决。\n” 洪水:字符串->整数->方向->整数->整数->布尔 洪水图水流直达长度n=do let Upper=电流-n let向下=电流+n 设向左=电流-2 设向右=电流+2 如果(当前len | |(map!!当前)=='*'| |(map!!当前)=='x') 那就错了 如果(map!!current)='t' 那是真的 否则会 直接案例 向上->做 让newMap=replaceSign映射当前“x” (洪水图向上len n)| |(洪水图向左len n)| |(洪水图向右len n) 向下->做 让newMap=replaceSign映射当前“x” (洪水图向下延n)| |(洪水图向左延n)| |(洪水图向右延n) 左X->do 设行=芬德罗当前n 0 如果当前do 设行=芬德罗当前n 0 如果当前>=((行+1)*n) 那就错了 否则会 让newMap=replaceSign映射当前“x” (向上向上的洪水图len n)| |(向下向上的洪水图len n)| |(向右的洪水图len n)_Haskell_Recursion_Functional Programming - Fatal编程技术网

Haskell小游戏:检查迷宫的可解性(更新) check::String->Int->Int->IO() 选中映射len n=do 让current=searchMap'@' if(洪水图当前向上长度n) 然后printf“\n此映射是可解的。\n” else printf“\n此映射无法解决。\n” 洪水:字符串->整数->方向->整数->整数->布尔 洪水图水流直达长度n=do let Upper=电流-n let向下=电流+n 设向左=电流-2 设向右=电流+2 如果(当前len | |(map!!当前)=='*'| |(map!!当前)=='x') 那就错了 如果(map!!current)='t' 那是真的 否则会 直接案例 向上->做 让newMap=replaceSign映射当前“x” (洪水图向上len n)| |(洪水图向左len n)| |(洪水图向右len n) 向下->做 让newMap=replaceSign映射当前“x” (洪水图向下延n)| |(洪水图向左延n)| |(洪水图向右延n) 左X->do 设行=芬德罗当前n 0 如果当前do 设行=芬德罗当前n 0 如果当前>=((行+1)*n) 那就错了 否则会 让newMap=replaceSign映射当前“x” (向上向上的洪水图len n)| |(向下向上的洪水图len n)| |(向右的洪水图len n)

Haskell小游戏:检查迷宫的可解性(更新) check::String->Int->Int->IO() 选中映射len n=do 让current=searchMap'@' if(洪水图当前向上长度n) 然后printf“\n此映射是可解的。\n” else printf“\n此映射无法解决。\n” 洪水:字符串->整数->方向->整数->整数->布尔 洪水图水流直达长度n=do let Upper=电流-n let向下=电流+n 设向左=电流-2 设向右=电流+2 如果(当前len | |(map!!当前)=='*'| |(map!!当前)=='x') 那就错了 如果(map!!current)='t' 那是真的 否则会 直接案例 向上->做 让newMap=replaceSign映射当前“x” (洪水图向上len n)| |(洪水图向左len n)| |(洪水图向右len n) 向下->做 让newMap=replaceSign映射当前“x” (洪水图向下延n)| |(洪水图向左延n)| |(洪水图向右延n) 左X->do 设行=芬德罗当前n 0 如果当前do 设行=芬德罗当前n 0 如果当前>=((行+1)*n) 那就错了 否则会 让newMap=replaceSign映射当前“x” (向上向上的洪水图len n)| |(向下向上的洪水图len n)| |(向右的洪水图len n),haskell,recursion,functional-programming,Haskell,Recursion,Functional Programming,我正在做一个项目,需要做一个小游戏。玩家需要输入一张地图。 大概是这样的: * * * * * - - - - - - - - - - - - - - - - - - - * * * * * * * * * * b - - - - - - - - - - - - - - - - - b * * * * * * * * * * - * * * * * * * * * * * * * * * * * - * * * * * * * * * * - * * - - - - * * * * * -

我正在做一个项目,需要做一个小游戏。玩家需要输入一张地图。 大概是这样的:

* * * * * - - - - - - - - - - - - - - - - - - - * * * * * 
* * * * * b - - - - - - - - - - - - - - - - - b * * * * * 
* * * * * - * * * * * * * * * * * * * * * * * - * * * * * 
* * * * * - * * - - - - * * * * * - - - - * * - * * * * * 
* * * * * - * * - y y - * * * * * - y y - * * - * * * * * 
* * * * * - * * - - - - * * * * * - - - - * * - * * * * * 
* * * * * - * * * * * * - - b - - * * * * * * - * * * * * 
* * * * * - * * * * * * - * * * - * * * * * * - * * * * * 
@ - - - - - * * * * * * - * * * - * * * * * * p - - - - t 
* * * * * - * * * * * * - * * * - * * * * * * - * * * * * 
* * * * * - - - - - - - - * * * - - - - - - - - * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *  
我在一个函数中挣扎,以确定映射是否可解。
在代码中,current表示程序正在尝试的当前位置len是包含贴图的字符串的长度n是地图一行的长度。在地图上,@表示球-表示球可以移动的道路b表示奖金冻结(与此问题无关)。*意味着障碍t表示目标p/o/y表示有特殊用途的拦网(球可以停在那里)。我目前的方法是使用函数try进行递归尝试。该功能将把已经尝试过的道路变成x,如果击中x,该功能将返回False。当函数遇到障碍(*)或地图边界时,它将尝试另外两个方向。例如,如果您当前正在向上移动。然后它将尝试LeftxRightx。如果它碰到特殊块(p/o/y),它将尝试其他三个方向。例如,如果您当前正在移动Rightx,则它将尝试向上移动向下移动,以及向右移动。但是,程序返回“异常:堆栈溢出”。我的算法有问题吗?如何解决此问题?

问题是,一旦搜索一直向上进行,那么地图看起来是这样的,当前位置在第一行最左边的
-

* * * * * - - - - - - - - - - - - - - - - - - - * * * * *
* * * * * x - - - - - - - - - - - - - - - - - b * * * * *
* * * * * x * * * * * * * * * * * * * * * * * - * * * * *
* * * * * x * * - - - - * * * * * - - - - * * - * * * * *
* * * * * x * * - y y - * * * * * - y y - * * - * * * * *
* * * * * x * * - - - - * * * * * - - - - * * - * * * * *
* * * * * x * * * * * * - - b - - * * * * * * - * * * * *
* * * * * x * * * * * * - * * * - * * * * * * - * * * * *
x x x x x x * * * * * * - * * * - * * * * * * p - - - - t
* * * * * - * * * * * * - * * * - * * * * * * - * * * * *
* * * * * - - - - - - - - * * * - - - - - - - - * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
您进入以下循环,没有对地图做进一步的
x
标记:

try map 10 Up ... =
  -- at top row, so we evaluate:
  (try map current Leftx len n) || ...
try map 10 Leftx ... =
  -- star to the left, so we evaluate:
  (try map current Up len n) || ...
try map 10 Up ... =
  -- at top row, so we evaluate:
  (try map current Leftx len n) || ...
-- and we're stuck in an infinite loop
堆栈最终溢出,因为Haskell正在跟踪
|
操作符的所有右侧,尽管它从未有机会尝试其中任何一个


我认为你需要修改你的算法来标记你已经尝试过的墙,或者可能从使用单一路径切换到所有非星型——如果你在洪水填充时击中目标,迷宫是可以解决的。

map
是一维列表吗?为什么在
Up
Down
时将
n
加到
newLoc
,而在
Rightx
Leftx
时将
2
加到
newLoc
上?什么是最小的映射,对于它,代码的行为不符合您的要求?映射是一维的,由于某种原因,给我的示例地图在水平方向上符号之间有一个空格,但在垂直方向上符号之间没有空格,所以我加或减2来水平移动。最小地图大小:在我分享的地图中,我没有尝试过其他地图,但失败了。顺便说一句,我已经用洪水填充方法更新了代码。但还是有同样的问题。仍然试图解决这个问题,我已经用洪水填充法更新了我的代码。它仍然存在堆栈溢出问题。我仍在努力修复它。