我正在尝试制作一个井字游戏,用户输入一个2位数的数字。第一个数字是位置,第二个数字是X和O的1或0。我一直在寻找如何更改列表中的项目,但只能找到如何附加或连接项目。
open System
let mutable game = [ 1; 2; 3; 4; 5; 6; 7; 8; 9 ]
let mutable won = false
while not won do
printfn "%A" game
let pos = Convert.ToInt16(Console.ReadLine())
// game.[pos.[0]] <- pos.[1] doesn't work
Console.ReadKey() |> ignore
答案 0 :(得分:3)
当您将变量标记为可变变量时(例如game
),这意味着您可以通过为其分配一个新值(即game <- [...]
)来对该变量本身进行突变,但是它确实可以不能使数据结构本身可变。就您而言,列表仍然是不变的。
一种使结构与您的结构相似的方法是生成一个新列表,其中输入索引处的值已更改,而所有其他值均与以前相同。您可以使用List.mapi
进行此操作(我还更改了字符串的解析方式):
let pos, value = int (input.[0]), int (input.[1])
game <- game |> List.mapi (fun i v -> if i = pos then value else v)
一种替代方法是使用可变数组-这样,您可以在给定索引处对元素进行突变,但是如果您正在学习F#,则坚持使用功能数据结构是个好主意。
答案 1 :(得分:-2)
您需要一些排序算法,例如 inserttion 排序。这样,您就可以跟踪匹配矩阵中的哪些对。