Создание меню - 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.

Объяснение кода листинга программы

  1. Объявлен тип записи tSharik для представления шарика с полями: радиус, цвет, длина нити, координаты точки подвеса, угол, направление и текущие координаты центра.
  2. Константа Skorost регулирует скорость колебаний шариков.
  3. Переменная n представляет количество шариков.
  4. Массив shariki содержит информацию о каждом шарике.
  5. Переменная mouseDown используется для определения, нажата ли кнопка мыши.
  6. Функция input используется для ввода данных с клавиатуры, включая число и строку.
  7. Процедура Narisovat рисует шарик с нитью, используя заданные параметры.
  8. Процедура Dvigat изменяет положение шарика в соответствии с его текущим направлением и углом.
  9. Процедура StartGame запускает игру, запрашивая у пользователя начальные данные для каждого шарика.
  10. Процедура Help отображает инструкцию, а также позволяет пользователю выйти в основное меню.
  11. Основная программа содержит цикл, который повторяется до тех пор, пока пользователь не выберет действие для выполнения.
  12. Окно программы имеет заголовок, который изменяется в зависимости от выбранного действия.
  13. При выборе действия 1 - Игра программа начинает рисовать колеблющиеся шарики.
  14. При выборе действия 2 - Инструкция программа отображает инструкцию.
  15. При выборе действия 3 - Выход программа закрывается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы