Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
74
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

4. Создание консольного приложения

Теперь продемонстрируем возможности языка F# на примере работы непосредственно с обычным консольным приложением и созданием на его основе простенькой игры. Суть будет заключаться в воде числовых ответов на вопрос типа число умножить на число. Игра будет выдавать случайные задания, число которых определяет пользователь. Правильные ответы будут учитываться в статистике. Итогом игры станет число верных ответов и время, затраченное на ответы.

Также в коде будем использовать русскоязычные имена.

Для начала нужно создать новый проект. Основу на этот раз станет тип проекта Visual F#: Приложение F#. Имя будет LWP21Console.

Рис. 4. 1. Вводим данные нового проекта «Приложение F#»

Но на самом деле, после создания такого проекта и ввода имени, мы увидим пустую страницу с кодом и один единственный файл в обозревателе решений (Program.fs):

Рис. 4. 2. Обозреватель решений: состав проекта приложения F# сформированного средой разработки

Пустота обусловлена отсутствием нормальных шаблонов в версии среды разработки Visual Studio 2010. Шаблоны приложений (в том числе и консольного) можно получить, например на официальном блоге разработчик F# (Visual Studio F# Team Blog).

Рис. 4. 3. Блог команды разработчиков F#: шаблон консольного приложения

Загруженный с сайта шаблон устанавливается в «один клик» (специальное расширение файла, запускает встроенный установщик Visual Studio):

Рис. 4. 4. Пример установленного шаблона консольного приложения для F#

Либо можно поискать шаблоны в сети Интернет (окно Создать проект -> Шаблоны в Интернете):

Рис. 4. 5. Шаблоны в Интернете: доступные шаблоны

Вернёмся к нашему пустому приложению. Вставим туда следующий код игры:

// Open - объявление импорта указывает модуль или пространство имён,

// на элементы которого можно ссылаться без использования полного имени

open System

open System.Threading

// System.Console - System можно не писать

Console.Title <- "Консольное приложение (F#)"

let ввод() = Console.ReadLine()

let ожидание() = Console.ReadKey()

let преобразование = Int32.TryParse // Преобразуем ввод ответа в Int32

let использовать цвет f =

Console.ForegroundColor <- цвет

f()

Console.ResetColor()

let красный = ConsoleColor.Red

let зелёный = ConsoleColor.Green

let тёмножёлтый = ConsoleColor.DarkYellow

let сигнал() = Console.Beep()

let ждать(n:int) = Threading.Thread.Sleep n // Число секунд (n000)

let сейчас() = DateTime.Now

let случайно = Random()

let сообщение = ждать (1000)

использовать тёмножёлтый (fun () -> printfn "Добро пожаловать в игру \"Умножение на время\"!"

printfn "Пожалйста, ввидете число заданий для игры \"Умножение на вермя\""

printf "Число заданий = ")

let задания = Convert.ToInt32(ввод()) // Вводим число заданий

let игра время =

for сообщение in ["\nПриготовиться!"; "3"; "2"; "1"; "Поехали!\n"] // Выводим сообщения цикла последовательно, через одну секунду

do

printfn "%s" сообщение

ждать 1000

let начало = сейчас() // Фиксируем время старта

[1..время] |> Seq.sumBy (fun i -> // Фиксируем сумму правильных результатов (1), 0 - неправильные результаты

let a, b = случайно.Next 13, случайно.Next 13

printf "%d x %d = " a b

let введено = ввод()

match преобразование введено with

| true, ответ when ответ = a * b -> // Истина, если ответ верен (a * b)

использовать зелёный (fun () -> printfn "Правильно!")

1

| _, _ ->

сигнал()

использовать красный (fun () -> printfn "%d x %d = %d" a b (a*b))

0

) |> (fun счёт ->

let получить = (сейчас() - начало).ToString("c") // Получаем итоговое время и преобразуем в строку

// Подстановка параметров: сначала подставляем результат работы блока "[1.." (число верных ответов),

// потом общее число заданий "..время]" (число срабатывания блока),

// потом время на ответы

printfn "\nИгра завершена!\n%d правильных ответов из %d заданий, за время: %s.\n" счёт время получить

)

while true do

игра (задания) // Число заданий

ждать 5000

printfn "Играть снова?\nДля продолжения игры нажмите любую клавишу . . ."

ожидание() |> ignore

Код содержит все необходимые комментарии и достаточно понятен. После запуска и инициализации пространства имён (директива open), меняем заголовок приложения, затем инициализируем все необходимые функции (в данном случае с русскоязычными именами), выводим приветственные сообщения и вводим число заданий для игры. После ввода числа, запускается цикл, который посекундно выводит куски сообщения (...«2», «1» и «Поехали!»). printf выводит строку без добавления новой строки. Далее в том же цикле на основе числа заданий выводятся выражения типа «a умножить на b» со случайными a и b (диапазон от 0 до 12) и программа ждёт ввода ответа пользователя, этот ответ проверяется и выводится результат. Неправильный ответ вызывает также звуковой сигнал.

Сама игра продолжается по «вине» следующего цикла:

while true do

игра (задания) // Число заданий

После окончания игры выводится результат и сообщение о продолжении.

Компилируем приложение (Release) и запускаем.

Рис. 4. 6. Результат работы консольного приложения игры «Умножение на время»