Кто поможет переписать программу с графикой PascalABC на FreePascal? Или подскажите почему игра плохо работает - Free Pascal

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

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

Вот код на PascalABC. Помогите переделать под Free или Turbo Pascal. И почему программа на ABC не до конца работает?
Листинг программы
  1. program z4;
  2. uses graphABC;
  3. const n=9; kw=4; kbl=4;m=50;
  4. var i,p:byte; key:char; t:array[1..11] of byte;
  5. procedure clrBar(i:byte);
  6. begin
  7. SetPenColor(clwhite);SetPenWidth(3);
  8. Circle(25+i*m,m+25,20) ;
  9. FloodFill(25+i*m,m+25,clwhite);
  10. end;
  11. procedure drB(i:byte);
  12. begin
  13. SetPenColor(clBlack);SetPenWidth(1);
  14. Circle(25+i*m,m+25,20) ;
  15. FloodFill(25+i*m,m+25,clBlack);
  16. end;
  17. procedure drW(i:byte);
  18. begin
  19. SetPenColor(clBlack);SetPenWidth(1);
  20. Circle(25+i*m,m+25,20) ;
  21. end;
  22. procedure drSt(i:byte);
  23. begin
  24. SetPenColor(clBlack);SetPenWidth(1);
  25. line(25+i*m,110,25+i*m,140);
  26. line(25+i*m,110,25+i*m+10,120);
  27. line(25+i*m,110,25+i*m-10,120);
  28. end;
  29. procedure delSt(i:byte);
  30. begin
  31. SetPenColor(clWhite);SetPenWidth(3);
  32. line(25+i*m,110,25+i*m,140);
  33. line(25+i*m,110,25+i*m+10,120);
  34. line(25+i*m,110,25+i*m-10,120);
  35. end;
  36. begin
  37. //сетка
  38. for i:=1 to n do
  39. Rectangle(m*i,m,m*i+m,2*m);
  40. //нач поз черных
  41. for I:=1 to kw do
  42. begin
  43. Circle(25+i*m,m+25,20) ;
  44. FloodFill(25+i*m,m+25,clBlack);
  45. t[i]:=2;
  46. end;
  47. t[6]:=0;
  48. // нач поз белых
  49. for I:=1+5 to kw+5 do
  50. begin
  51. Circle(25+i*m,m+25,20) ;
  52. t[i]:=1;
  53. end;
  54. drSt(5); p:=5; key:=#13;
  55. writeln('Выбрать кружек - l/r');
  56. writeln('Сделать ход - пробел');
  57. writeln('Выход - E');
  58.  
  59. repeat
  60. read(key);
  61. // key:=readkey;
  62. case key of
  63. 'l': if p>1 then
  64. begin
  65. delSt(p); p:=p-1; drSt(p);
  66. end;
  67. 'r': if p<11 then
  68. begin
  69. delSt(p); p:=p+1; drSt(p);
  70. end;
  71. ' ':begin
  72. if t[p]=2 then //если на черном
  73. begin
  74. if t[p+1]=0 then //рядом свободно
  75. begin
  76. clrBar(p);
  77. drB(p+1);
  78. t[p]:=0; t[p+1]:=2;
  79. end;
  80. if (t[p+1]>0)and (t[p+2]=0) then //рядом свободно
  81. begin
  82. clrBar(p);
  83. drB(p+2);
  84. t[p]:=0; t[p+2]:=2;
  85. end;
  86. end;
  87. if t[p]=1 then // если на белом
  88. begin
  89. if t[p-1]=0 then //рядом свободно
  90. begin
  91. clrBar(p);
  92. drW(p-1);
  93. t[p]:=0; t[p-1]:=1;
  94. end;
  95. if (t[p-1]>0)and (t[p-2]=0) then //рядом свободно
  96. begin
  97. clrBar(p);
  98. drW(p-2);
  99. t[p]:=0; t[p-2]:=1;
  100. end;
  101. end;
  102. end;
  103.  
  104. end;//case
  105. until key='e';
  106.  
  107. end.

Решение задачи: «Кто поможет переписать программу с графикой PascalABC на FreePascal? Или подскажите почему игра плохо работает»

textual
Листинг программы
  1. uses WinGraph,WinCrt;
  2. const n=8;
  3. var
  4.   s,m,gd,gm,k:integer;
  5.   a:array[0..8] of longword=(1,1,1,1,0,2,2,2,2);//это инициализация массива, если другое n, то и массив должен быть другим 1- синий, 2 - красный, 0 - пустая клетка
  6.   c:char;
  7.   finish:boolean;
  8. procedure DrawPole;
  9. var
  10.   x,y,i:integer;
  11. function pc(t:integer):longword;
  12. begin
  13.   case t of
  14.    1:pc:=Blue;
  15.    2:pc:=Red;
  16.    0:pc:=Black;
  17.   end;
  18. end;
  19. begin
  20.   ClearViewPort;
  21.   x:=getmaxx div (n+1);
  22.   y:=getmaxy div 2;
  23.   SetLineStyle(SolidLn,NormWidth,1);
  24.   for i:=0 to n do begin
  25.     SetFillStyle(SolidFill,pc(a[i]));
  26.     SetColor(pc(a[i]));
  27.     Circle(x*i+x div 2,y,x div 3);
  28.     FloodFill(x*i+x div 2,y,pc(a[i]));
  29.     SetColor(White);
  30.     Rectangle(x*i,y-y div 5,x*(i+1),y+y div 5);
  31.   end;
  32.     if m>-1 then begin
  33.       SetColor(Yellow);
  34.       SetLineStyle(DottedLn,QuadWidth,4);
  35.       Rectangle(x*m,y-y div 5,x*(m+1),y+y div 5);
  36.     end;
  37.     SetColor(Green);
  38.     SetLineStyle(DashedLn,QuadWidth,4);
  39.     Rectangle(x*s,y-y div 5,x*(s+1),y+y div 5);
  40.     finish:=true;
  41.     for i:=0 to n div 2-1 do
  42.       if a[i]<>2 then finish:=false;
  43.     for i:=n downto n div 2+1 do
  44.       if a[i]<>1 then finish:=false;
  45.  
  46. end;
  47. begin
  48.   s:=4;m:=-1;k:=0;
  49.   initgraph(gd,gm,'');
  50.   repeat
  51.     DrawPole;
  52.     k:=k+1;
  53.     c:=ReadKey;
  54.     case c of
  55.         #0: case ReadKey of
  56.               #75:if s>0 then s:=s-1;
  57.               #77:if s<n then s:=s+1;
  58.             end;
  59.         #32,#13:begin
  60.              if m=-1 then begin
  61.                if a[s]>0 then m:=s;
  62.               end else
  63.                 if (abs(s-m)<3) and (a[s]=0) then begin
  64.                   a[s]:=a[m];
  65.                   a[m]:=0;
  66.                   m:=-1;
  67.                 end else m:=-1;
  68.               end;
  69.            end;
  70.   until (c=#27) or (finish);
  71.   CloseGraph;
  72.   if finish then writeln('Done in ',k,' moves') else writeln('Program terminated');
  73. end.

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

  1. Программа написана на языке программирования Free Pascal.
  2. Она использует библиотеку WinGraph для работы с графикой.
  3. В начале кода определены константы и переменные:
    • n = 8 (размер поля)
    • s, m, gd, gm, k = 4, -1, 0, 0, 0 (переменные для управления игрой)
    • a = (1,1,1,1,0,2,2,2,2) (массив для представления игрового поля)
    • c = '' (для чтения ключей клавиатуры)
    • finish = false (для контроля окончания игры)
  4. В процедуре DrawPole рисуется игровое поле:
    • Задаются координаты для осей x и y
    • Рисуются линии сетки
    • Рисуются круги на клетках с числами 1 и 2
    • Заполняются прямоугольники вокруг клеток с числами 1 и 2
    • Рисуется прямоугольник вокруг текущей клетки
  5. В основной части программы выполняется цикл, в котором:
    • Рисуется поле
    • Увеличивается счетчик k
    • Считывается ключ с клавиатуры
    • Если нажата клавиша со стрелкой, меняется значение переменной s или m
    • Если нажаты клавиши пробел или enter, происходит обмен значениями между текущей и соседней клетками
    • Если игра завершена, выводится сообщение о количестве ходов
  6. Код может быть адаптирован для игры Змейка или другой игры, использующей сетку.
  7. Возможно, игра плохо работает из-за ошибок в коде, например, из-за неправильного управления памятью или из-за неправильной обработки ввода пользователя.

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


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

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

6   голосов , оценка 4.167 из 5

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

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

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