Опубликован: 12.02.2014 | Уровень: для всех | Доступ: платный
Лекция 14:

Игры

< Лекция 13 || Лекция 14: 123 || Лекция 15 >

14.2. Игра "Поле чудес"

Игра "Поле чудес" заключается в следующем. Компьютер случайным образом выбирает слово из словаря и загадывает его пользователю. Пользователь должен угадать это слово. Он может ввести либо букву, либо сразу все слово. Если слово окажется неверным, то игра прекращается, пользователь проигрывает. В противном случае она продолжается до тех пор, пока слово не будет отгадано.

    open core, console

class facts
    word: (positive, string).
clauses
    word(1, "пароход").
    word(2, "паровоз").
    word(3, "самолет").
    word(4, "аэроплан").
    word(5, "корабль").
    word(6, "поезд").
    word(7, "дирижабль").
    word(8, "зонд").
    word(9, "аэростат").
    word(10, "стратостат").
    word(11, "ракета").
    word(12, "электровоз").

class facts
    number : positive := 0.
    currentWord : string := "".
    secretWord : string := "".
    attempt : positive := 0.

class predicates
    human_machine: ().
    replace : (string, string) -> string.
clauses
    human_machine():-
        No = math::random(number) + 1,
        word(No, Word),
        NormWord = string::toUpperCase(Word),
        currentWord := NormWord,
        Len = string::length(NormWord),
        secretWord := string::create(Len, "_"),
        std::repeat(),
            nl, write(string::replaceAll(secretWord, "_", " _ ")),
            write("\n\nНазовите слово или букву: "),
            String = string::toUpperCase(readLine()),
            attempt := attempt + 1,
            LenOfStr = string::length(String),
            if LenOfStr = 1, not(_ = string::search(secretWord, String))
            then if not(_ = string::search(currentWord, String)) then
                        write("\nНет такой буквы в этом слове.\n")
                    else secretWord := replace(secretWord, String) end if
            end if,
        ((string::isWhiteSpace(currentWord); String = NormWord),
        writef("\n\nСлово: %!\nКоличество попыток: %!", NormWord,
            attempt);
        LenOfStr > 1,
        writef("\n\nСлово: %\nВы назвали % и проиграли!",
            NormWord, String)),
        !.
    human_machine().

    replace(SecretWord, Letter) = replace(SecretWord1, Letter):-
        Pos = string::search(currentWord, Letter),
        !,
        currentWord := string::replacePart(currentWord, Pos, 1, " "),
        SecretWord1 = string::replacePart(SecretWord, Pos, 1, Letter).
    replace(SecretWord, _) = SecretWord.

    run():-
        write("Машина загадывает, человек угадывает!\n\n"),
        number := list::length([X || word(X, _)]),
        human_machine(),
        _ = readLine().
Пример 14.2. Игра "Поле чудес"

Предикат toUpperCase/2 переводит все символы строки в верхний регистр. Предикат search/2 возвращает позицию подстроки в строке. Предикат replaceAll/3 заменяет в строке все вхождения одной подстроки другой подстрокой. Предикат replacePart/4 заменяет подстрокой заданное количество элементов с указанной позиции.

< Лекция 13 || Лекция 14: 123 || Лекция 15 >
Жаныл Айкын
Жаныл Айкын
Rustam Inatov
Rustam Inatov

Доброго времени суток, подскажите пожалуйста, visual prolog examples, pie, vip7.5 - это все, где я могу скачать? (в смысле) может быть на сайте есть какой-то архив? Увы я не нашел его.

Подскажите, пожалуйста.

С уважением, Рустам.

Айдана Ахметова
Айдана Ахметова
Россия
Дмитрий Куянов
Дмитрий Куянов
Россия, Омск, ОмГТУ