Создание генератора сказок средствами Delphi

Untitled

Содержание

Введение

Сказка - это один из основных жанров устного народнопоэтического творчества и является наиболее известным для самого широкого круга читателей (детского и взрослого возраста). Это эпическое, преимущественно прозаическое художественное произведение авантюрного, волшебного или бытового характера в большинстве своем с установкой на вымысел.

Много лет авторы доносили свои произведения до читателей посредством книги, печатной продукции. Но с появлением новых технологий способов представления информации стало намного больше. Телевидение, радио, интернет - основные источники, где люди могут найти себе то, что нужно. Появились аудиокниги, позволяющие читателю не читать произведение, а прослушать его.

Актуальность работы в том, что настоящее время существует мало различных программ генерации сказок самим пользователем. С помощью компьютерной лингвистики и применения математических методов и компьютерных технологий, можно создать приложение, позволяющее пользователю самому создать собственный рассказ. С помощью такого приложения можно легко генерировать различные сценарии и вводить в них собственных героев, а также время и место происходящих событий.

Цель нашей работы - создать программу генерации сказок средствами Delphi.

Задачи работы:

  1. Изучить алгоритм создания сказки.

  2. Выявить потребности компьютерной лингвистики в реализации обработки текста.

  3. Определить возможности среды Delphi для автоматизированной генерации сказок.

  4. Разработать программу генерации сказок.

Глава I. «Теоретические основы генерации сказок программными средствами»

1.1. Алгоритм создания сказки

Алгоритм создания сказок на основе Морфологического анализа

<>

Строится и заполняется морфологическая таблица: элементы сказки - варианты их исполнения. Строк и столбцов может быть сколько угодно. Обычно 6-10. Например, как в данной таблице.

Задается по одному слову из каждой строки таблицы. Это герои и условия будущей сказки. Для большей таинственности можно составить нотацию таблицы по типу шахматной доски и выбрать "код сказки", например, такой: 1Г-2Г-3В-4Б-5Б-6Г-7Б. На основании этих условий сочиняется собственная сказка. Если в таблицу помещать известных сказочных героев, то получится "салат" из известных сказок, если помещать любые объекты, получится "самостоятельная" сказка.

Сюжет сказки создается "по ходу дела. Например, по указанной выше нотации может получиться следующее: "Красивая Царевна Несмеяна в дремучем лесу попала в руки к свирепому разбойнику, который сделал Несмеяну безопасной. Ее выручил мудрый волшебник. Он дал Несмеяне Машину Времени, на которой она умчалась в прошлое, стала опять красивой и больше никогда одна не ходила в дремучие леса".

Алгоритм создания сказок на основе метода контрольных вопросов

Метод контрольных вопросов для сочинения сказок:

  1. Придумываются вопросы. Вопросы записываются.

  2. Отвечая на вопросы, создается сюжет.

И черновой вариант сказки готов! Качество сказки зависит от вопросов, от их последовательности и от оригинальности ответов. Сказка получается как "езда в неизвестное". Чем менее связаны между собой вопросы, тем интересней получается сказка, но тем безграничнее и необузданней требуется фантазия. Например, такие вопросы:

Сколько было участников сказки?

Кто они?

Где они жили?

Где и почему они учились?

Какие у них были характеры?

Что хотел каждый? Кого они любили?

Почему они не могли выполнить своих желаний?

Какая беда произошла с одним из них? Что он сделал?

Если сказка "пошла", можно добавлять сколько угодно вопросов, персонажей и событий, повторять отдельные вопросы. Вообще говоря, создание хорошей сказки - процесс творческий, с повторениями, переделками и улучшениями. Успех или неуспех сказки является своего рода индикатором уровня развития воображения у детей и взрослых.

Сказка запускается вопросами, например:

  1. Что бы ты сделал, если бы нашел "родник смелости"? (Попил бы сам и стал смелым).

  2. Кому бы ты дал напиться в первую очередь и почему? (Своему приятелю Сашке, он все время врет от трусости).

  3. Не забудь, в твоем распоряжении целый родник…

  4. Волшебник разрешил тебе в течение одного часа побывать там, где ты захочешь.

  5. Куда бы ты отправился? Зачем? Что бы ты там сделал?

  6. Как найти самого мудрого человека в королевстве?

  7. Какие бы ты задал ему вопросы?

Запустите сказку первой фразой.

Жил был старый мудрый мамонт…

Тебе подарили сонный порошок, и ты…

Методика и формы работы над сказкой

Сказка - специфический жанр, любая сказка - это "особый замкнутый мир, в котором действуют законы, непримиримые в реальном мире".

Законы "сказочного мира" аналогичны с точки зрения здравого смысла, но совершенно естественны внутри сказки. Хочется обратить особое внимание на пять законов:

1. Одушевление предметов и явлений природы;

2. Очеловечивание предметов, явлений, представление в реальные или фантастические образы;

3. Синтез ряда обыкновенных явлений, предметов, существ в образы, наделенные необыкновенными свойствами, народный результат воображения, как выражения мечты, идеи;

4. Чудесные превращения и обращения;

5. Гиперболизация.

Благодаря этим законам в действие сказки, в ее эмоциональную сферу включаются все явления объективно существующего мира, все предметы воображения, как реально действующие силы. Именно поэтому сказка - благодатный материал для развития воссоздающего и творческого воображения ребенка как важных сторон его эмоциональной сферы и необходимых для полноценного восприятия произведений читателем.

Сказки сохраняют свою национальную индивидуальность, а каждая народная сказка своеобычно и по-своему неповторима.

Благодарнейшим способом изучения сказки является ее инсценирование. Этому способствует насыщенность сказки диалогами.

Формы работы со сказкой могут быть самыми разнообразными. Укажем еще на некоторые смысловые акценты, которые представляются значимыми. Они могут реализовываться в ходе беседы о сказке, в виде вопросов, обращенных к детям, в качестве заданий, предлагаемых ребенку после знакомства со сказкой.

Пример вопросов и заданий:

1. Дать характеристику персонажа (каков тот или иной из них).

2. Объяснить, почему произошло то или иное событие.

3. Показать, что становится объектом насмешки народа.

4. Прочитать в лицах сказочные диалоги и полилоги, выделяя голосом характерные особенности персонажа.

5. Указать на текстовые различия в традиционных для сказки повторах. Объяснить их значение.

6. Установить различие между словами и поступками персонажей. Дать нравственную оценку этому расхождению.

7. Отметить использование в сказке поговорок, пословиц и другое.

8. Выяснить, каким представился ребенку тот или иной герой, на чем основаны его предпочтения.

9. Объяснить, почему в сказке возникают значимые имена. Всегда ли они определяют главное в персонажах?

10. Охарактеризовать тональность речи того или иного персонажа, соответствие интонации его мыслям и поступкам.

11. Вопросы, утверждающие связь человека с природой, миром, "прославляющие" чувства дружбы, благодарности и т.п., вытекающие из конкретно-сказочных событий.

12. Вопросы, активизирующие память ребенка, заставляющие его обратиться к известным ему аналогиям.

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

14. Объяснить, как описывается в сказке прекрасное и безобразное.

15. Расскажите, как и почему изменился характер героя.

16. Сравнение, аналогия, сопоставление (чем сказки одного народа напоминают сказки другого народа).

17. Каковы коренные ценности народа, его понятие о справедливости, награде и неизбежном позоре?

1.2. Способы генерации текстовых произведений программными средствами

Цепи Маркова

Одним из способов генерации текста является способ Цепей Мркова — это некая последовательность, каждый следующий элемент которой не зависит от предыдущих. Это для цепи первого порядка. Для цепи второго порядка — зависит только от одного предыдущего, третьего — от двух предыдущих, и так далее.

Что это дает нам на практике? Мы можем взять текст на любом языке и разобрать его статистически. Записать, какова вероятность появления любого слова после какого-нибудь другого. После чего, выбирая первое слово наугад, можно выбрать второе, зависящее от первого. По второму — третье, и так далее. В результате получим текст, который выглядит как достаточно правильно построенные предложения, но без всякого смысла.

Приведем пример текста, сгенерированого из фрагмента художественного произведения при помощи цепей Маркова:

порядок цепи = 3 (каждое слово зависит от двух предыдущих):

В самом центре этой зоны реял флаг "Windows". В центре зоны притяжения был, как мне сначала показалось, секс - но, приглядевшись, я понял, что главным наслаждением в этой стране - работать клоуном у пидарасов. — Мне не очень понятно, о чем не думай. Стать вампиром можно только тогда, когда Бальдр и Иегова стали приходить поодиночке. Они были одинакового размера (сорок сантиметров в ширину, пятьдесят в высоту - первое, что служит им пищей. Но сейчас, я повторяю, об этом говорить рано. У тебя на шее мокро. Вытри. Я ничего не сказать. Я был бы не "Microsoft", а "Netscape".

порядок цепи = 2 (каждое слово зависит только от предыдущего):

— Спишь? - комбинация нескольких букв и повыше. Я знал, что из комнаты, - в это слово, - Ты, по-моему, должен был еще несколько раз слышал это связано с последующей магистратурой и дверь черного хода большой квартиры. Она даже страшная летающая собака, которая называлась "Лолита". Вторая картина называлась "закрепителем". В этой зоны - Англосаксонские вампиры могли быть хорошим человеком, за водкой стоишь в этом рано говорить. — А приклеил ты можешь пользоваться словом на хард-диск, на стене висел веер над столбцом текста приветливо глядел лысый лоб. — Ромочка, моя душа стерегла твой вопрос.

Видно, что чем больше порядок цепи, тем выше вероятность неизменности больших фрагментов.

Тот же принцип работает не только со словами, но и с буквами. В естественном языке существует не только вероятность появления какой-либо буквы, но и вероятность появления какой-то буквы после какой-то конкретной. Так можно генерировать простой набор букв и знаков, например (порядок 2):

стойный выбща я. нт инстро номалещет Каза со очазаза ятогло немосетеланопи инашема вамнырое, У но — све рил ия - А м ох поксть улава Валосатот мий некостсчнью каз сстобуденаком… - м во сть их з чатонал. каз зды ктилицвржачниснышвезалнем Наетрощега у, пыше спрю тиматовне ден ов b? по мазьк и Кродние. торк сль ковать, меналекалирето ткое милюще ня очтаз тобыпробне ном эт св заражи"Wisml. звсерь к… ино тв, я, иза суд нотромма бо сиршьног днотеезаль сесо нал о м норилкой м - киломитра Кожиных омн, быничуде це ряера. кучусмии — овизве, - мале то ня, вустрор к, зучтопотьни, ажеруз я я Номамо Ви? — жерно преногдаоро лючтнылодогоназа поми страро веныл -мпиеня. в ую ниек сь, по помыко имаск этвонелиестя гл вовез наемяроливерне Махотрит ска, тирыля з Я, прая — ме их ине, пана -трна ожноб Мыго на, тьдненя та былыбусн. обучткам смучисо у, му вдромогро cren, икимел ицетькудембще нгостистоско чтафогл, немели ДРа мовы. буматьнакилеровила во.

Далее приведен код, при помощи которого это было получено (PHP).

<?

/*

* class for Markov's chains realization

* (c) Andrey, somemilk.org@gmail.com, 2006

*

* Typical usage:

* $m = new Markov(2); // 2 - markov chain length, depends on source

* // file size, 2 for small files, 3-4 for large ones

* $m->initFromFile("somefile.txt") or die("shit happens.");

* $bullshit = $m->generate(2000); // generates bullshit 2000 chars long.

* $m->initFromString(file_get_contents("somefile.txt")) or die("shit happens.");

* $bullshit = $m->generate(100, MARKOV_OPT_WORDS); // generates bullshit 100 words long.

*/

define("MARKOV_OPT_CHARACTERS", 1); // option: character limit for generate()

define("MARKOV_OPT_WORDS", 2); // option: word limit for generate()

define("MARKOV_DEFAULT_K", 3); // default Markov chain length

define("MARKOV_TIME_LIMIT", 120); // time limit for initFromFile()

define("MARKOV_MAX_RECURSION_LEVEL", 20);

class Markov

/*

* inits class' Markov k-sets with a text from a string.

*

* returns true on success, false on failure

*/

function initFromString($str)

{

if(strlen($str) <= $this->k) return false;

$this->k_sets = array();

$set = array();

if($this->split_method == MARKOV_OPT_WORDS)

{

$words = preg_split('/\s+/', trim($str));

if(count($words) <= $this->k) return false;

foreach($words as $w)

{

$this->_addToSets($set, $w);

}

}

else

{

for($i=0; $i<strlen($str); $i++)

{

$this->_addToSets($set, substr($str, $i, 1));

}

}

return true;

}

function _addToSets(&$set, $w)

{

$set[] = $w;

if(count($set) == $this->k)

{

$key = "";

for($i=0; $i<$this->k - 1; $i++)

{

$key .= "[\$set[$i]]";

}

eval("\$this->k_sets{$key}[] = \$set[$i];");

array_shift($set);

}

}

}

?>

Существует еще один способ генерации текста. На сегодняшний день он является самым простым из всех существующих способов. Случайным образом выбираются буквы и склеиваются между собой. Если равновероятно выбирать любую букву или пробел получится что-то вроде этого:

uzlpcbizdmddk njsdzyyvfgxbgjjgbtsak rqvpgnsbyputvqqdtmgltz ynqotqigexjumqphujcfwn ll jiexpyqzgsdllgcoluphl sefsrvqqytjakmav bfusvirsjl wprwqt

Видно что получается непонятный набор символов. Такой способ нам не подходит по вполне понятным причинам.

Если подсчитать частоту появления какой либо буквы в тексте в Английском (да и в Русском тоже) языке, то становится видно, что например A встречается в 3 раза чаще чем B. Также и для остальных букв, частота появления их в тексте разная для различных букв. Зная эту частоту для всех букв, можно при случайной выборке букв, более частотные выбирать чаще, менее частотные - реже. При таком алгоритме мы получим примерно следующий текст:

saade ve mw hc n entt da k eethetocusosselalwo gx fgrsnoh,tvettaf aetnlbilo fc lhd okleutsndyeoshtbogo eet ib nheaoopefni ngent

Стало немного понятнее, чем в предыдущем примере. Но все равно, поисковикам такое не надо.

Следующий шаг. Если мы исследуем исходный текст и выясним сколько раз каждая буква следует за A, сколько раз за B и т.д. то мы можем при генерации случайно выбирать для каждой буквы последующую букву, наиболее вероятную для нее. Например, исходный текст:

mother and father eat the fruits

для буквы a будет следующий список: (n,t,t)

для буквы t будет следующий список: (h,h, ,h,s)

и так далее для всех букв.

То есть видно, что после a может следовать либо n либо t, причем t в два раза более вероятно.

После t может следовать либо h, либо s, либо пробел. Наибольшая вероятность что h.

Теперь для генерации случайного текста из данной фразы с помощью цепей Маркова уровня букв нам надо лишь случайно выбрать первую букву, и дальше для данной буквы мы случайно выбираем из соответсвующего списка следующую за ней букву. Потом для выбранной из списка буквы мы выбираем из ее спика следующую за ней букву и т.д.

Пример генерации уровня букв (исходный тест другой)

t I amy, vin. id wht omanly heay atuss n macon aresethe hired boutwhe t, tl, ad torurest t plur I wit hengamind tarer-plarody thishand.

Развивая идею можно вычислять вероятности появления буквы после пары букв (в английском языке после TH чаще всего идут A, E, I, O, U и Y, менее вероятны R и W, остальные редко). Пример генерации:

Ther I the heingoind of-pleat, blur it dwere wing waske hat trooss. Yout lar on wassing, an sit.» «Yould,» «I that vide was nots ther.

Также вычисляются вероятности появления буквы после трех букв. Пример генерации:

I has them the saw the secorrow. And wintails on my my ent, thinks, fore voyager lanated the been elsed helder was of him a very free bottlemarkable,

И так далее. Пример генерации для четырех букв:

His heard.» «Exactly he very glad trouble, and by Hopkins! That it on of the who difficentralia. He rushed likely?» «Blood night that.

Уже видно, что слова приобретают смысл. Практически все слова являются правильными. Здесь все зависит от объема исходного текста, который мы анализировали. Чем больше объем - тем корректней генерация.

Глава II «Практические основы генерации сказок средствами Delphi»

2.1 Описание интерфейса

Реализация генератора сказки проводилась в среде объектно-ориентированного программирования Delphi 7. На основе всех задач, поставлена цель запрограммировать алгоритм генерации сказки, создать форму для ввода данных и вывода результата.

Создается окно приложения (рис. 1.1).

<>

Рис. 1.1. Внешний вид окна приложения

На форме расположены:

  1. 6 полей для ввода данных, которые служат для дальнейшей генерации текста.

  2. Поле «Вывод полученного текста»

  3. Кнопка для запуска генерации.

2.2 Описание логической структуры

Специфика данного приложения состоит в том, что пользователь выбирает из перечня предлагаемых событий, расположенных в компонентах combobox, нужный вариант. Данные расположенные в 4 и 5 полях динамически изменяются, в зависимости от того, какой вариант выбрал пользователь, что в дальнейшем влияет и на сценарий самой сказки. Также при выборе какого-либо ответа появляется скрытое окно - дополнительная область ввода данных, позволяющая вносить собственные изменения в сказку. Данные в 1 и 2 полях можно выбирать, а можно и редактировать по своему усмотрению, что никак не повлияет на работу программы. В итоге при нажатии кнопки «Сгенерировать», в поле вывода Memo появляется текст предполагаемой сказки, в котором учитываются все требования пользователя.

<>

Рис.1.2 Результат работы приложения

Заключение

В данной работе был разработан и реализован собственный метод генерации сказки. Мы оценили сложность этого алгоритма генерации, который представлен в виде программы. Данным приложением можно пользоваться и взрослым и детям для создания собственной сказки.

Целью данной курсовой работы было разработка программного продукта, позволяющего генерировать сказки. Поставленная цель была достигнута.

Литература

  1. Генерация русских слов и текста цепями Маркова

http://cookie.somemilk.org/2008/nov/27/generaciya-russkih-slov-i-teksta-cepyami-markova/

  1. Русские народные сказки

http://enesh.info/

  1. Тренинг навыков морфологического анализа

http://fio.novgorod.ru/projects/Project1741/3.htm

  1. Автоматический генератор текста (от 14.01.2008)

http://www.textgen.ru/

  1. Способы генерации текста

http://thisishot.org/?page_id=17

Приложение 1

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, jpeg, ExtCtrls;

type

TForm1 = class(TForm)

ComboBox1: TComboBox;

ComboBox2: TComboBox;

ComboBox3: TComboBox;

ComboBox4: TComboBox;

ComboBox5: TComboBox;

Memo1: TMemo;

Image1: TImage;

Button1: TButton;

Edit1: TEdit;

Button2: TButton;

procedure ComboBox3Click(Sender: TObject);

procedure ComboBox4Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure ComboBox5Click(Sender: TObject);

procedure Edit1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

function Dat (s:string):string ;

var

i:integer;

begin

i:=length(s);

if (s[i]='а') or (s[i]='я') then s[i]:='е' else

if s[i]='о' then s[i]:='у' else

if s[i]='й' then s[i]:='ю' else

s:=s+'у' ;

Dat:=s;

end;

procedure TForm1.ComboBox3Click(Sender: TObject);

begin

if ComboBox3.ItemIndex=0 then

begin

edit1.Visible:=false;

ComboBox4.ItemIndex:=-1;

ComboBox5.ItemIndex:=-1;

ComboBox4.Items.Clear;

ComboBox4.Items.Add('Дед и бабка');

ComboBox4.Items.Add('Винни-Пух и Пятачок');

ComboBox4.Items.Add('Лисичка и зайчик');

end;

if ComboBox3.ItemIndex=1 then

begin

edit1.Visible:=false;

ComboBox4.ItemIndex:=-1;

ComboBox5.ItemIndex:=-1;

ComboBox4.Items.Clear;

ComboBox4.Items.Add('Царь');

ComboBox4.Items.Add('Мужик');

ComboBox4.Items.Add('Поп');

end;

end;

procedure TForm1.ComboBox4Click(Sender: TObject);

begin

if (ComboBox4.text='Дед и бабка') or (ComboBox4.text='Винни-Пух и Пятачок') or (ComboBox4.text='Лисичка и зайчик') then

begin

ComboBox5.Items.Clear;

ComboBox5.Items.Add('Не поделили домик');

ComboBox5.Items.Add('Заболели');

ComboBox5.Items.Add('Пошли в гости');

end;

if (ComboBox4.text='Поп') or (ComboBox4.text='Царь') or (ComboBox4.text='Мужик') then

begin

ComboBox5.Items.Clear;

//ComboBox5.Items.Add('Обманул медведя');

//ComboBox5.Items.Add('И три сына');

ComboBox5.Items.Add('Легкий хлеб');

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

memo1.Clear;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

ded,bab,vin,svin,lis,zai,st,vn: string;

begin

if combobox4.Text='Дед и бабка' then

begin

ded:='дед';

bab:='бабка';

if combobox5.Text='Заболели' then

begin

if edit1.Text='' then showmessage ('введите имя внучки') else

begin

vn:=edit1.text;

memo1.Text:=combobox1.Text+' ' + combobox2.Text +' жили были '+ ded +' да '

+ bab+ ' и была у них внучка '

+vn+'. Жили-поживали да добра наживали. И вот однажды беда пришла в их дом: '

+ded+' и '+ bab+ ' заболели и пришлось '

+ dat(vn) + ' идти через лес в город за лекарством, а в лесу этом живёт злобный и '

+'беспощадный Волк. И услышал он от зверушек и птичек лесных о горе, что в дом к '

+ dat(vn) + ' пришло. И стал ждать он. День ждал, два ждал... и, вот, дождался. '

+'Cобрался было Волк уже напасть да съесть её, но не тут-то было. Жулика увидели '

+'волшебники заколдовали. А '+ vn +' благополучно дошла до аптеки, купила лекарство и '

+ded+' и '+ bab+ ' выздоровели! Все, кто слушал, - молодец, ну а мне меду корец.' ;

end;

end;

if combobox5.Text='Не поделили домик' then

begin

if edit1.Text='' then showmessage ('поле пустое') else

begin

vn:=edit1.text;

memo1.Text:=combobox1.Text+' ' + combobox2.Text +' жили были '+ ded +' да '

+ bab+ '. Жили он по соседству друг от друга. Наступила зима, и пришлось Деду и бабке строить'

+' себе домики. Дед построил из снега, а бабка из песка. Жили-не тужили, но вот пришла весна'

+' и домик деда расстаял. Тогда он пошел к бабке и выгнал ее из песочного домика.'

+' Нечего было бабке делать. Села она на пенек и заплакала. В это время шел мимо '

+vn+'. Видит '+vn+' что бабка плачет и спрашивает, мол, что случилось. Ну бабка ему все'

+' и рассказала. '+vn+ ' разозлился, пошешел к деду и выгнал его из песочного домика.'

+' Совестно стало деду, попросил он у нее прощения. Пожалела его бабка и впустила его в свой домик жить.'

+ ' А на следущее лето они построили себе большой дом из дерева и жили-долго и счастливо.'

end;

end;

if combobox5.Text='Пошли в гости' then

begin

if edit1.Text='' then showmessage ('поле пустое') else

begin

vn:=edit1.text;

memo1.Text:=combobox1.Text+' ' + combobox2.Text +' жили были '+ ded +' да '

+ bab+ '. И вот однажды решили они пойти в гости к '

+dat(vn)+'. Красиво нарядились, взяли цветов и пошли, но '

+vn+ ' их не звал, и конечно же удивился, когда они пришли к нему.'

+' Но, как истинный джентельмен, он не показал виду, а, наоборот, пригласил деда и бабку за стол'

+' Все бы нечего, да только дед оказался прожерливым и съел все, что у хозяина,'

+' и, конечно же, растолстел. Пришло время идти домой... Дед и бабка попрощались и стали выходить.'

+' Бабка прошла спокойно через дверь, а вот дед не смог...застрял. пришлось вызывать спасателей и ломать дверь'

+' Совестно стало деду, но '+vn+' был добрым и простил его. Они вместе сделали дверь и больше никогда не ссорились'

end;

end;

end;

if combobox4.Text='Винни-Пух и Пятачок' then

begin

vin:='Винни-Пух';

svin:='Пятачок';

if combobox5.Text='Заболели' then

begin

if edit1.Text='' then showmessage ('введите имя внучки') else

begin

vn:=edit1.text;

memo1.Text:=combobox1.Text+' ' + combobox2.Text +' жили были '+ vin +' да '

+ svin+ ' и была у них внучка '

+vn+'. Жили-поживали да добра наживали. И вот однажды беда пришла в их дом: '

+vin+' и '+ svin+ ' заболели и пришлось '

+ dat(vn) + ' идти через лес в город за лекарством, а в лесу этом живёт злобный и беспощадный Волк. И услышал он от зверушек и птичек лесных о горе, что в дом к '

+ dat(vn) + ' пришло. И стал ждать он. День ждал, два ждал... и, вот, дождался. Cобрался было Волк уже напасть да съесть её, но не тут-то было. Жулика увидели волшебники заколдовали. А '

+ vn +' благополучно дошла до аптеки, купила лекарство и '

+vin+' и '+ svin+ ' выздоровели! Все, кто слушал, - молодец, ну а мне меду корец.' ;

end;

end;

if combobox5.Text='Не поделили домик' then

begin

if edit1.Text='' then showmessage ('поле пустое') else

begin

vn:=edit1.text;

memo1.Text:=combobox1.Text+' ' + combobox2.Text +' жили были '+ vin +' да '

+ svin+ '. Жили он по соседству друг от друга. Наступила зима, и пришлось Винни-Пуху и Пятачку строить'

+' себе домики. Винни-Пух построил из снега, а Пятачек из песка. Жили-не тужили, но вот пришла весна'

+' и домик Винни-Пуха расстаял. Тогда он пошел к Пятачку и выгнал его из песочного домика.'

+' Нечего было Пятачку делать. Сел он на пенек и заплакал. В это время шел мимо '

+vn+'. Видит '+vn+' что Пятачек плачет и спрашивает, мол, что случилось. Ну Пятачек ему все'

+' и рассказал. '+vn+ ' разозлился, пошешел к Винни-Пуху и выгнал его из песочного домика.'

+' Совестно стало Винни-Пуху, попросил он у Пятачка прощения. Пожалел его Пятачек и впустил в свой домик жить.'

+ ' А на следущее лето они построили себе большой дом из дерева и жили-долго и счастливо.'

end;

end;

if combobox5.Text='Пошли в гости' then

begin

if edit1.Text='' then showmessage ('поле пустое') else

begin

vn:=edit1.text;

memo1.Text:=combobox1.Text+' ' + combobox2.Text +' жили были '+ vin +' да '

+ svin+ '. И вот однажды решили они пойти в гости к '

+dat(vn)+'. Красиво нарядились, взяли цветов и пошли, но '

+vn+ ' их не звал, и конечно же удивился, когда они пришли к нему.'

+' Но, как истинный джентельмен, он не показал виду, а, наоборот, пригласил Винни-Пуха и Пятачка за стол'

+' Все бы нечего, да только Винни-Пух оказался прожерливым и съел все, что у хозяина,'

+' и, конечно же, растолстел. Пришло время идти домой... Винни-Пух и Пятачек попрощались и стали выходить.'

+' Пятачек прошел спокойно через дверь, а вот Винни-Пух не смог...застрял. пришлось вызывать спасателей и ломать дверь'

+' Совестно стало Винни-Пуху, но '+vn+' был добрым и простил его. Они вместе сделали дверь и больше никогда не ссорились'

end;

end;

end;

if combobox4.Text='Лисичка и зайчик' then

begin

lis:='лисичка';

zai:='зайчик';

if combobox5.Text='Заболели' then

begin

if edit1.Text='' then showmessage ('введите имя внучки') else

begin

vn:=edit1.text;

memo1.Text:=combobox1.Text+' ' + combobox2.Text +' жили были '+ lis +' да '

+ zai+ ' и была у них внучка '

+vn+'. Жили-поживали да добра наживали. И вот однажды беда пришла в их дом: '

+lis+' и '+ zai+ ' заболели и пришлось '

+ dat(vn) + ' идти через лес в город за лекарством, а в лесу этом живёт злобный и беспощадный Волк. И услышал он от зверушек и птичек лесных о горе, что в дом к '

+ dat(vn) + ' пришло. И стал ждать он. День ждал, два ждал... и, вот, дождался. Cобрался было Волк уже напасть да съесть её, но не тут-то было. Жулика увидели волшебники заколдовали. А '

+ vn +' благополучно дошла до аптеки, купила лекарство и '

+lis+' и '+ zai+ ' выздоровели! Все, кто слушал, - молодец, ну а мне меду корец.' ;

end;

end;

if combobox5.Text='Не поделили домик' then

begin

if edit1.Text='' then showmessage ('поле пустое') else

begin

vn:=edit1.text;

memo1.Text:=combobox1.Text+' ' + combobox2.Text +' жили были '+ lis +' да '

+ zai+ '. Жили он по соседству друг от друга. Наступила зима, и пришлось лисичке и зайчику строить'

+' себе домики. лисичка построила из снега, а зайчик из песка. Жили-не тужили, но вот пришла весна'

+' и домик лисички расстаял. Тогда она пошла к зайчику и выгнала его из песочного домика.'

+' Нечего было зайчику делать. Сел он на пенек и заплакал. В это время шел мимо '

+vn+'. Видит '+vn+' что зайчик плачет и спрашивает, мол, что случилось. Ну зайчик ему все'

+' и рассказал. '+vn+ ' разозлился, пошешел к лисичке и выгнал его из песочного домика.'

+' Совестно стало лисичке, попросила она у зайчика прощения. Пожалел его зайчик и впустил в свой домик жить.'

+ ' А на следущее лето они построили себе большой дом из дерева и жили-долго и счастливо.'

end;

end;

if combobox5.Text='Пошли в гости' then

begin

if edit1.Text='' then showmessage ('поле пустое') else

begin

vn:=edit1.text;

memo1.Text:=combobox1.Text+' ' + combobox2.Text +' жили были '+ lis +' да '

+ zai+ '. И вот однажды решили они пойти в гости к '

+dat(vn)+'. Красиво нарядились, взяли цветов и пошли, но '

+vn+ ' их не звал, и конечно же удивился, когда они пришли к нему.'

+' Но, как истинный джентельмен, он не показал виду, а, наоборот, пригласил лисичку и зайчика за стол'

+' Все бы нечего, да только зайчик оказался прожерливым и съел все, что у хозяина,'

+' и, конечно же, растолстел. Пришло время идти домой... лисичка и зайчик попрощались и стали выходить.'

+' Лисичка проша спокойно через дверь, а вот зайчик не смог...застрял. пришлось вызывать спасателей и ломать дверь'

+' Совестно стало зайчику, но '+vn+' был добрым и простил его. Они вместе сделали дверь и больше никогда не ссорились'

end;

end;

end;

if combobox4.Text='Царь' then st:='царь';

if combobox4.Text='Мужик' then st:='мужик';

if combobox4.Text='Волк' then st:='поп';

if combobox5.Text='Легкий хлеб' then

begin

if edit1.Text='' then showmessage ('пустое поле') else

begin

vn:=edit1.text;

memo1.Text:=combobox1.Text+' ' + combobox2.Text +' Косил на лугу '

+st+'. Устал и решил отдохнуть.'

+' Достал мешочек, развязал и начал хлеб жевать. Выходит из лесу голодный '

+vn+'. Видит - под кустом '+st+' сидит и ест что-то. '

+vn+' подошел к нему и спрашивает мол, что ты ешь, человече?. А '

+st+' ему и отвечает: "Хлеб". Пропросил '+vn+ ' хлеба отведать. Понравился '

+dat(vn)+' хлеб. Он и говорит:"Хотел бы я каждый день хлеб есть, но где мне его доставать? Подскажи, человече!" '

+'Рассказал '+st+', как хлеб добывают. '

+' Вздохнул '+vn+' от того, сколько ему предстоит работы сделать и говорит: '

+'"Нет! Эта работа больно долгая да тяжелая. Лучше посоветуй мне, человече, как полегче еду добывать." '

+' На что ему '+st+' и ответил:" Ну что ж, раз не хочешь тяжелый хлеб есть, поешь легкий. Ступай на выгон, там баран пасется. '

+'Пошел '+vn+' на поле. Высмотрел в стаде самого лучшего барана, схватил его и говорит ему, что сейчас съест. '

+'- Что ж, - говорит баран, - такова моя доля. Но чтобы долго тебе не мучиться да не ломать зубы об мои старые кости, '

+' стань лучше вон в той ложбинке и раскрой рот, а я взбегу на горку, разгонюсь и сам влечу к тебе в рот.'

+' Поблагодарил '+vn+' барана за совет да так и сделал. Стал он в ложбинке, открыл рот и ждет. А баран взбежал на горку, '

+' разогнался и трах рогами злюку по голове. Так искры из глаз у зверя и посыпались, весь свет перед ним закружился!'

+' Опамятовался '+vn+', покрутил головой и рассуждает сам с собой:"Съел я его или нет?"'

+' А '+st+' ему и говорит:" Съесть-то не съел, да зато легкого хлеба отведал."'

end;

end;

end;

procedure TForm1.ComboBox5Click(Sender: TObject);

begin

if combobox5.Text='Заболели' then

begin

edit1.visible:=true;

edit1.Text:='как звали внучку?';

end;

if combobox5.Text='Не поделили домик' then

begin

edit1.visible:=true;

edit1.Text:='кто их помирил?';

end;

if combobox5.Text='Пошли в гости' then

begin

edit1.visible:=true;

edit1.Text:='к кому пошли? [в Им. падеже]';

end;

if combobox5.Text='Легкий хлеб' then

begin

edit1.visible:=true;

edit1.Text:='кого обманул? [в Им. падеже]';

end;

end;

procedure TForm1.Edit1Click(Sender: TObject);

begin

edit1.Clear;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

form2.show;

end;

end.Приложение 2

Диск с программой

14