Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Орловский Дмитрий
Статус: Академик
Рейтинг: 4458
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2642
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2332
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Pascal (Паскаль)

Номер выпуска:1171
Дата выхода:19.04.2011, 20:00
Администратор рассылки:Boriss (Академик)
Подписчиков / экспертов:179 / 177
Вопросов / ответов:1 / 1

Вопрос № 182806: Здравствуйте эксперты. Программа писалась на Pascal ABC. Задание (ужаснетесь сразу говорю) : =========================== Написать игру «Кирпичная кладка». Правила игры: по экрану движется объект. Создавать препятствия из кирпичей, препя...



Вопрос № 182806:

Здравствуйте эксперты.
Программа писалась на Pascal ABC.
Задание (ужаснетесь сразу говорю) :
===========================
Написать игру «Кирпичная кладка». Правила игры: по экрану движется объект. Создавать препятствия из кирпичей, препятствующие перемещению объекта по экрану. Кирпич перемещается клавишами управления курсором, а устанавливается клавишей Enter. Объект должен обходить препятствия.
===========================
Вот теперь ужас номер 2.:
Паскаль я раньше не изучал, команды вообще не знаю, но каким то чудесным образом умудрился написать вот такую вещь.
Комментариев очень мало, но надеюсь вы поймете.
Проблема у меня в том, что
1. Не пойму как заставить объект обходить кирпичики, перебил много алгоритмов, но все равно он либо наваливается либо перепрыгивает.
2. Если заметите то при использование клавиши она повторяет прошлое нажатие, не пойму как его обнулить, куда то не пихал.
3. Как реализовать движение объекта под кодовым ви дом Шарик, в независимую часть, чтобы не зависел от того была ли клавиши нажата или нет.( пока стоит взаимосвязь.)

Код:

uses ABCObjects,Events,GraphABC,Timers,Utils,CRT;
var
x,y,st,k,l : integer; { переменные связанные с положением кубика(x,y), st ( отвечает за dx=смещение), k,l (k= сколько прямоугольник уже есть, l простая переменная (не нужная.)}
width,height :real; { пока не пригодились}
cx,cy,cr:integer; { значение шарика }
ax,ay:integer ; { используются для сохранения координат положения прошлого кирпичика перед созданием нового }
key: char;
const n=200;
type Mas = array[1..n,1..2] of integer;
var a:Mas;
var i,j: integer;
{ Прорисовка прошлы кирпичей }
procedure oldBox(dx,dy:integer);
begin
j:=1;
x:=a[i,j];
j:=j+1;
y:=a[i,j];
Rectangle(x,y,x+dx,y+dy);
end;
{Прорисовка нового кирпичя}
procedure Box(dx,dy:integer);
begin
x:=0;y:=0;
j:=1;
x:=x+a[i,j];
j:=j+1;
y:=y+a[i,j];
Rectangle(x,y,x+dx,y+dy);
end;
{ прорисовка шарика}
procedure Bowling(cx,cy,cr:integer);
begin
Circle (cx,cy,cr);
end;
{ Алгоритм движения шарика и проверки на кирпичи }
{ Основная процедура перерисовки}
procedure Repaint(x,y,dx,dy,cx,cy,cr:integer);
begin
clrscr;
for i:=1 to k do
for j:=1 to 1 do
begin
x:=a[i,j];
j:=j+1;
y:=a[i,j];
if (i+1=k) then
Box(st+25,st)
else
oldBox(st+25,st)
end;
if (ax>=cx) then
cx:=ax-cx;

Circle (cx,cy,cr);
end;
{ Движение Вверх }
procedure Up (dx,dy:integer);
begin
i:=k+1;
j:=1;
x:=a[i,j];
j:=j+1;
y:=a[i ,j];
Repaint(x,y,st+25,st,cx,cy,cr);
cy:=cy+dy;
y:=y-dy;
j:=1;
a[i,j]:=x;
j:=j+1;
a[i,j]:=y;
end;
{ Движение Вниз }
procedure Down(dx,dy:integer);
begin
i:=k+1;
j:=1;
x:=a[i,j];
j:=j+1;
y:=a[i,j];
Repaint(x,y,st+25,st,cx,cy,cr);
cy:=cy-dy;
y:=y+dy;
j:=1;
a[i,j]:=x;
j:=j+1;
a[i,j]:=y;
end;
{ Движение Влево }
procedure Left(dx,dy:integer);
begin
i:=k+1;
j:=1;
x:=a[i,j];
j:=j+1;
y:=a[i,j];
Repaint(x,y,st+25,st,cx,cy,cr);
cx:=cx-dx;
x:=x+dx;
j:=1;
a[i,j]:=x;
j:=j+1;
a[i,j]:=y;
end;
{ Движение Вправо }
procedure Right(dx,dy:integer);
begin
i:=k+1;
j:=1;
x:=a[i,j];
j:=j+1;
y:=a[i,j];
Repaint(x,y,st+25,st,cx,cy,cr);
cx:=cx+dx;
x:=x-dx;
j:=1;
a[i,j]:=x;
j:=j+1;
a[i,j]:=y;
end;
{ Процедура за Сохранение координат кирпича }
procedure Enter(Mas:integer);
begin
i:=k;
j:=1;
a[i,j]:=x;
ax:=x;
j:=j+1;
a[i,j]:=y;
ay:=y;
k:=k+1;
i:=k;
j:=1;
a[i,j]:=0;
j:=j+1;
a[i,j]:=0;
x:=0;y:=0;
Repaint(x,y,st+25,st,cx,cy,c r);

end;
{ Основная Часть }
begin
st:=25;
SetWindowCaption('Кирпичная кладка Типо того игра Клёвая голосуем');
SetWindowSize(640,480);
SetBrushColor(RGB(100,142,12));
k:=k+1;
x:=0;
y:=0;
cx:=340;
cy:=400;
cr:=20;


while key<>#27 do
begin
// Bowling(cx,cy,cr);
key:='0';
key:=readkey;
case key of
#80 : Down(st+25,st);
#72 : Up(st+25,st);
#75 : Left(st+25,st);
#77 : Right(st+25,st);
#13 : Enter(a[k,j]);
end;
key:='0';
//Bowling(cx,cy,cr);
end;

end.

Отправлен: 11.04.2011, 19:46
Вопрос задал: АлексАлексей (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Зенченко Константин Николаевич (Модератор) :
Здравствуйте, АлексАлексей!

Смотрите приложение.
Реализован волновой алгоритм поиска хода в лабиринте. При вычислении возможного хода в массиве POLE отмечается положительным значением(препятствия имеют отрицательные числа) номер возможного хода, в массиве А- запоминается сам ход. Когда массив будет заполнен, находится максимальное значение и с помощью массива А, находится начальное направление движения шара. Маркер препятствия и шарик не могут перейти на уже занятое поле, но маркер может стоять на последнем выставленом препятствии.

Шарик иногда "топчется" на месте, это из-за того, что максимальное значение расчитывается при каждом ходе и иногда меняет свое положение.
ps:вопросы задавайте в мини-форум.
Удачи!

Приложение:

-----
Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч

Ответ отправил: Зенченко Константин Николаевич (Модератор)
Ответ отправлен: 18.04.2011, 18:20
Номер ответа: 266759
Украина, Киев
Тел.: +38-097-238-60-03
Адрес: Украина, Киев

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266759 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное