我正在开发一个程序,接收如下输入的棋盘游戏:
#####
#_ ##
# ##
# #
# .#
#####
1 4 (player initial position, marked with '_')
收到输入后,程序将其转换为[String]。
这种情况,它将是: [“#####”,“#_ ##”,“###”,“##”,“#。#”,“#####”,“1 4”]
如何访问位置[1,4]并将'_'转换为'o'? 函数必须返回带有该转换的初始列表。
非常重要的注意事项:'_'永远不会显示在输入上,我只用它来清楚位置[1,4]的位置(因此,在输入时我们只看到一个空格,'')< / strong>
答案 0 :(得分:1)
似乎是在线编码游戏可能需要解决的其中一项任务。正如其他人所指出的那样,列表并不适合处理这样的坐标。但是,如果你不能使用更好的库(比如在编码游戏中),你将不得不做更多的工作。
以下是我ghci
会话的代码(转换为正确的程序留给读者练习......):
let input = ["#####", "#_ ##", "# ##", "# #", "# .#", "#####", "1 4"]
let reverseInput = reverse input
let position = head reverseInput
let board = tail reverseInput
let posX = read $ takeWhile (/=' ') position :: Int
let posY = read $ takeWhile (/=' ') $ reverse position :: Int
let (unchangedBoard, changedBoard) = splitAt posY board
let (unchangedRow, changedRow) = splitAt posX $ head changedBoard
let newRow = unchangedRow ++ "o" ++ tail changedRow
let newBoard = unchangedBoard ++ [newRow] ++ tail changedBoard
let finalOutput = reverse newBoard
mapM_ putStrLn finalOutput
另请注意,此代码非常脆弱,因为它在整个地方使用部分函数(tail
,head
,read
)。您可以尝试使用模式匹配来使代码更加健壮。