Использование массивов и указателей

Страницы работы

Содержание работы

Лабораторная работа №4

Использование массивов и указателей

Язык C++ поддерживает различные типы данных при помощи, которых очень удобно организовать в памяти любые структуры данных. Массивы являются очень распространённой структурой для представления упорядоченных данных, а указатели являются неотъемлемым инструментом для работы с ними.

В данной работе вы познакомитесь с тем насколько эффективно использование указателей, для упрощения реализации логики работы программы. Для того чтобы смысл программы был вам хорошо понятен, то в качестве примера мы возьмём всем вам хорошо известную игру «пятнашки».

1) Первым делом вам следует спроектировать визуальный интерфейс приложения. В качестве кнопок игрового поля вам рекомендуется использовать компонент SpeedButton со страницы Additional, а для более удобного их представления желательно поместить кнопки на компонент Panel (Standard). Дополнительные кнопки и способ их расположения смотри в примере программы.

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

Для того чтобы вам удобнее было работать с кнопками игрового поля вам необходимо представить их в виде массива, для этого опишите массив указателей на эти кнопки:

TSpeedButton *A[16];

Далее нужно проинициализировать его значениями таким образом, чтобы он указывал на нужные нам компоненты, являющиеся кнопками:

for (int n=0;n<16;n++)

A[n]=(TSpeedButton*)FindComponent("SpeedButton"+IntToStr(n+1));

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

4) Для того чтобы в теле программы вы могли определять, какая из кнопок была нажата, вам необходимо пронумеровать все кнопки, записав их порядковые номера в свойство Tag каждого компонента. Обратите внимание, что каждая кнопка у нас имеет два номера: первый – это её порядковый номер, записанный в свойство Tag (этот номер не изменяется в процессе работы программы) и второй – это тот номер который написан на кнопке в свойстве Caption (этот номер может изменяться в процессе игры). В процессе игры кнопки не переставляются местами, меняются только надписи на них. Если вы создадите один обработчик события для всех кнопок, то используя объект Sender вы можете получить номер нажатой кнопки:

int I =(TSpeedButton*)Sender->tag;

5) В предлагаемом вам примере программы реализовано две основных процедуры. Первая расставляет номера на кнопках в случайном порядке (обратите внимание, что номера на кнопах не должны повторяться). Для реализации случайных чисел вы можете воспользоваться функцией:

int random(int num);

, которая возвращает псевдослучайное число в диапазоне [0.num-1]. Для того чтобы приблизить псевдослучайные числа к случайным, воспользуйтесь функцией:

void randomize(void);

, которая инициализирует генератор псевдослучайные чисел.

Вторая процедура, обрабатывающая события от всех кнопок игрового поля, должна переставлять номера на кнопках согласно правилам игры. Для этого вам необходимо знать номер нажатой кнопки (об этом мы уже говорили) и номер свободной кнопки, который нужно хранить и изменять после перестановки. После перестановки номеров на кнопках необходимо проверять условия выигрыша. Условие выигрыша выполняется только в том случае если номер кнопки, записанный в свойство Tag, совпадает с номером, который написан на кнопке (свойство Caption), причём это условие должно выполняться для всех 15 кнопок игрового поля.

Для вывода сообщения о выигрыше воспользуйтесь функцией вызова диалогового окна APIWindows:

MessageDlg("Текстсообщения",mtInformation,TMsgDlgButtons() << mbOK, 0);

Похожие материалы

Информация о работе