написанная правда фигово с точки зрения того же ООП:)
смысл - посмотреть, как юзаются классы с F#)
module BoneGame open System open System.Collections.Generic #light type UserInterface () = member x.Roll : bool = printfn "Вы будете бросать кубик?" x.QuestYN member x.PrintState (data : list) : unit = for e in data do printfn "%s" <| e member x.QuestYN : bool = printf "Ваше решениие(Y или N): " match Console.ReadLine() with | "Y" | "y" -> true | "N" | "n" -> false | _ -> x.QuestYN member x.Win : unit = printfn "Поздравляем, Вы выйграли!!!" Console.ReadKey () |> ignore member x.Louse (name : string) : unit = printfn "Вы проиграли! Выйграл %s." name Console.ReadKey () |> ignore member x.GeneratePlayerList : list = printf "Введите имя игрока: " let name = Console.ReadLine() printfn "Будут ещё игроки?" if x.QuestYN then name :: x.GeneratePlayerList else [name] type Player (name : string, score : int, UI : UserInterface) = let name = name let ui = UI let mutable score = score member x.Name with get () = name member x.UI with get () = ui member x.Score with get () = score and set v = score <- v + score member x.Roll : bool = ui.Roll type Game () = let intrf = UserInterface () let mutable Players = new Queue () do let p_name = intrf.GeneratePlayerList for e in p_name do Players.Enqueue ( new Player (e, 0, intrf)) let max_score = 100 let bone_roll = (new Random (int(DateTime.Now.Ticks))).Next(1, 6) member x.Start : unit = let mutable end_flag = true while end_flag do // выбираем игрока, чья очередь бросать кости let current_player = Players.Dequeue () let mutable sum = 0 let mutable flag = true Console.Clear () // !!!!!!!!!!!!!! // выводим данные о игровой ситуации current_player.UI.PrintState ["Бросает " + current_player.Name; "Очков у игрока: " + current_player.Score.ToString (); "--------------------";] for e in Players do current_player.UI.PrintState ["Противник " + e.Name; "Очков " + e.Score.ToString ()] current_player.UI.PrintState ["--------------------"] Console.ReadKey () |> ignore Console.Clear () // бросок игрока current_player.UI.PrintState ["Будете бросать?"] while flag && current_player.Roll do let r = (new Random (int(DateTime.Now.Ticks))).Next(1, 6) current_player.UI.PrintState ["Вы выбросили " + r.ToString () + " очков"] if r <> 1 then sum <- sum + r current_player.UI.PrintState ["За ход вы набрали " + sum.ToString () + " очков"] else flag <- false sum <- 0 current_player.UI.PrintState ["К сожалению ваши очки, набранные за ход обнуляются"] Console.ReadKey () |> ignore current_player.Score <- sum // обрабатываем результаты броска if current_player.Score < max_score then Players.Enqueue (current_player) // продолжаем игру else current_player.UI.Win |> ignore for e in Players do e.UI.Louse |> ignore end_flag <- false [ ] let main _ = printfn "Приветствуем вас в игре Кости!" let G = new Game () G.Start Console.ReadKey() |> ignore 0
Комментариев нет:
Отправить комментарий