- •Задание
- •Календарный график
- •Содержание
- •Введение
- •1 Решение задачи
- •2 Описание программного обеспечения
- •2.1 Программная реализация
- •2.2 Общие сведения
- •2.2.1 Список файлов
- •2.2.2 Технические требования
- •2.3 Состав программы
- •2.4 Алгоритм
- •Заключение
- •Список использованных источников
- •Приложение а Руководство системного программиста
- •Приложение б Руководство пользователя
2 Описание программного обеспечения
2.1 Программная реализация
Программа написана на языке C++. Этот язык выбран по причине того, что он является наиболее гибким, удобным и к тому же наиболее понятным. Все функции находятся в пределах одного файла. Программа состоит из формы, которая является диалоговым окном игры, и формы, через которую записываются результаты выполнения уровней.
Также прописаны карты, созданные нами (рисунок 2).
Рисунок 2 – Выбор карты
Данный программный продукт предусматривает наличие файла: batut.exe.
Движение мяча определяет попадание мяча по кирпичику. Так как суть игры в том, чтобы сбить все кирпичики, нужно привести часть кода, чтобы показать, как реализуется направление мяча.
Перемещение шарика осуществляется по координатам x и y (учитывается количество жизней):
ball.x+=ball_d.x; //перемещение мячика
ball.y+=ball_d.y;
if(ball.y+ball_s/2>400) //если мяч упал до низа (проигрыш)
{
heals--; // -1 жизнь
label1->Text="x"+Convert::ToString(heals); //обновляем отображение жизней
if(heals) //если еще есть жизни
{
board.set((400-board_w)/2,400-board_h);//перемещаем доску и мяч в исходное состояние
ball.set(400/2,300);
ball_d.set(0,4); //задаем направление мяча
}
else
{
timer2->Stop();//останавливаем таймер игры
textBox2->Visible=1;//делаем видимое поле для ввода имени
}
}
if(ball.x+ball_s/2>400 || ball.x-ball_s/2<0) //отскок мяча от левой и правой стенок
{
ball_d.x*=-1; //меняем направление по Х
}
if(ball.y-ball_s/2<0)//отскок мяча от потолка
{
ball_d.y*=-1;
}
if(ball.y+ball_s/2>board.y && ball.x>board.x && ball.x<board.x+board_w)//удар мяча об доску
{
float x;
x=(((ball.x-board.x)*600)/(board_w*100))-3; // изменяем угол отражения (сильнее или слабее) на значение от -3 до 3
ball_d.x+=x;
if(ball_d.x>3)//если приращение по модулю больше 3
ball_d.x=3;
if(ball_d.x<-3)
ball_d.x=-3;
ball_d.y=4-abs(ball_d.x);//преращение по У расчитываем как 4(скорость) - приращенеи по Х
ball_d.y*=-1;//и меняем направление
}
2.2 Общие сведения
Наименование программы: игра-аркада «Батут».
Разработчик: Севрюкова А.В., ИКИТ СФУ, ФИВТ, КИ 10-15.
Назначение программы: Как правило, такие игры не требуют определенной стратегии, важна лишь скорость реакции, четкость движений и отличный глазомер. Таким образом, игра предназначена для тренировки рук и скорости.
Получается, что, играя в логические игры, активизируется мышление игрока.
2.2.1 Список файлов
batut.exe - файл для запуска программы.
batut.sln - файл проекта на языке C++.
Resources - папка с ресурсами для игры (картинки, звуки).
2.2.2 Технические требования
Процессор: Pentium IV и выше.
RAM: 16Mb и выше.
Видеокарта: 4Mb и выше.
Свободное дисковое пространство: 40Mb.
2.3 Состав программы
struct XY - структура координат поля игры.
board, ball – координаты шарика и ракетки, приращения их движения.
board_d, ball_d – приращени движения шарика и ракетки.
static int Score – счет, для записи в таблицу рекордов.
static int heals – количество жизней.
array<String^>^ file – массив уровней.
static int **bricks; - массив из выбиваемых кирпичей.
Results=new rec[11] – массив результатов.
В данном фрагменте кода рисуются кирпичи (блоки). Описывается выбивание кирпичей, осуществляется пересчет очков и определяется направление шарика, после удара о блок:
int left,right,top,bottom,i,j;
int b_r=ball_s/2;
SolidBrush^ Brick_Brush = gcnew SolidBrush(Color::Green); //кисть для блоков
Pen^ Brick_Pen=gcnew Pen(Color::DarkGreen); //кисть для обводки блоков
bool can_change=1; for(i=0;i<10;i++) //проход по массиву с блоками
{for(j=0;j<10;j++)
{ top=i*brick_h; //опеределение границ текущего блока
bottom=top+brick_h;
left=j*brick_w;
right=left+brick_w;
if((ball.x-b_r<right && ball.x+b_r>left)&&(ball.y+b_r>top && ball.y-b_r<bottom)) //если мячик коснулся блока
{ if(bricks[i][j]==2) //если блок типа 2
{ bricks[i][j]=1; //делаем его типом 1
Score+=100; //добавляем 100 очков
textBox1->Text=Score.ToString();
if(can_change)//если за текущее перемещение мяча он еще не был отражен
{if(ball.x+b_r>left && ball.x+b_r<left+5) //определяем сторону блока, куда коснулся мяч
{
ball_d.x*=-1;//отскок мяча
}
if(ball.x-b_r<right && ball.x-b_r>right-5)
{
ball_d.x*=-1;
}
if(ball.y+b_r>top && ball.y+b_r<top+5)
{
ball_d.y*=-1;
}
if(ball.y-b_r<bottom && ball.y-b_r>bottom-5)
{
ball_d.y*=-1;}
can_change=0; //больше за текущее перемещение мяча, мы не сможем поменять его направление
}
} else
if(bricks[i][j]==1) //если тип блока 1
{coutn--;//вычитаем из количества блоков 1
bricks[i][j]=0;//убираем его
Score+=100;
textBox1->Text=Score.ToString();
if(can_change) {
if(ball.x+b_r>left && ball.x+b_r<left+5)
{
ball_d.x*=-1;
}
if(ball.x-b_r<right && ball.x-b_r>right-5)
{ ball_d.x*=-1;
}
if(ball.y+b_r>top && ball.y+b_r<top+5)
{
ball_d.y*=-1;
}
if(ball.y-b_r<bottom && ball.y-b_r>bottom-5)
{
ball_d.y*=-1;
}
can_change=0;
}
}
}
if(bricks[i][j]!=0) //если блок не 0, т.е. есть
{
switch(bricks[i][j]) //выбор типа блока
{
case 1:
Brick_Brush->Color=Color::Green; //рисуем зеленым
g->FillRectangle(Brick_Brush,left,top,brick_w,brick_h);
break;
case 2:
Brick_Brush->Color=Color::Blue; //и синим соответственно
g->FillRectangle(Brick_Brush,left,top,brick_w,brick_h);
break;
}
g->DrawRectangle(Brick_Pen,left,top,brick_w,brick_h); //и обводим этот блок
}
}
}