Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Паскаль
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 28.09.2018, 12:55   #1
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 16
Репутация: 10
По умолчанию Отрисованая фигура из массива уходит за границу поля.

http://www.programmersforum.ru/attac...1&d=1538124142
Скрин.

Прошу помочь мне разобраться. Если что недосказал на вопросы отвечу .

Пишу программу которая выведит от 3 до 6 красных кубиков и один зеленый который можно двигать стрелками. Работать должно так: с каждым ходом зеленого двигаются и красные кубики (меняются их координаты и отрисовываются). Но у меня красные кубики двигаются не правильно: первый остается на месте, а остальные рисуются за границами поля.

Процедура поля
Код:

procedure pole;
begin
setpencolor(clBlack);
for var i:=1 to 11 do
line(50,50*i,550,50*i);
for var j:=1 to 11 do
line(50*j,50,50*j,550);
end;


Процедура инициации красных кубиков:
Код:

procedure vrag_init;
begin
i:=1;
n:=1;
nmax:=random(3,6);
repeat
for var i:=1 to n do
dx:=random(1,10);
dy:=random(1,10);

xo[i]:=50*dx;
yo[i]:=50*dy;
hp[i]:=50;
rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);
floodfill(xo[i]+5,yo[i]+5,clred);
textout(xo[1],yo[1]-10,hp[1]);
n:=n+1;
until n>nmax;
end;


Обработчик нажатия клавиши:
Код:

procedure KeyDown(key:integer);
begin
hphero:=150;


//for var i:=1 to n do
//if x=xo[i] then
//hp[i]:=hp[i]-attack;
//if y=yo[i] then
//hp[i]:=hp[i]-attack;

case key of
vk_right:if x<500 then 
          begin
          window.Clear;
          pole;
          x:=x+50;

          setpencolor(clgreen);
          rectangle(x,y,x+50,y+50);// рисуемзеленый квадратик
      floodfill(x+5,y+5,clgreen);
textout(x,y-10,hphero);
n:=nmax;
for var i:=1 to n do
begin
rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);// рисуем каждый из красных с номерами i и координатами xo и yo
floodfill(xo[i]+5,yo[i]+5,clred);
textout(xo[1],yo[1]-10,hp[1]);
end;
i:=i+1;
          redraw;
         end;
         vk_left:if x>50 then
         begin
         window.Clear;
         pole;
         x:=x-50;
         setpencolor(clgreen);
         rectangle(x,y,x+50,y+50);
floodfill(x+5,y+5,clgreen);
textout(x,y-10,hphero);
n:=nmax;
for var i:=1 to n do
begin
rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);
floodfill(xo[i]+5,yo[i]+5,clred);
textout(xo[1],yo[1]-10,hp[1]);
end;
i:=i+1;
         redraw;
         end;
         vk_down:if y<500 then 
          begin
          window.Clear;
          pole;
          y:=y+50;
          setpencolor(clgreen);
          rectangle(x,y,x+50,y+50);
floodfill(x+5,y+5,clgreen);
textout(x,y-10,hphero);
n:=nmax;
for var i:=1 to n do
begin
rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);
floodfill(xo[i]+5,yo[i]+5,clred);
textout(xo[1],yo[1]-10,hp[1]);
end;
i:=i+1;
          redraw;
         end;
                  vk_up:if y>50 then
          begin
          window.Clear;
          pole;
          y:=y-50;
          setpencolor(clgreen);
          rectangle(x,y,x+50,y+50);
    floodfill(x+5,y+5,clgreen);
textout(x,y-10,hphero);
n:=nmax;
for var i:=1 to n do
begin
rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);
floodfill(xo[i]+5,yo[i]+5,clred);//тут ошибка с вылетом
textout(xo[1],yo[1]-10,hp[1]);
end;
i:=i+1;
          redraw;
         end;
end;
end;

Главный цикл:
Код:

begin
setwindowtitle('Злой лес.');
setwindowsize(800,600);
pole;
hphero:=150;

x:=50;
y:=50;
  rectangle(x,y,x+50,y+50);
  floodfill(x+5,y+5,clgreen);
  textout(x,y-10,hphero);
vrag_init;
onkeydown:=keydown;


end.

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

floodfill(xo[i]+5,yo[i]+5,clred);

обработчика нажатия.
Изображения
Тип файла: jpg sshot-61.jpg (46.0 Кб, 5 просмотров)
Kukla19 вне форума   Ответить с цитированием
Старый 28.09.2018, 13:16   #2
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 16
Репутация: 10
По умолчанию

Каким-то фигом после первого квадрата их координатам назначается 0. Хотя координаты записаны в массив после инициации в главном цикле.
Kukla19 вне форума   Ответить с цитированием
Старый 28.09.2018, 13:28   #3
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,502
Репутация: 5308
По умолчанию

Цитата:
Сообщение от Kukla19 Посмотреть сообщение
Пишу программу которая выведит от 3 до 6 красных кубиков и один зеленый
Это не кубики, это квадратики.


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

floodfill(xo[i]+5,yo[i]+5,clred);

ну, очевидно, что ошибка в неверных индексах - у Вас i иногда устанавливается неверно, вот в этом и ошибка.

у Вас, насколько я помню, Pascal ABC.NET ?
я попытаюсь повторить ошибку, потом напишу о результатах.
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 28.09.2018, 14:11   #4
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 16
Репутация: 10
По умолчанию

Да Pascal ABC.NET, спасибо.
Kukla19 вне форума   Ответить с цитированием
Старый 28.09.2018, 14:44   #5
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,502
Репутация: 5308
По умолчанию

во-первых, Вы забыли выложить секцию с заданием переменных.

во-вторых, я взглянул внимательнее на ваш код.
Это же ужас.

начнём с начала:


Цитата:
Сообщение от Kukla19 Посмотреть сообщение
Код:

for var i:=1 to n do
dx:=random(1,10);
dy:=random(1,10);

xo[i]:=50*dx;
yo[i]:=50*dy;
hp[i]:=50;
rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);
floodfill(xo[i]+5,yo[i]+5,clred);
textout(xo[1],yo[1]-10,hp[1]);

в цикле for у вас один оператор - dx:=random(1,10);
всё остальное ЗА ЦИКЛОМ.
про begin | end слышали? Догадываетесь, для чего они нужны?

дальше.
для чего цикл от 1 до n ?

что вообще должен сделать этот код?
Нарисуйте сначала алгоритм (можно в текстовом виде, можно блок-схему), а потом уже программируйте.

p.s. остальное не смотрел.

p.p.s. разработка программы должна идти так - ТЗ, алгоритм-решения, кодирование.
похоже, что первые два этапа Вы пропустили.
а без них трудно.
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 28.09.2018, 15:13   #6
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 16
Репутация: 10
По умолчанию

Да я все время забываю про эти скобки... Сделал скобки все заработало ;-).

Цикл от одного до n это количество квадратиков которым присваиваются координаты.
Код должен выводить квадратики по очереди.
Kukla19 вне форума   Ответить с цитированием
Старый 28.09.2018, 15:43   #7
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,502
Репутация: 5308
По умолчанию

Цитата:
Сообщение от Kukla19 Посмотреть сообщение
Цикл от одного до n это количество квадратиков которым присваиваются координаты.
ок.

а зачем тогда нужен ещё один цикл repeat until ?!
если его убрать, то что будет?

вот так попробуйте:
Код:

procedure vrag_init;
begin
  nmax:=random(3,6);
  n:=nmax;
  for var i:=1 to n do
     xo[i]:=50*random(1,10);
     yo[i]:=50*random(1,10);
     hp[i]:=50;
     rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);
     floodfill(xo[i]+5,yo[i]+5,clred);
     textout(xo[1],yo[1]-10,hp[1]);
  end;
end;

Serge_Bliznykov вне форума   Ответить с цитированием
Старый 29.09.2018, 07:56   #8
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 16
Репутация: 10
По умолчанию

Убрал repeat. Вроде ничего не изменилось.

Вот полный код на текущий момент. С блоком переменных и тд. Посмотрите что происходит при запуске.

Вроде бы сейчас без вылетов, но где-то неправильно происходит процесс заливки, от чего соседние с зеленым квадратиком квадратики тоже закрашиваются. Еще не у всех красных квадратиков отображаются цифры из textout, видимо ошибка в цикле for var 1 to n, надо внимательно посмотреть.

Код:

uses graphabc;

var
n,dx,dy,nmax,i,rx,ry,stop,hod,x,y,attack,hphero: integer;
xo, yo: array[1..10] of integer;
hp: array[1..25] of integer;

label s;

procedure pole;
begin
setpencolor(clBlack);
for var i:=1 to 11 do
line(50,50*i,550,50*i);
for var j:=1 to 11 do
line(50*j,50,50*j,550);
end;


procedure vrag_init;
begin
i:=1;
n:=1;
nmax:=random(3,6);
n:=nmax;
for var i:=1 to n do
begin
dx:=random(1,10);
dy:=random(1,10);

xo[i]:=50*dx;
yo[i]:=50*dy;
hp[i]:=50;
lockdrawing;
rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);
floodfill(xo[i]+5,yo[i]+5,clred);
textout(xo[1],yo[1]-10,hp[1]);
redraw;
n:=n+1;
end;

end;


procedure vrag_move;
begin
n:=nmax;
stop:=random(1);
if stop = 0 then
for var i:=1 to n do
begin
rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);
floodfill(xo[i]+5,yo[i]+5,clred);
textout(xo[1],yo[1]-10,hp[1]);
end;
if stop = 1 then
begin
hod:=random(3);
if hod = 0 then
xo[i]:=xo[i]+50;
if hod = 1 then
xo[i]:=xo[i]-50;
if hod = 2 then
yo[i]:=yo[i]+50;
if hod = 3 then
yo[i]:=yo[i]-50;
rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);
floodfill(xo[i]+5,yo[i]+5,clred);
textout(xo[1],yo[1]-10,hp[1]);
end;
end;


procedure KeyDown(key:integer);
begin
//attack:=50;
hphero:=150;


//for var i:=1 to n do
//if x=xo[i] then
//hp[i]:=hp[i]-attack;
//if y=yo[i] then
//hp[i]:=hp[i]-attack;

case key of
vk_right:if x<500 then 
          begin
          lockdrawing;
                    window.Clear;
          pole;
          x:=x+50;

          setpencolor(clgreen);
          rectangle(x,y,x+50,y+50);
      floodfill(x+5,y+5,clgreen);
textout(x,y-10,hphero);
vrag_move;
          redraw;
         end;
         vk_left:if x>50 then
         begin
                 lockdrawing;
                           window.Clear;
         pole;
         x:=x-50;
         setpencolor(clgreen);
         rectangle(x,y,x+50,y+50);
floodfill(x+5,y+5,clgreen);
textout(x,y-10,hphero);
vrag_move;
         redraw;
         end;
         vk_down:if y<500 then 
          begin

                  lockdrawing;
                            window.Clear;
          pole;
          y:=y+50;
          setpencolor(clgreen);
          rectangle(x,y,x+50,y+50);
floodfill(x+5,y+5,clgreen);
textout(x,y-10,hphero);
vrag_move;
          redraw;
         end;
                  vk_up:if y>50 then
          begin

                  lockdrawing;
                            window.Clear;
          pole;
          y:=y-50;
          setpencolor(clgreen);
          rectangle(x,y,x+50,y+50);
    floodfill(x+5,y+5,clgreen);
textout(x,y-10,hphero);
vrag_move;
          redraw;
         end;
end;
end;

begin
setwindowtitle('Разбойники.');
setwindowsize(800,600);
pole;
hphero:=150;

x:=50;
y:=50;
  rectangle(x,y,x+50,y+50);
  floodfill(x+5,y+5,clgreen);
  textout(x,y-10,hphero);
vrag_init;
onkeydown:=keydown;


end.


Последний раз редактировалось Kukla19; 29.09.2018 в 07:59. Причина: забыл дописать
Kukla19 вне форума   Ответить с цитированием
Старый 30.09.2018, 13:24   #9
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 16
Репутация: 10
По умолчанию

Вчера думал что заливка соседних с активным квадратом происходит изза текстаута, но сегодня проверил заливает соседние даже без слов вверху квадратика.
Kukla19 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уходит текст за блок V1S HTML и CSS 1 07.01.2014 21:38
Письма уходит в спам Gmail GriFFoN PHP 4 08.04.2012 19:08
Обработка формы с name = значение поля из массива WildHunter PHP 5 22.08.2011 14:03
Не установить файрвол - уходит в перезагруз tre Софт 2 24.09.2007 21:29


03:49.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru