Опубликован: 12.02.2014 | Доступ: свободный | Студентов: 925 / 239 | Длительность: 11:22:00
Тема: Программирование
Специальности: Программист
Лекция 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 заменяет подстрокой заданное количество элементов с указанной позиции.