Опубликован: 12.02.2014 | Уровень: для всех | Доступ: платный
Лекция 14:
Игры
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 заменяет подстрокой заданное количество элементов с указанной позиции.