написанная правда фигово с точки зрения того же ООП:)
смысл - посмотреть, как юзаются классы с 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
Комментариев нет:
Отправить комментарий