Разработка алгоритмов и программ

Тип работы:
Отчет
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ТАГАНРОГСКИЙ ГОСУДАРСТВЕННЫЙ РАДИОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра вычислительной техники

ОТЧЕТ

о выполнении практических занятий

по курсу

Технология программирования

1. Практическое задание 1. Разработка алгоритма и программы на

основе процедурного подхода

Цель работы: Ознакомиться с принципами разработки алгоритмов и программ на основе процедурного (функционального) подхода с использованием рекомендаций структурного программирования. Разработать программу на основе предлагаемого базового алгоритма в соответствии с заданным вариантом.

Содержание задания:

Разработать алгоритм и программу игры на основе процедурного (функционального) подхода с использованием рекомендаций структурного программирования. Алгоритм представить в виде блок-схем, построенных методом последовательной детализации. Реализация программы — Borland Pascal 7.0 для MS DOS, графический режим.

Все варианты имеют единое базовое содержание.

Правила игры. В игре предлагается поразить заданное количество мишеней из пушки (ружья, лука, вертолета и т. п). Мишени появляются последовательно по одной в разных точках заданной области на некоторый (одинаковый) интервал времени.

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

Для управления пушкой (ружьем, …) используются клавиши наведения («к1"и «к2») и выстрела «к3», на каждую мишень можно истратить несколько снарядов (пуль, стрел, ракет и т. п.).

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

Условие задания (Вариант 18−9=9):

Интерфейс

Пояснения

к1, к2, к3

9

Стрельба ведется из лука, который находится внизу, в центре экрана, и может поворачиваться влево-вправо. Мишени появляются в верхней части экрана у левой или правой его стороны, всего в игре мишеней — 20. Стрел на мишень — 1, время на наведение -5 сек. Сэкономленные стрелы -дополнительные очки.

*) При нажатой Ctrl — направление стрельбы меняется вдвое быстрее.

«» ««

««

Интерфейс программы (рисунок):

Интерфейс программы:

Алгоритм задачи, разработанный на основе базового алгоритма (его блок-схемы) находится в файле Ris1. vsd.

Текст программы (STRELA. PAS):

program Strela; {Вариант 18−9=9}

uses Crt, Graph, Dostimer;

const LukX=320; LukY=475; {Координаты центра дуги лука}

fi1=350; fi2=190; {Угол дуги лука: начало дуги — fi1, конец — fi2}

RadL=25; {Радиус дуги лука}

RadM=14; {Радиус мишени}

MishenNum=20; {Число мишеней}

Ctrl=$ 0004; {Для определения нажатия клавиши Ctrl (ускорение стрелы)}

label Play_again; {Метка возврата к началу по окончании игры}

var Score: integer; {Счётчик очков}

MishenX, MishenY: integer; {Координаты мишени}

Device, Mode: integer; {Для граф. режима}

i: integer; {Кол-во появившихся мишеней}

Left_Right: byte; {Определяет положение мишени — слева, или справа}

stX, stY, stX1, stY1: integer; {Координаты стрелы}

So: integer; {Счётчик отклонения стрелы}

Ugol: real; {Угол наклона стрелы}

Key: char; {Клавиша управления стрелой}

Time: integer; {Используется таймером — время наведения — 5 секунд}

Num: String; {Промежуточная переменная для вывода цифр в граф. режиме}

begin

Play_again: {Метка возврата к началу по окончанию игры}

Randomize; {Для генерир. случайных чисел}

Device: =Detect;

Mode: =Detect;

InitGraph (Device, Mode,'D: tpBGI'); {Инициализ. граф. режима}

Score: =0; {Очки}

Time: =5; {Время стрельбы на одну мишень}

i: =0; {Счётчик оставшихся мишеней}

while i< MishenNum do begin {Общий цикл стрельбы по очередной мишени}

i: =i+1; {Увеличить счётчик оставшихся мишеней}

ClearDevice; {Очистить экран}

MishenY: =14+(Random (106)); {Верт. коорд. случайная}

Left_Right: =random (2); {Положение мишени: слева, или справа}

case Left_Right of

0: MishenX: =15;

1: MishenX: =625;

end;

{Рисование мишени}

SetColor (Yellow);

Circle (MishenX, MishenY, RadM);

Circle (MishenX, MishenY, RadM-4);

SetFillStyle (1,Green);

FloodFill (MishenX+9,MishenY+9,Yellow);

{Рисование лука}

SetColor (Green);

Arc (LukX, LukY, fi1, fi2,RadL);

Arc (LukX, LukY, fi1, fi2,RadL-7);

Line (296,479,301,479);

Line (338,479,345,479);

So: =0; {Счётчик отклонения стрелы}

Ugol: =1. 55; {Угол наклона стрелы}

stX: =320; stY: =450; stX1: =320; stY1: =410; {Начальные координаты стрелы}

SetColor (White);

Line (stX, stY, stX1, stY1); {Рисование стрелы}

StartTimer (Time); {5 секунд}

while keypressed do key: =readkey; {Очистка буфера клавиатуры}

while isTimer0=false do begin {Цикл стрельбы по мишени}

{Оставшееся время}

SetColor (White);

OutTextXY (5,450,'Time: ');

Str (tim_tic/meml[0: $ 46c], Num); {Расчёт оставшегося времени}

SetFillStyle (1,Black);

Bar (45,448,56,457); {Закрасить предыдущее значение времени}

SetColor (LightRed);

OutTextXY (48,450,Num[8]); {Отобразить оставшееся время}

{Оставшиеся мишени}

SetColor (White);

OutTextXY (5,460,'Remained: ');

Str (MishenNum-i, Num);

SetColor (LightGreen);

OutTextXY (79,460,Num);

{Очки}

SetColor (White);

OutTextXY (5,470,'Score: ');

Str (Score, Num);

SetColor (LightCyan);

OutTextXY (56,470,Num);

{Выход из цикла, если координаты стрелы вышли за пределы экрана}

if (stX> 640) or (stX< 0) or (stY< 0) then Break;

if keypressed then begin

if readkey=#0 then key: =readkey; {Нажатие клавиши только}

case key of {с расширенным кодом}

#75: begin {Поворот влево}

if So> -48 then begin

SetColor (Black); {Стереть}

Line (stX, stY, stX1, stY1); {стрелу с предыдущими координатами}

Dec (So);

Ugol: =1. 55-So*0. 033;

stX1: =stX+Trunc (40*cos (Ugol));

stY1: =stY-Trunc (40*sin (Ugol));

SetColor (White); {Рисование}

Line (stX, stY, stX1, stY1); {стрелы с новыми координатами}

{Рисование заново лука}

SetColor (Green);

Arc (LukX, LukY, fi1, fi2,RadL);

Arc (LukX, LukY, fi1, fi2,RadL-7);

Line (296,479,301,479);

Line (338,479,345,479);

end;

end;

#77: begin {Поворот вправо}

if So< 47 then begin

SetColor (Black); {Стереть}

Line (stX, stY, stX1, stY1); {стрелу с предыдущими координатами}

Inc (So);

Ugol: =1. 55-So*0. 033;

stX1: =stX+Trunc (40*cos (Ugol));

stY1: =stY-Trunc (40*sin (Ugol));

SetColor (White); {Рисование}

Line (stX, stY, stX1, stY1); {линии с новыми координатами}

{Рисование заново лука}

SetColor (Green);

Arc (LukX, LukY, fi1, fi2,RadL);

Arc (LukX, LukY, fi1, fi2,RadL-7);

Line (296,479,301,479);

Line (338,479,345,479);

end;

end;

#72: begin {Выстрел, полёт стрелы}

while stY>0 do begin

SetColor (Black);

Line (stX, stY, stX1, stY1);

stX: =stX+Trunc (25*cos (Ugol));

stY: =stY-Trunc (25*sin (Ugol));

stX1: =stX+Trunc (40*cos (Ugol));

stY1: =stY-Trunc (40*sin (Ugol));

SetColor (White);

Line (stX, stY, stX1, stY1);

{Выход из цикла, если координаты стрелы вышли за пределы экрана}

if (stX> 640) or (stX< 0) or (stY< 0) then Break;

{При нажатии клавиши Ctrl- ускорение стрелы в 2 раза}

if (mem[0: $ 417] and Ctrl)=$ 0004 then Delay (25) else Delay (50);

{Проверка попадания, если координаты достаточно близки —

засчитать попадание}

if (stX1> =MishenX-10) and (stX1< =MishenX+10)

and (stY1> =MishenY-16) and (stY1< =MishenY+12) then Score: =Score+50;

end;

end;

end;

end;

end;

end;

ClearDevice; {Очистить экран}

Str (Score, Num); {Перевести число в строку для граф. режима}

SetColor (White);

OutTextXY (265,215,'Score: ');

SetColor (LightRed);

OutTextXY (328,215,Num);

SetColor (White);

OutTextXY (265,235,'Status: ');

SetColor (Yellow);

if (Score> =0) and (Score< 300) then OutTextXY (328,235,'BEGINNER');

if (Score> =300) and (Score< 800) then OutTextXY (328,235,'MASTER');

if (Score> =800) and (Score< =1000) then OutTextXY (328,235,'PROFESSIONAL');

SetColor (LightMagenta);

OutTextXY (265,255,'Play again? (y/n)');

while keypressed do key: =readkey; {Очистить буфер клавиатуры}

while true do begin

if keypressed then begin

key: =readkey;

case key of

'y': goto Play_again; {Перейти к метке начала программы}

'n': Halt; {Выход}

end;

end;

end;

closegraph

end.

Текст модуля таймера (DOSTIMER. PAS):

unit DOStimer;

interface

var tim_tic: longint; {Переменная сделана глобальной для доступа к ней}

{из программы}

procedure StartTimer (t_sec: integer);

function isTimer0: boolean;

implementation

var tim_act: boolean;

procedure StartTimer (t_sec: integer);

begin

tim_tic: =meml[0:$ 46c] + Trunc (t_sec * 18);

tim_act: =true

end;

function isTimer0: boolean;

begin

isTimer0: =false;

if tim_act

then if meml[0: $ 46c]> tim_tic

then begin

isTimer0: =true; tim_act: =false

end;

end;

begin

tim_act: =false

end.

2. Практическое задание 2. Разработка алгоритма и программы на основе объектно-ориентированного подхода

Цель работы: Ознакомиться с принципами объектно-ориентированного подхода к разработке алгоритмов и программ с записью алгоритма с помощью псевдокода. Разработать программу на основе предлагаемого базового алгоритма в соответствии с заданным вариантом.

Содержание задания

Разработать алгоритм и программу игры из задания № 1 на основе объектно-ориентированного подхода с записью алгоритма на псевдокоде. Реализация программы — Borland Pascal 7.0 для MS DOS, графический режим.

Проектирование объектного алгоритма базового задания

А) Интерфейс программы

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

Б) Предварительное описание объектов

1) Лук, 2) Стрела, 3) Стенд мишеней (вместе с табло).

Лук должен стирать и рисовать себя, проверять и обрабатывать указание от клавиатуры — повернуть стрелу влево/ вправо, или зафиксировать выстрел (но не выстрелить). Для взаимодействия со снарядом лук должен отвечать на запрос о готовности к выстрелу и выдавать параметры стрелы — координаты положения и направления полёта (x и y). Лук должен заряжатся (n) стрелами

Стрела должна рисовать/стирать себя и перемещаться на шаг по траектории. Инициализация стрелы должна определять её местоположение и направление полёта (координаты x, y, x1,y1 и угол наклона). Полёт стрелы происходит до линии мишени, поэтому стрела должна определять момент достижения заданной линии. Для взаимодействия со стендом мишеней стрела выдаёт свои координаты (x1, y1)

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

В) Объектный алгоритм задачи

begin {--- объектный алгоритм задачи «Стрельба по мишеням"}

Стенд. Инициализация (КолМиш, tстр); {Число мишеней и время наведения}

Лук. Создать (Парам_лука); {Установить координаты лука}

repeat {Цикл стрельбы по очередной мишени}

Лук. Показать; {Нарисовать лук}

Стенд. Выставить_мишень;

Лук. Зарядить_стрелу (Кол_Стр);

repeat {Цикл наведения и стрелбы по мишени}

Стенд. Отобразить_Появившиеся_мишени, Сбитые_Мишени, Очки, Оставшееся время;

Лук. Проверить_и_Выполнить_Указание_от_Клавиатуры;

if Лук. Готов_к_Выстрелу then

{если готов, то выдаёт параметры снаряда}

begin

Снаряд. Инициализация (Парам_Снаряда);

while Снаряд. не Достиг_Линии_Мишеней (ЛинМиш) do

Снаряд. Перемещение;

{проверка попадания в мишень}

Снаряд. Выдать_Параметры (Парам_стрел);

Стенд. Проверить_Попадание (Парам_стрелы);

Стенд. Удалить_Мишень;

end;

until Стенд. вСост_МишеньНедоступна or Лук. вСост_НетСнарядов or Стенд. Время_Закончено;

until Стенд. вСост_СтрельбаЗавершена;

end.

Текст программы (STRELA2. PAS):

program Strela2; {Вариант 18−9=9}

uses crt, graph, timerobj;

type Pushka = Object {----------------------------------------------------}

LukX, LukY: integer; {Координаты центра дуги лука}

fi1,fi2: integer; {Угол дуги лука: начало дуги — fi1, конец — fi2}

RadL: integer; {Радиус дуги лука}

Snar: integer; {Число снарядов — 1}

Key: char; {Клавиша управления стрелой}

So: integer; {Счётчик отклонения стрелы}

stX, stY, stX1, stY1: integer; {Координаты стрелы}

x, y, x1,y1: integer;

Ugol: real; {Угол наклона стрелы}

Polet: boolean; {Зафиксировать выстрел}

procedure Show; {Нарисовать лук}

procedure Hide; {Стереть лук}

procedure SnarZaryad (Snar1: integer); {Зарядить снаряды}

procedure Create (LukXX, LukYY, fi11, fi22,RadLL: integer); {Задать координаты}

procedure Proverka; {Проверить и выполнить указание от клавиатуры}

function Gotovnost: boolean; {Отвечает на запрос о готовности к выстрелу}

function vSost_NetSnaryadov: boolean; {Определяет когда снаряды = 0}

end;

Snaryad = Object {-------------------------------------------------------}

x, y, x1,y1: integer; {Координаты снаряда при его перемещении}

snX1,snY1: integer; {Координаты снаряда, которые будут переданы стенду}

Ugol: Real; {Угол наклона стрелы}

procedure Init (aX, aY, aX1, aY1: integer; Ug: real);

procedure Move; {Перемещение снаряда}

procedure SnaryadParam (aX1,aY1: integer); {Выдать параметры снаряда}

{Определить достижение линии мишени снарядом}

function NEdostigLinMishen (LinMishen: integer):boolean;

end;

Stend = Object {-------------------------------------------------------}

Timer: tObjTimer;

MishenNum: integer; {Число мишеней}

Mishen1: integer; {Появившиеся мишени}

MishenSB: integer; {Сбитые мишени}

MishenNedostupna: boolean; {Определяет доступность мишени}

Time: integer; {Время наведения}

MishenY, MishenX: integer; {Координаты мишени}

RadM: integer; {Радиус мишени}

Left_Right: byte; {Определяет положение мишени}

Score: integer; {Число очков}

procedure Init (MishenNum1,Time1: integer); {Число мишеней и время наведения}

procedure MishenShow; {Выставить мишень}

procedure MishenDelete; {Удалить мишень}

procedure Proverka (paramX1,paramY1: integer); {Проверка попадания}

procedure Tablo; {Появившиеся мишени, число сбитых мишеней, число очков}

function vSost_StrelbaZavershena: boolean; {Завершение игры}

function vSost_MishenNedostupna: boolean; {Определяет доступность мишени}

function TimeOver: boolean; {Определяет окончание времени наведения}

end;

procedure Stend. Init (MishenNum1,Time1:integer); {Иниц. стенда}

begin

MishenNum: =MishenNum1; {Число мишеней}

Mishen1: =0; {Появившиеся мишени}

MishenSB: =0; {Сбитые мишени}

Time: =Time1; {Время — 5 секунд}

Timer. Init; {Старт таймера}

end;

procedure Stend. MishenShow; {Выставить мишень}

begin

Timer. Start (Time);

MishenNedostupna: =false;

MishenY: =14+(Random (106)); {Верт. коорд. случайная}

MishenX: =320;

Left_Right: =random (2); {Положение мишени: слева, или справа}

case Left_Right of

0: MishenX: =15; {Слева}

1: MishenX: =625; {Справа}

end;

RadM: =14; {Радиус мишени}

SetColor (Yellow);

Circle (MishenX, MishenY, RadM);

Circle (MishenX, MishenY, RadM-4);

SetFillStyle (1,Green);

FloodFill (MishenX+9,MishenY+9,Yellow);

Mishen1: =Mishen1+1; {Увеличить кол-во появившихся мишеней}

end;

procedure Stend. MishenDelete; {Удалить мишень}

var key: char;

begin

SetFillStyle (1,Black);

Bar (MishenX-16,MishenY-14,MishenX+17,MishenY+14); {Закрасить область мишени}

MishenNedostupna: =true;

while keypressed do key: =readkey; {Очистить буфер клавиатуры}

end;

procedure Stend. Proverka (paramX1,paramY1: integer);

begin

{Проверка попадание, если координаты достаточно близки —

засчитать попадание}

if (paramX1> =MishenX-19) and (paramX1< =MishenX+19)

and (paramY1> =MishenY-56) and (paramY1< =MishenY+52) then begin

Score: =Score+50; {Увеличить очки}

MishenSB: =MishenSB+1; {Увеличить кол-во сбитых мишеней}

end;

end;

{Отобразить оставшиеся время, число появившихся мишеней,

число сбитых мишеней, число очков}

procedure Stend. Tablo;

var Num: String; {Промежуточная переменная для вывода цифр в граф. режиме}

begin

{Оставшееся время}

SetColor (White);

OutTextXY (5,450,'Time: ');

Str (tim_tic/meml[0: $ 46c], Num); {Расчёт оставшегося времени}

SetFillStyle (1,Black);

Bar (45,448,56,457); {Закрасить предыдущее значение времени}

SetColor (LightRed);

{Отобразить оставшееся время — 5сек., может отображатся не точно}

OutTextXY (48,450,Num[8]);

{Появившиеся мишени}

SetColor (White);

OutTextXY (5,460,'Targets: ');

Str (Mishen1,Num); {Преобразовать число в строку для граф. режима}

SetFillStyle (1,Black);

Bar (72,458,95,467); {Закрасить предыдущее значение}

SetColor (LightGreen);

OutTextXY (75,460,Num); {Отобразить число появившихся мишеней}

SetColor (White);

OutTextXY (100,460,'of');

SetColor (LightGreen);

Str (MishenNum, Num); {Преобразовать число в строку для граф. режима}

OutTextXY (125,460,Num); {Отобразить начальное число мишеней}

{Сбитые мишени}

SetColor (White);

OutTextXY (530,450,'Shot Down: ');

Str (MishenSB, Num); {Преобразовать число в строку для граф. режима}

SetFillStyle (1,Black);

Bar (617,448,640,457); {Закрасить предыдущее значение}

SetColor (Yellow);

OutTextXY (620,450,Num); {Отобразить число сбитых мишеней}

{Очки}

SetColor (White);

OutTextXY (530,460,'Score: ');

Str (Score, Num); {Преобразовать число в строку для граф. режима}

SetFillStyle (1,Black);

Bar (576,458,615,467); {Закрасить предыдущее значение}

SetColor (LightCyan);

OutTextXY (580,460,Num); {Отобразить число очков}

end;

function Stend. vSost_StrelbaZavershena:boolean;

begin

if Mishen1> MishenNum then vSost_StrelbaZavershena: =true else

vSost_StrelbaZavershena: =false;

end;

function Stend. vSost_MishenNedostupna:boolean;

begin

if (MishenNedostupna=true) then vSost_MishenNedostupna: =true

else vSost_MishenNedostupna: =false;

end;

procedure Pushka. Create (LukXX, LukYY, fi11, fi22,RadLL: integer);

begin

LukX: =LukXX;

LukY: =LukYY;

fi1: =fi11;

fi2: =fi22;

RadL: =RadLL;

end;

function Stend. TimeOver: boolean; {Определяет окончание времени наведения}

begin

TimeOver: =false;

if Timer. isTimeOver=true then begin {После окончания времени}

TimeOver: =true; {присвоить функции значение 'true',}

MishenDelete; {удалить мишень}

SetFillStyle (1,Black); {и закрасить область}

Bar (280,405,360,480); {стрелы и лука}

end;

end;

procedure Pushka. Show; {Нарисовать лук}

begin

SetColor (White);

Arc (LukX, LukY, fi1, fi2,RadL);

Arc (LukX, LukY, fi1, fi2,RadL-7);

Line (296,479,301,479);

Line (338,479,345,479)

end;

procedure Pushka. Hide; {Стереть лук}

begin

SetColor (Black);

Arc (LukX, LukY, fi1, fi2,RadL);

Arc (LukX, LukY, fi1, fi2,RadL-7);

Line (296,479,301,479);

Line (338,479,345,479)

end;

procedure Pushka. SnarZaryad (Snar1: integer);

begin

Ugol: =1. 55; {Угол наклона стрелы}

So: =0; {Счётчик отклонения стрелы}

stX: =320; stY: =450; stX1: =320; stY1: =410; {Начальные координаты стрелы}

SetColor (White);

Line (stX, stY, stX1, stY1); {Нарисовать стрелу}

Snar: =Snar1; {Зарядить снаряд}

end;

procedure Pushka. Proverka; {Проверить указание от клавиатуры}

begin

Polet: =false; {Установить true при нажатии клавиши выстрела}

if keypressed then begin

if readkey=#0 then key: =readkey; {Нажатие клавиши только}

case key of {с расширенным кодом}

#75: begin {Поворот влево}

if So> -48 then begin

SetColor (Black); {Стереть}

Line (stX, stY, stX1, stY1); {стрелу с предыдущими координатами}

Dec (So);

Ugol: =1. 55-So*0. 033;

stX1: =stX+Trunc (40*cos (Ugol));

stY1: =stY-Trunc (40*sin (Ugol));

SetColor (White); {Рисование}

Line (stX, stY, stX1, stY1); {стрелы с новыми координатами}

Pushka. Show; {Рисование заново лука}

end;

end;

#77: begin {Поворот вправо}

if So< 47 then begin

SetColor (Black); {Стереть}

Line (stX, stY, stX1, stY1); {стрелу с предыдущими координатами}

Inc (So);

Ugol: =1. 55-So*0. 033;

stX1: =stX+Trunc (40*cos (Ugol));

stY1: =stY-Trunc (40*sin (Ugol));

SetColor (White); {Рисование}

Line (stX, stY, stX1, stY1); {линии с новыми координатами}

Pushka. Show; {Рисование заново лука}

end;

end;

#72: Polet: =true; {Зафиксировать выстрел}

end;

end;

end;

function Pushka. Gotovnost: boolean; {Определяет готовность пушки}

begin

{Пушка готова к выстрелу если число снарядов >0 и нажата клавиша выстрела}

if (Snar> 0) and (Polet=true) then begin

Gotovnost: =true;

x: =stX; y: =stY; x1: =stX1; y1: =stY1;

Snar: =Snar-1; {Уменьшить число снарядов}

end else Gotovnost: =false;

end;

function Pushka. vSost_NetSnaryadov:boolean;

begin

if Snar=0 then vSost_NetSnaryadov: =true else vSost_NetSnaryadov: =false;

end;

procedure Snaryad. Init (aX, aY, aX1, aY1: integer; Ug: real); {Инициализация стрелы}

begin

x: =aX; y: =aY; x1: =aX1; y1: =aY1;

Ugol: =Ug;

end;

procedure Snaryad. Move;

Const Ctrl=$ 0004; {Для определения нажатия клавиши Ctrl (ускорение стрелы)}

begin

SetColor (White); {Нарисовать}

Line (x, y, x1,y1); {стрелу}

{При нажатии клавиши Ctrl- ускорение стрелы в 2 раза}

if (mem[0: $ 417] and Ctrl)=$ 0004 then Delay (25) else Delay (50);

SetColor (Black); {Стереть}

Line (x, y, x1,y1); {стрелу}

x: =x+Trunc (25*cos (Ugol)); {Переместиться}

y: =y-Trunc (25*sin (Ugol)); {на}

x1: =x+Trunc (40*cos (Ugol)); {шаг}

y1: =y-Trunc (40*sin (Ugol)); {по траектории}

end;

procedure Snaryad. SnaryadParam (aX1,aY1: integer);

begin

snX1: =aX1; snY1: =aY1;

end;

function Snaryad. NEdostigLinMishen (LinMishen:integer):boolean; {Определить достижение линии мишени стрелой}

begin

if y1< LinMishen then NEdostigLinMishen: =false else

NEdostigLinMishen: =true;

end;

var Luk: Pushka;

St: Stend;

Sn: Snaryad;

Device, Mode: integer;

begin

Randomize;

Device: =0;

InitGraph (Device, Mode,'');

St. Init (20,5{, линия мишени меняется}); {Число мишеней и время наведения}

Luk. Create (320,475,350,190,25); {Установить координаты лука}

repeat {Цикл стрельбы по очередной мишени}

Luk. Show; {Нарисовать лук}

St. MishenShow; {Выставить мишень}

Luk. SnarZaryad (1); {Зарядить лук}

repeat {Цикл наведения и стрелбы по мишени}

{Отобразить число появившихся мишеней, сбитые мишени, очки и ост. время}

St. Tablo;

Luk. Proverka; {Проверить и выполнить указания от клавиатуры}

if Luk. Gotovnost then begin

Sn. Init (Luk. x, Luk. y, Luk. x1, Luk. y1, Luk. Ugol); {Инициализация стрелы}

while Sn. NEdostigLinMishen (St. MishenY-St. RadM) do

Sn. Move; {Перемещение стрелы}

Sn. SnaryadParam (Sn. x1, Sn. y1); {Выдать параметры стрелы}

St. Proverka (Sn. SnX1, Sn. SnY1); {Проверить попадание}

St. MishenDelete; {Удалить мишень}

end;

until St. vSost_MishenNedostupna or Luk. vSost_NetSnaryadov or St. TimeOver;

until St. vSost_StrelbaZavershena;

readln;

closegraph

end.

Текст модуля таймера (TIMEROBJ. PAS):

unit TIMEROBJ;

interface

var tim_tic: longint; {Переменная сделана глобальной для доступа к ней}

{из программы}

type tObjTimer = object

tim_act: boolean;

procedure Init;

procedure Start (t_sec: integer);

function isTimeOver: boolean;

end;

implementation

procedure tObjTimer. Init;

begin

tim_act: =false

end;

procedure tObjTimer. Start (t_sec: integer);

begin

tim_tic: =meml[0:$ 46c] + Trunc (t_sec * 18);

tim_act: =true

end;

function tObjTimer. isTimeOver: boolean;

begin

isTimeOver: =false;

if tim_act

then if meml[0: $ 46c]> tim_tic

then begin

isTimeOver: =true; tim_act: =false

end;

end;

begin

end.

3. Практическое задание 3. Разработка простой программы в среде

визуального программирования Delphi

Цель работы: Ознакомиться с принципами визуального программирования и организацией среды Delphi, примерами написания простых программ с использованием типовых компонент Delphi. Разработать и реализовать несложную программу на основе предлагаемого примерного алгоритма по заданному варианту.

Содержание задания:

Во всех вариантах интерфейс приложений организован по общей схеме, когда форма имеет две области — область задания параметров и рабочую область, в которой некоторый процесс начинает развиваться во времени при нажатии кнопки Start. Пример интерфейса показан ниже. Предполагается, что в программе должна быть показана одна из картин (название выбирается в ComboBox), в некотором режиме разворота (режим задается группой кнопок RadioButton) с некоторой скоростью (задается в ScrollBar), развитие процесса отображает ProgressBar. Предварительно введенная информацию о разработчике должна выдаваться по запросу (кнопка BitBtn), причем в обычном режиме выдается краткая информация (только Фамилия-Имя), а при установленном CheckBox — полная (группа и т. д.).

В меню и на инструментальной панели (во всех вариантах) должны дублироваться кнопки Start и Автор (подменю Кнопки), а также некоторые параметры, индивидуальные для варианта (например, режим разворота _Вниз, _Вверх, _Вправо — в подменю Режим).

Условие задания:

Задание параметров

Процесс

ComboBox — выбор картины (1,2,3,4)

Edit (2) — фамилия/группа разработчика

RadioButton (4) — выбор интервала

просмотра (2, 3, 5, 10 сек)

TrackBar — интервал растягивания

(0,4/ 0,8/ 1,2/ 1,6/ 2.0 сек)

СheckBox (1) — флаг вывода названия

Картина при изображении как бы растягивается из правой стороны рамки на всю её область, затем, после интервала просмотра, в котором под картиной (возможно) располагается её название, картина сжимается к правой стороне рамы. Индикация — время до конца интервала просмотра в горизонтальном ProgressBar. В меню и на панели дублировать выбор интервала просмотра.

9

Интерфейс программы:

Краткий алгоритм программы

procedure TForm1. BitBtn1Click (Sender: TObject) — Кнопка вывода информации о студенте. Предусмотрен вывод полной информации и краткой по нажатию на CheckBox1.

procedure TForm1. ComboBox1Select (Sender: TObject) — Событие, при выборе элемента из ComboBox1 меняется картинка, отображаемая в Image1.

procedure TForm1. FormCreate (Sender: TObject) — Событие, которое выполняет некоторые действия при создании формы, мы устанавливаем счетчики в единицу и размещаем картинку в правой стороне Image1.

procedure TForm1. Button1Click (Sender: TObject) — В этом обработчике нажатия кнопки Button1 мы вытягиваем данные из RadioGroup1 и из TrackBar1 и включаем таймер Timer1.

procedure TForm1. Timer1Timer (Sender: TObject) — Таймер, в нем и происходит основная работа программы. Картинка по таймеру растягивается и сжимается + идет отображение процесса в ProgressBar1.

procedure TForm1. RadioGroup2Click (Sender: TObject) и procedure TForm1. RadioGroup1Click (Sender: TObject) — обработчики событий для связывания RadioGroup1 и RadioGroup2 на форме и на панели

Текст программы:

unit Unit1;

interface

uses

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

Dialogs, StdCtrls, Buttons, ExtCtrls, XpMan, ComCtrls, JPeg;

type

TForm1 = class (TForm)

StaticText1: TStaticText;

StaticText2: TStaticText;

StaticText3: TStaticText;

Edit1: TEdit;

Edit2: TEdit;

StaticText4: TStaticText;

Edit3: TEdit;

BitBtn1: TBitBtn;

CheckBox1: TCheckBox;

Label1: TLabel;

Panel1: TPanel;

Image1: TImage;

ComboBox1: TComboBox;

StaticText5: TStaticText;

RadioGroup1: TRadioGroup;

TrackBar1: TTrackBar;

StaticText6: TStaticText;

StaticText7: TStaticText;

Button1: TButton;

Timer1: TTimer;

ProgressBar1: TProgressBar;

RadioGroup2: TRadioGroup;

procedure BitBtn1Click (Sender: TObject);

procedure ComboBox1Select (Sender: TObject);

procedure FormCreate (Sender: TObject);

procedure Button1Click (Sender: TObject);

procedure Timer1Timer (Sender: TObject);

procedure RadioGroup2Click (Sender: TObject);

procedure RadioGroup1Click (Sender: TObject);

private

public

end;

var

Form1: TForm1;

k: real;

l, x: integer;

H, W: integer;

Interval: integer;

pos_left, pos_top: integer;

implementation

{$R *. dfm}

// Auaia eioi? iaoee i nooaaioa

procedure TForm1. BitBtn1Click (Sender: TObject);

begin

label1. Caption:='';

if CheckBox1. Checked = false then

Begin

if (Edit1. Text < > '') and (Edit2. Text < > '') then

label1. Caption:=Edit1. Text + ' ' + Edit2. Text

else ShowMessage ('Caiieieoa iiey');

End

else

Begin

if (Edit1. Text < > '') and (Edit2. Text < > '') and (Edit3. Text < > '') then

label1. Caption:=Edit1. Text + ' ' + Edit2. Text + ' ' + Edit3. Text

else ShowMessage ('Caiieieoa iiey');

End;

end;

// I? ioaao?a caa? ocee ea? oeiee a Image ec oaeeia

procedure TForm1. ComboBox1Select (Sender: TObject);

var BitMap1, BitMap2: TBitMap;

begin

ProgressBar1. Position:=0;

Case ComboBox1. ItemIndex of

0: Image1. Picture. LoadFromFile (extractfilepath (paramstr (0)) + '/photo/JLo. bmp');

1: Image1. Picture. LoadFromFile (extractfilepath (paramstr (0)) + '/photo/Statham. bmp');

2: Image1. Picture. LoadFromFile (extractfilepath (paramstr (0)) + '/photo/Cannavaro. bmp');

3: Image1. Picture. LoadFromFile (extractfilepath (paramstr (0)) + '/photo/Aniston. bmp');

End;

end;

procedure TForm1. FormCreate (Sender: TObject);

begin

Image1. Picture. LoadFromFile (extractfilepath (paramstr (0)) + '/photo/JLo. bmp');

k: =1;

l: =1;

x: =1;

progressbar1. Step:=5;

image1. Left:=Panel1. Width-image1. Width;

image1. Top:=Panel1. Clientheight-image1. height;

end;

procedure TForm1. Button1Click (Sender: TObject);

begin

W: =Image1. Width;

H: =Image1. Height;

pos_left: =image1. left;

pos_top: =image1. top;

k: =1;

x: =1;

l: =1;

// Auoyaeaaai ec TrackBar eioa? aae ?anoyaeaaiey

Case TrackBar1. Position of

0: Timer1. Interval:=400;

1: Timer1. Interval:=800;

2: Timer1. Interval:=1200;

3: Timer1. Interval:=1600;

4: Timer1. Interval:=2000;

End;

Timer1. Enabled:=true;

Case RadioGroup1. ItemIndex of

0: Interval: =2000;

1: Interval: =3000;

2: Interval: =5000;

3: Interval: =10 000;

End;

progressbar1. Position:=0;

end;

procedure TForm1. Timer1Timer (Sender: TObject);

begin

ProgressBar1. Position:=ProgressBar1. Position + l*round (100/(round (Interval / Timer1. Interval)));

image1. Left:=pos_left — trunc (w*k-w);

image1. Top:=pos_top — trunc (h*k-h);

image1. Width:=trunc (w*k);

image1. Height:=trunc (h*k);

image1. Stretch:=true;

if x = round (Interval / Timer1. Interval) + 1 then

l: =-l;

if x = round (Interval/ Timer1. Interval) * 2 + 1 then

timer1. Enabled:=false;

x: =x+1;

k: =k+1/(round (Interval/ Timer1. Interval))*l;

end;

procedure TForm1. RadioGroup2Click (Sender: TObject);

begin

Case radiogroup2. ItemIndex of

0: RadioGroup1. ItemIndex:=0;

1: RadioGroup1. ItemIndex:=1;

2: RadioGroup1. ItemIndex:=2;

3: RadioGroup1. ItemIndex:=3;

End;

end;

procedure TForm1. RadioGroup1Click (Sender: TObject);

begin

Case radiogroup1. ItemIndex of

0: RadioGroup2. ItemIndex:=0;

1: RadioGroup2. ItemIndex:=1;

2: RadioGroup2. ItemIndex:=2;

3: RadioGroup2. ItemIndex:=3;

End;

end;

end.

алгоритм программа интерфейс delphi

Список использованной литературы

1. Учебное пособие по курсу, глава 1 «Процедурный подход к разработке алгоритмов и программ»

2. Методическое пособие по курсу, глава 2 «Объектно-ориентированный подход к программированию»

3. Методическое пособие по курсу, часть 6 «Основы программирования в среде визуального программирования Delphi»

4. Цехоня В. И. Методическое пособие по курсу «Технология программирования» (часть 1- 6). Таганрог, 2004. 247 с.

ПоказатьСвернуть
Заполнить форму текущей работой