Найти ошибку в программе перемещения круга - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

В центре графического окна рисуется красный круг. Используя клавиши управления курсором (вправо, влево, вверх, вниз), можно перемещать этот круг по графическому окну. При этом круг не должен выходить за пределы окна.C помощью клавиши ‘+’ (VK_Add) можно увеличивать размер круга, а с помощью клавиши ‘-’ (VK_Subtract) уменьшать его. При этом круг не должен становиться больше высоты графического окна (выходить за его границы) и меньше минимального размера. Минимальный размер круга и величина, на которую он изменяет свой размер, задаются в программе константами. Вот то,что у меня получилось:
Листинг программы
  1. Program Romb;
  2. Uses GraphABC;
  3. const
  4. minR=5;
  5. Delta=5;
  6. Var
  7. R, WW, WH, X, Y : Integer;
  8. Procedure KeyDown(Key: Integer);
  9. var RNew:integer;
  10. Begin
  11. RNew:=R;
  12. Case Key Of
  13. VK_Add:
  14. If (X+R+Delta < WindowWidth) And (Y+R+Delta < WindowHeight) Then
  15. RNew := R + Delta;
  16. VK_Subtract:
  17. If (R-Delta >= minR) Then
  18. RNew := R - Delta;
  19. End;
  20. if R<>RNew then begin
  21. SetPenColor(clWhite);
  22. SetBrushColor(clWhite);
  23. Circle(X, Y, R);
  24. R:=RNew;
  25. SetPenColor(clRed);
  26. SetBrushColor(clRed);
  27. Circle(X, Y, R);
  28. end;
  29. End;
  30. Procedure KeyDown2(Key2: Integer);
  31. Begin
  32. SetPenColor(clWhite);
  33. SetBrushColor(clWhite);
  34. Circle(X, Y, R);
  35. Case Key2 of
  36. VK_Up:
  37. If Y >= R + Delta Then
  38. Y := Y - Delta;
  39. VK_Right:
  40. If X <= WW - (R + Delta) Then
  41. X := X + Delta;
  42. VK_Down:
  43. If Y <= WH - (R + Delta) Then
  44. Y := Y + Delta;
  45. VK_Left:
  46. If X >= R + Delta Then
  47. X := X - Delta;
  48. End;
  49. SetPenColor(clRed);
  50. SetBrushColor(clRed);
  51. Circle(X, Y, R);
  52. End;
  53. Begin
  54. CenterWindow;
  55. WW := WindowWidth;
  56. WH := WindowHeight;
  57. X := WW div 2;
  58. Y := WH div 2;
  59. SetSmoothing(False);
  60. SetPenColor(clRed);
  61. SetBrushColor(clRed);
  62. R:=minR;
  63. Circle(X, Y, R);
  64. OnKeyDown := KeyDown;
  65. WW := WindowWidth;
  66. WH := WindowHeight;
  67. X := WW div 2;
  68. Y := WH div 2;
  69. SetSmoothing(False);
  70. SetPenColor(clRed);
  71. SetBrushColor(clRed);
  72. Circle(X, Y, R);
  73. OnKeyDown:= KeyDown2;
  74. End.
С движением вроде бы всё норм,но размеры почему-то не работают(хотя в отдельной программе всё функционирует).

Решение задачи: «Найти ошибку в программе перемещения круга»

textual
Листинг программы
  1. program Romb;
  2.  
  3. uses
  4.   GraphABC;
  5.  
  6. const
  7.   minR = 5;  
  8.   Delta = 5;
  9.  
  10. var
  11.   R, WW, WH, X, Y: Integer;
  12.  
  13. procedure KeyDown(Key: Integer);
  14. var
  15.   RNew: integer;
  16. begin
  17.   SetPenColor(clWhite);
  18.   SetBrushColor(clWhite);
  19.   Circle(X, Y, R);
  20.   RNew := R;
  21.   case Key of
  22.     VK_Up:
  23.       if Y >= R + Delta Then
  24.         Y := Y - Delta;
  25.     VK_Right:
  26.       if X <= WW - (R + Delta) Then
  27.         X := X + Delta;
  28.     VK_Down:
  29.       if Y <= WH - (R + Delta) Then
  30.         Y := Y + Delta;
  31.     VK_Left:
  32.       if X >= R + Delta Then
  33.         X := X - Delta;
  34.     VK_Add:
  35.       //Проверим все 4 стороны круга
  36.       if (X + R + Delta < WindowWidth) AND (X - R - Delta > 0) AND (Y + R + Delta < WindowHeight) AND (Y - R - Delta > 0) Then
  37.         RNew := R + Delta;
  38.     VK_Subtract:
  39.       if (R - Delta >= minR) Then
  40.         RNew := R - Delta;
  41.   End;
  42.   if R <> RNew then
  43.     R := RNew;
  44.   SetPenColor(clRed);
  45.   SetBrushColor(clRed);
  46.   Circle(X, Y, R);
  47.   Redraw
  48. end;
  49.  
  50. begin
  51.   LockDrawing;
  52.   CenterWindow;
  53.   WW := WindowWidth;
  54.   WH := WindowHeight;
  55.   X := WW div 2;
  56.   Y := WH div 2;
  57.   SetSmoothing(False);
  58.   SetPenColor(clRed);
  59.   SetBrushColor(clRed);
  60.   R := minR;
  61.   Circle(X, Y, R);
  62.   Redraw;
  63.   //Событию присваивается ТОЛЬКО ОДНА процедура
  64.   OnKeyDown := KeyDown;
  65. end.

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

Список элементов кода:

  1. Объявление переменных и констант
  2. Определение процедуры KeyDown, которая обрабатывает нажатия клавиш
  3. Проверка нажатия клавиш и изменение координат круга при необходимости
  4. Проверка всех 4 сторон круга при нажатии клавиши VK_Add
  5. Проверка нажатия клавиши VK_Subtract и уменьшение радиуса круга при необходимости
  6. Сравнение текущего радиуса круга с новым значением и обновление радиуса при необходимости
  7. Очистка и обновление графического окна после изменения круга
  8. Установка начальных значений переменных перед основным циклом программы
  9. Запуск основного цикла программы
  10. Завершение программы

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


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

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

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы