Создание меню - PascalABC.NET
Формулировка задачи:
Помогите сделать так, чтобы после запуска "игры" можно было выйти обратно в "меню" или выполнялось завершение программы. Спаибо
Решение задачи: «Создание меню»
textual
Листинг программы
uses GraphABC;
type
tSharik=record {объявим тип запись - шарик, с полями}
radius: integer;{радиус шара}
cvet: Color;{цвет}
dlina: integer;{длина шнура}
koord_x: integer;{координата х точки подвеса}
ugol: real;{угол от вертикальной оси}
naprav: integer;{}
x,y: integer;{текущие координаты центра шарика}
end;
const
Skorost=5;{константа, регулирующая скорость колебаний, можно поменять, или вообще задавать самому}
var
n:integer;{кол. шариков}
shariki:array of tSharik;{массив шариков}
mouseDown : Boolean;
procedure MouseClick(x,y,mb : integer);
begin
mouseDown := True;
end;
function input(x,y : integer; msg : string; cl : Color := clWhite) : integer;
begin
SetBrushColor(cl);
TextOut(x, y, msg);
Result := ReadLnInteger;
TextOut(x, y, msg + ' ' + Result);
SetBrushColor(clWhite);
end;
//процедура рисования шарика с нитью,
procedure Narisovat(sharik:tSharik);
begin
var c:=sharik.cvet;
setpencolor(clBlue);//цвет нити
line(sharik.koord_x, 0, sharik.x, sharik.y);//нить - линия
setpencolor(c);//цвет шарика
setbrushcolor(c);
circle(sharik.x, sharik.y,sharik.radius);//закрашенный круг
end;
//процедура смещения - колебания шарика
procedure Dvigat(var sharik:tSharik);
begin
with sharik do//пока 1 шарик
begin
ugol:= ugol+naprav*skorost/dlina;//вычисляем угол
//вычисляем текущие координаты центра
x:= round( koord_x + (dlina+radius) * sin(ugol) );
y:= round( (dlina+radius) * cos(ugol) );
//определяем положение шарика по вертикали:
//если коснулись границы экрана(она одна для всех шариков), меняем направление на обратное
if (y<=radius) or (x<=radius) or (x+radius>=WindowWidth) then naprav:=-naprav;
for var j:=0 to n-1 do//перебираем все шарики
begin
//определяем расстояние шарика до всех других
var rasst:=sqrt(sqr(shariki[j].x-x)+sqr(shariki[j].y-y) );
if ((rasst<= radius+shariki[j].radius) and (rasst>radius/2)) then//если коснулись
begin
//шарик слева, направление -1, справа +1
if (x<shariki[j].x) then naprav:=-1 else naprav:=+1;
shariki[j].naprav:= -naprav;//меняем направление после соприкосновения
end;
end;
end;
end;
procedure StartGame;
begin
Window.Title := 'Введите начальные данные';
ClearWindow;
n := input(10, 10, 'Количество шариков n =');
setlength(shariki,n);
for var i:=0 to n-1 do{по количеству шаров}
with shariki[i] do//задаем параметры очередного шарика
begin
radius := input(20, 30+40*i, 'Введите радиус шарика ' + (i+1) + ' :');
dlina := input(20, 50+40*i, ' Введите длинну нити ' + (i+1) + ' :');
koord_x:=(windowwidth div (n+1)) * (i+1);//точка крепления нити у верхней шраницы экрана
cvet:= clrandom;//цвет
ugol:=0;//начальный угол с вертикальной осью
naprav:=1;//напрвление вправо
end;
Window.Title := 'Для выхода в основное меню, кликните мышкой!';
mouseDown := False;
lockdrawing;
repeat//собственно цикл рисования колеблющихся шариков
clearwindow;
for var i:=0 to n-1 do//все шарики
Narisovat(shariki[i]);{рисуем цветом фона - стираем}
sleep(100);
for var i:=0 to n-1 do
Dvigat(shariki[i]);{меняем положение}
redraw;
until mouseDown;{нажатие любой клавиши - выход из программы}
UnlockDrawing;
end;
Procedure Help;
begin
Window.Clear;
TextOut(10, 30, ReadAllText('Инструкция.txt'));
SetBrushColor(clYellow); TextOut(10, 10, 'Нажмите Enter для выхода в главное меню.'); ReadLn;
End;
begin
OnMouseDown := MouseClick;
var k : Integer;
repeat
Window.Title := 'Выберите действие';
ClearWindow;
SetBrushColor(clWhite);
TextOut(10, 20, 'Выберите действие');
TextOut(10, 40, '1 - Игра');
TextOut(10, 60, '2 - Инструкция');
TextOut(10, 80, '3 - Выход');
k := input(10, 100, 'Введите номер действия:', clYellow);
case k of
1 : StartGame;
2 : Help;
end;
until k=3;
Window.Close;
end.
Объяснение кода листинга программы
- Объявлен тип записи
tSharikдля представления шарика с полями: радиус, цвет, длина нити, координаты точки подвеса, угол, направление и текущие координаты центра. - Константа
Skorostрегулирует скорость колебаний шариков. - Переменная
nпредставляет количество шариков. - Массив
sharikiсодержит информацию о каждом шарике. - Переменная
mouseDownиспользуется для определения, нажата ли кнопка мыши. - Функция
inputиспользуется для ввода данных с клавиатуры, включая число и строку. - Процедура
Narisovatрисует шарик с нитью, используя заданные параметры. - Процедура
Dvigatизменяет положение шарика в соответствии с его текущим направлением и углом. - Процедура
StartGameзапускает игру, запрашивая у пользователя начальные данные для каждого шарика. - Процедура
Helpотображает инструкцию, а также позволяет пользователю выйти в основное меню. - Основная программа содержит цикл, который повторяется до тех пор, пока пользователь не выберет действие для выполнения.
- Окно программы имеет заголовок, который изменяется в зависимости от выбранного действия.
- При выборе действия
1 - Играпрограмма начинает рисовать колеблющиеся шарики. - При выборе действия
2 - Инструкцияпрограмма отображает инструкцию. - При выборе действия
3 - Выходпрограмма закрывается.