Помощь - Поиск - Пользователи - Календарь
Полная версия: Перемещение мячиков одновременно
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
Олежечег(быв. Олежик)
Всем привет...
В институте курсовой работой будет игра.
Я предложил свой варант игры....и преподы дали мне согласие.

Игра будет реализовывать перемещение мячиков( 3 штуки ) по доске 3х3..( т.е. 9 сегментов ).....

ОПИСАНИЕ.

1.на поле 3х3 расположены 3 шарика разного цвета....
- СИНИЙ
- КРАСНЫЙ
- ЗЕЛЁНЫЙ

2.на поле 3х3 есть 3 сегмента разного цвета...
- СИНИЙ
- КРАСНЫЙ
- ЗЕЛЁНЫЙ

3. КРАСНЫЙ шарик расположен на ЗЁЛЁНОМ сегменте.....
СИНИЙ шарик расположен на СИНЕМ сегменте(т.е. на своём месте он находится)............
ЗЕЛЁНЫЙ шарик расположен на КРАСНОМ сегменте.........

3.Их месторасположение вы увидите на картинках, скачав предварительно АРХИВ с этими картинками.....
Нажмите для просмотра прикрепленного файла
( В архиве содержатся 6 картинок, последовательностью от 1 до 6 )

4.Представьте, что это как доска, которую вы держите в руках....и при наклоне ВПЕРЁД( а на экране вверх ) перемещаются все шарики ВПЕРЁД( Если , конечно, перед этим шариком нет препятствия )...

5.На поле расположены несколько стенок, через которые шарики перекатиться не могут

ЗАДАЧА ( В чём же заключается победа игры)
Надо, путём совместного передвигания шариков, поставить каждый шарик на свой сегмент....


Хотелось бы услышать ваши предложения......

А сделать я бы хотел её совместно с вами....
Меню хотелось бы найти на вашем форуме
(ЕДИНСТВЕННЫЙ МИНУС....модуль ГРАФ будем тока проходить в инсте в этот понедельник, поэтому особо незнаю, как там что =) )
Олежечег(быв. Олежик)
народ.
Будет ли лучше..
если я сделаю масив 3х3?
т.к. я посмотрел..и подумал, что лучше будет, если просто на экране...
после того как нарисую 9 квадратиков..буду просто перемещать свои шарики...
Допустим...
У меня для каждого шарика есть своё значение...mestox1,mestoу1 ..mestox2,mestoy2...mestoх3,mestoу3...
Значения будут const....
и...я ставлю перед всем этим while , который будет сравнивать эти значения через каждый ход, совершённый пользователем.
ДО ТЕХ ПОР ПОКА mestox1<>х1 and........и так далее......

Можете помочь с проверкой месторасположением шариков!!!!
Lapp
Цитата(Олежечег(быв. Олежик) @ 18.04.2007 1:18) *

народ.
Будет ли лучше..
если я сделаю масив 3х3?
т.к. я посмотрел..и подумал, что лучше будет, если просто на экране...

Массив (доску, 3х3) завести надо, имхо.
Ты подошел с другого конца. У тебя есть массив (на самом деле - не совсем массив, и это еще хуже..) шариков, каждый элемент его - две координаты. Такой подход имеет право на жизнь, конечно, но подумай вот, о чем..
Когда ты ты перемещаешь шарик на новую клетку, тебе нужно проверить, не занята ли она. Для этого в твоей реализации нужно пройтись по всему массиву шариков и проверить их позиции. В схеме с массивом доски нужно проверить всего одно поле - клетку доски.
Далее, тебе вообще не потребуется никаких специальных координат - их роль будут с успехом выполнять индексы массива. Массив этот должен содержать всего одно число - номер шарика, находящегося в этой клетке, либо ноль, если она пустая.

Далее, тебе надо задать цвет клеток на доске - это тоже желательно делать в массиве доски, 3х3 (добавляется еще один элемент, то есть желательно делать
array [1..3,1..3] of record 
Shar,Color:integer
end


Еще один совет: не замешивай сразу с графикой.. Сделай основной модуль, который двигает шары в соответствии с правилами игры. В нем используй процедуру ShowDesk, которая сначала может быть просто пустой, или ты в ней можешь просто в тексте распечатать матрицу, при этом цвет клетки и шара указывать номером или делать цвет цифры и фона соответствующими. Потом эту процедуру сделаешь в графике.

Добавлено через 1 мин.
А проверку на выигрыш сделать очень просто: проходишь по всей доске (двойной цикл по клеткам) и проверяешь на равенство Shar=Color
Олежечег(быв. Олежик)
а по какому критерию лучше выискивать лидера в таблице рекордов....
?????
Задать время......или сказать, сколько он потратил ходов?
Как это реализовать?
Гость
Цитата(Олежечег(быв. Олежик) @ 18.04.2007 5:35) *

Задать время......или сказать, сколько он потратил ходов?
Как это реализовать?

И то и другое неплохо. Сам выбирай.
Реализовать - время берешь с помощью GetTime. А ходы считать как - сам думай smile.gif

Я вижу еще одну трудность. Не совсем понимаю, как задавать стенки между клетками.. Думаю, надо добавить в запись для клетки еще два поля - скажем, Left и Up. Наличие 1 в них будет означать стенку, а 0 - нет стенки.
Lapp
Предыдущий пост - мой.
Кстати, на всякий случай: процедура GetTime - в модуле DOS
Олежечег(быв. Олежик)
Вот....
уря...сделал менюшку...
но вот проблема.....
Мне сказали ей переделать в динамическое меню....
Подскажите как?

Код
Program Menu;
uses crt, graph;

type
TMenu=record
  name:string;
  active:boolean;
end;

const
max=4;

var
driver,mode:integer;
MenuList:array[1..max] of TMenu;
i:integer;
x,y:integer;
key:char;
keyt:byte;
act,nact,pact:byte;
exit:boolean;

Procedure DrawButton(name:string;active:boolean;x,y:integer);
var
h,w:integer;
tc,bc:integer;
begin
SetTextJustify(CenterText, CenterText);
h:=TextWidth(name);
w:=TextHeight(name);
tc:=4;
bc:=15;
if active then
  begin
   SetFillStyle(1,0);
   Bar(x+40,y+40,x+h+20,y+w+20);
   SetFillStyle(1,bc);
   Bar(x,y,x+h+40,y+w+40);
   SetColor(tc);
   Rectangle(x,y,x+h+40,y+w+40);
   OutTextXY(x+(h div 2)+20,y+(w div 2)+20,name);
  end
else
  begin
   SetFillStyle(1,0);
   Bar(x+40,y+40,x+h+20,y+w+20);
   SetFillStyle(1,tc);
   Bar(x,y,x+h+40,y+w+40);
   SetColor(bc);
   Rectangle(x,y,x+h+40,y+w+40);
   OutTextXY(x+(h div 2)+20,y+(w div 2)+20,name);
  end;
end;

BEGIN
clrscr;

driver:=vga;
mode:=2;
InitGraph(driver,mode,'C:\bp\BGI\');
{ key:=readkey;
keyt:=ord(key);}
MenuList[1].name:='Game';
MenuList[1].active:=true;
MenuList[2].name:='Records';
MenuList[2].active:=false;
MenuList[3].name:='Options';
MenuList[3].active:=false;
MenuList[4].name:='Exit';
MenuList[4].active:=false;
act:=1;
exit:=false;
Repeat
  x:=250;
  y:=200;
  SetTextStyle(DefaultFont, HorizDir, 1);
  SetFillStyle(1,7);
  Bar(0,0,640,480);
  for i:=1 to max do
   begin
    DrawButton(MenuList[i].name,MenuList[i].active,x,y);
    y:=y+50;
   end;
  key:=readkey;
  if ord(key)=0 then
   key:=readkey;
  case ord(key) of
   72:
    begin
     nact:=act-1;
     if nact=0 then
      nact:=4;
     MenuList[act].active:=not(MenuList[act].active);
     MenuList[nact].active:=not(MenuList[nact].active);
     if act>1 then
      act:=act-1
     else
      act:=4;
    end;
   80:
    begin
     nact:=act+1;
     if nact=5 then
      nact:=1;
     MenuList[act].active:=not(MenuList[act].active);
     MenuList[nact].active:=not(MenuList[nact].active);
     if act<4 then
      act:=act+1
     else
      act:=1;
    end;
   13:
    begin
     case act of
      1:
       begin
        SetTextStyle(DefaultFont, HorizDir,2);
        DrawButton('‚лЎа ­  Є­®ЇЄ  Game', true, 150, 300);{Введена клавиша ....}
        repeat
        until KeyPressed;
       end;
      2:
       begin
        SetTextStyle(DefaultFont, HorizDir,2);
        DrawButton('‚лЎа ­  Є­®ЇЄ  Records', true, 150, 300);{Введена клавиша ....}
        repeat
        until KeyPressed;
       end;
      3:
       begin
        SetTextStyle(DefaultFont, HorizDir,2);
        DrawButton('‚лЎа ­  Є­®ЇЄ  Options', true, 150, 300);{Введена клавиша ....}
        repeat
        until KeyPressed;
       end;
      4:
       begin
        exit:=true;
       end;
     end;
    end;
  end;
until exit;

CloseGraph;
END.
Олежечег(быв. Олежик)
Тут попробовал новую тему.....
Менюшку сделал...
Слава богу!!!
Динамическое!!!
Так горд собой)))
А насчёт своей игры....понапридумывал многое..
)))))))
Нажмите для просмотра прикрепленного файла
Я хочу сделать вот так!!!
Вы увидели массив..
заполненный 0-ми и 1-ми.
Якобы......
Шарики могут двигаться тока по нечётным координатам....
[1,1][1,3][1,5][3,1][3,3][3,5][5,1][5,3][5,5]
И..перед каждым шагом делаю проверку..
Таким образом я хочу показать стенки!!!!!
Т.Е.
Где стоят цифры 1, это стенки!
Если на пути встречаются 2 последовательных нуля(0), то шарик двигается!
В противном случае не происходит движение шарика.
Вроде хорошо!!!!
Как идейка?
Или можно описать стенки по-лучше?
Олежечег(быв. Олежик)
LAPP...
Посмотри пожалуйста....
Да и все..
посмотрите это пожалуйста....
))
Я сделал реализацию своей игры...
Впринципе работает..
Но вот в чём глюк..
в некоторых моментах Шарик двигаться не хочет.....
Или наоборот..
исчезает..
в основном исчезает на синей позиции.......
Т.е. на синем квадратике....
Посмотрите пожалуйста........
Заранее скажу..
В процедуре драг......
На каждую клавишу ставлю проверку...
Конечно длинная...
но как смог..
Вот..
)))
smile.gif



Код
Program shar;
uses crt,graph;




  type
  PCircle = ^TCircle;
     Tcircle = object
         x,y,Radius,rradius : integer;
         color:byte;
         visible:boolean;
         Constructor Init(ix,iy:integer;
                          iRadius:integer;
                          icolor: byte);
         procedure Show;virtual;
         procedure hide; virtual;
         procedure drag(step:integer;ch:char);
         procedure MoveTo(xnew,ynew:integer);
         function isvisible:boolean;
    end;
    var
   driver,i,mode,y,x:integer;
    p1,p2,p3:pcircle;
    Ch,Q:char;

procedure igrpole;
  begin
  setbkcolor(black);
  setcolor(darkgray);
  setfillstyle(solidfill,4);
  bar(120,6,276,162);
    setfillstyle(solidfill,15);
  bar(276,6,432,162);
    setfillstyle(solidfill,15);
  bar(432,6,588,162);
  setfillstyle(solidfill,1);
  bar(276,162,432,318);
    setfillstyle(solidfill,15);
  bar(120,162,276,318);
    setfillstyle(solidfill,15);
  bar(432,162,588,318);
  setfillstyle(solidfill,2);
    bar(432,318,588,474);
    setfillstyle(solidfill,15);
  bar(120,318,276,474);
    setfillstyle(solidfill,15);
  bar(276,318,432,474);
for i:=157 to 167 do
   line(120,i,276,i);
  for i:=427 to 437 do
   line(i,6,i,162);
  for i:=313 to 323 do
   line(120,i,432,i);
   line(120,6,588,6);
   line(120,6,120,474);
   line(120,474,588,474);
   line(588,6,588,474);
   line(276,6,276,474);
   line(432,6,432,474);
   line(120,162,588,162);
   line(120,318,588,318);
end;

   constructor Tcircle.init;
  begin
   x:=ix;
   y:=iy;
    radius:=iradius;
    color:=icolor;
    visible:=false;
  end;



function Tcircle.IsVisible;
  begin
    IsVisible:=visible;
  end;

    procedure Tcircle.show;
  var
  tempcolor:byte;

  begin
    tempcolor:=getcolor;
    setcolor(color);
    setfillstyle(solidfill,color);
    fillellipse(x,y,radius,radius);
    visible:=true;
    setcolor(tempcolor);
  end;


procedure Tcircle.Hide;
  var
    tempColor:byte;
  begin
    tempColor:=color;
    color:=getpixel(x+radius+5,y+radius+5);
    setfillstyle(solidfill,color);
    show;
    visible:=false;
    color:=TempColor;
  end;


procedure Tcircle.Drag(Step:integer;ch:char);
const
   centr1x=198;
   centr2x=354;
   centr3x=510;
   centr1y=84;
   centr2y=240;
   centr3y=396;
begin
   Case Ord(Ch) of
     72:if (x<>198) and
        (y<>84) and
        ((x<>354) or (y<>396)) and
        (((p1^.x<>centr2x) or (p1^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr2y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr2y)) or
         ((p2^.x<>centr2x) or (p2^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
        (((p1^.x<>centr3x) or (p1^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
         ((p2^.x<>centr3x) or (p2^.y<>centr2y))) and
        (((p1^.x<>centr3x) or (p1^.y<>centr2y)) or
         ((p2^.x<>centr3x) or (p2^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
        (((p1^.x<>centr2x) or (p1^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
         ((p3^.x<>centr2x) or (p3^.y<>centr2y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr2y)) or
         ((p3^.x<>centr2x) or (p3^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
        (((p1^.x<>centr3x) or (p1^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
         ((p3^.x<>centr3x) or (p3^.y<>centr2y))) and
        (((p1^.x<>centr3x) or (p1^.y<>centr2y)) or
         ((p3^.x<>centr3x) or (p3^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
        (((p3^.x<>centr2x) or (p3^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ §Ґ«Ґ­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr2y))) and
        (((p3^.x<>centr2x) or (p3^.y<>centr2y)) or
         ((p2^.x<>centr2x) or (p2^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ §Ґ«Ґ­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
        (((p3^.x<>centr3x) or (p3^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ §Ґ«Ґ­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
         ((p2^.x<>centr3x) or (p2^.y<>centr2y))) and
        (((p3^.x<>centr3x) or (p3^.y<>centr2y)) or
         ((p2^.x<>centr3x) or (p2^.y<>centr1y))) then    {Љ®­Ґж Їа®ўҐаЄЁ §Ґ«Ґ­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
               MoveTo(x, y-Step);   {Up}
     75:if (x<>198) and
        ((x<>510) or (y<>84)) and
        (((p1^.x<>centr1x) or (p1^.y<>centr1y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr1y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr1y)) or
         ((p2^.x<>centr1x) or (p2^.y<>centr1y))) and     {konec proverki 2-h sharikov na pozicii 354}
        (((p1^.x<>centr1x) or (p1^.y<>centr2y)) or       {na4alo proverki 2-h sharikov na pozicii 550}
         ((p2^.x<>centr2x) or (p2^.y<>centr2y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr2y)) or
         ((p2^.x<>centr1x) or (p2^.y<>centr2y))) and     {konec proverki 2-h sharikov na pozicii 550}
        (((p1^.x<>centr1x) or (p1^.y<>centr3y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr3y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr3y)) or
         ((p2^.x<>centr1x) or (p2^.y<>centr3y))) and
        (((p1^.x<>centr1x) or (p1^.y<>centr1y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p3^.x<>centr2x) or (p3^.y<>centr1y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr1y)) or
         ((p3^.x<>centr1x) or (p3^.y<>centr1y))) and     {konec proverki 2-h sharikov na pozicii 354}
        (((p1^.x<>centr1x) or (p1^.y<>centr2y)) or       {na4alo proverki 2-h sharikov na pozicii 550}
         ((p3^.x<>centr2x) or (p3^.y<>centr2y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr2y)) or
         ((p3^.x<>centr1x) or (p3^.y<>centr2y))) and
        (((p1^.x<>centr1x) or (p1^.y<>centr3y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p3^.x<>centr2x) or (p2^.y<>centr3y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr3y)) or
         ((p3^.x<>centr1x) or (p2^.y<>centr3y))) and
        (((p3^.x<>centr1x) or (p3^.y<>centr1y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr1y))) and
        (((p3^.x<>centr2x) or (p3^.y<>centr1y)) or
         ((p2^.x<>centr1x) or (p2^.y<>centr1y))) and     {konec proverki 2-h sharikov na pozicii 354}
        (((p3^.x<>centr1x) or (p3^.y<>centr2y)) or       {na4alo proverki 2-h sharikov na pozicii 550}
         ((p2^.x<>centr2x) or (p2^.y<>centr2y))) and
        (((p3^.x<>centr2x) or (p3^.y<>centr2y)) or
         ((p2^.x<>centr1x) or (p2^.y<>centr2y))) and
        (((p3^.x<>centr1x) or (p1^.y<>centr3y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr3y))) and
        (((p3^.x<>centr2x) or (p1^.y<>centr3y)) or
         ((p2^.x<>centr1x) or (p2^.y<>centr3y))) then     {konec proverki 2-h sharikov na pozicii 354}
               MoveTo(x-Step, y); {Left}
     77:if (x<>510) and
        ((x<>354) or (y<>84)) and
        (((p1^.x<>centr1x) or (p1^.y<>centr1y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr1y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr1y)) or
         ((p2^.x<>centr1x) or (p2^.y<>centr1y))) and     {konec proverki 2-h sharikov na pozicii 354}
        (((p1^.x<>centr3x) or (p1^.y<>centr2y)) or       {na4alo proverki 2-h sharikov na pozicii 550}
         ((p2^.x<>centr2x) or (p2^.y<>centr2y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr2y)) or
         ((p2^.x<>centr3x) or (p2^.y<>centr2y))) and     {konec proverki 2-h sharikov na pozicii 550}
        (((p1^.x<>centr3x) or (p1^.y<>centr3y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr3y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr3y)) or
         ((p2^.x<>centr3x) or (p2^.y<>centr3y))) and
        (((p1^.x<>centr1x) or (p1^.y<>centr1y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p3^.x<>centr2x) or (p3^.y<>centr1y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr1y)) or
         ((p3^.x<>centr1x) or (p3^.y<>centr1y))) and     {konec proverki 2-h sharikov na pozicii 354}
        (((p1^.x<>centr3x) or (p1^.y<>centr2y)) or       {na4alo proverki 2-h sharikov na pozicii 550}
         ((p3^.x<>centr2x) or (p3^.y<>centr2y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr2y)) or
         ((p3^.x<>centr3x) or (p3^.y<>centr2y))) and
        (((p1^.x<>centr3x) or (p1^.y<>centr3y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p3^.x<>centr2x) or (p2^.y<>centr3y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr3y)) or
         ((p3^.x<>centr3x) or (p2^.y<>centr3y))) and
        (((p3^.x<>centr1x) or (p3^.y<>centr1y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr1y))) and
        (((p3^.x<>centr2x) or (p3^.y<>centr1y)) or
         ((p2^.x<>centr1x) or (p2^.y<>centr1y))) and     {konec proverki 2-h sharikov na pozicii 354}
        (((p3^.x<>centr3x) or (p3^.y<>centr2y)) or       {na4alo proverki 2-h sharikov na pozicii 550}
         ((p2^.x<>centr2x) or (p2^.y<>centr2y))) and
        (((p3^.x<>centr2x) or (p3^.y<>centr2y)) or
         ((p2^.x<>centr3x) or (p2^.y<>centr2y))) and
        (((p3^.x<>centr3x) or (p1^.y<>centr3y)) or       {na4alo proverki 2-h sharikov na pozicii 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr3y))) and
        (((p3^.x<>centr2x) or (p1^.y<>centr3y)) or
         ((p2^.x<>centr3x) or (p2^.y<>centr3y))) then
               MoveTo(x+Step, y); {Right}
     80:if (x<>198) and
        (y<>396) and
        ((x<>354) or (y<>240)) and
        (((p1^.x<>centr2x) or (p1^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr2y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr2y)) or
         ((p2^.x<>centr2x) or (p2^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
        (((p1^.x<>centr3x) or (p1^.y<>centr3y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
         ((p2^.x<>centr3x) or (p2^.y<>centr2y))) and
        (((p1^.x<>centr3x) or (p1^.y<>centr2y)) or
         ((p2^.x<>centr3x) or (p2^.y<>centr3y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
        (((p1^.x<>centr2x) or (p1^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
         ((p3^.x<>centr2x) or (p3^.y<>centr2y))) and
        (((p1^.x<>centr2x) or (p1^.y<>centr2y)) or
         ((p3^.x<>centr2x) or (p3^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
        (((p1^.x<>centr3x) or (p1^.y<>centr3y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
         ((p3^.x<>centr3x) or (p3^.y<>centr2y))) and
        (((p1^.x<>centr3x) or (p1^.y<>centr2y)) or
         ((p3^.x<>centr3x) or (p3^.y<>centr3y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
        (((p3^.x<>centr2x) or (p3^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ §Ґ«Ґ­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
         ((p2^.x<>centr2x) or (p2^.y<>centr2y))) and
        (((p3^.x<>centr2x) or (p3^.y<>centr2y)) or
         ((p2^.x<>centr2x) or (p2^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ §Ґ«Ґ­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
        (((p3^.x<>centr3x) or (p3^.y<>centr3y)) or       {Ќ з «® Їа®ўҐаЄЁ §Ґ«Ґ­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
         ((p2^.x<>centr3x) or (p2^.y<>centr2y))) and
        (((p3^.x<>centr3x) or (p3^.y<>centr2y)) or
         ((p2^.x<>centr3x) or (p2^.y<>centr3y))) then
                        MoveTo(x, y+Step); {Down}
   end; { case}
end;

  procedure Tcircle.MoveTo(xnew,ynew:integer);
  var
     Flag:boolean;
  begin
     Flag:=IsVisible;
     if Flag then
        Hide;
     x:=xnew;
     y:=ynew;
     if Flag then
        Show;
  end;
begin
  driver:=vga;
  mode:=2;
  initgraph(driver,mode,'c:\bp\bgi');
  igrpole;
  new(p1,init(198,84,25,10));
  new(p2,init(354,240,25,9));
  new(p3,init(510,396,25,12));
  p1^.show;
  p2^.show;
  p3^.show;
  repeat
   ch:=readkey;
    if ord(ch)=0 then
     ch:=readkey;
   p1^.drag(156,ch);
   p2^.drag(156,ch);
   p3^.drag(156,ch);

  until (((p1^.x=510) and (p1^.y=396)) and
        ((p2^.x=354) and (p2^.y=240)) and
        ((p3^.x=198) and (p3^.y=84))) or
        (ord(ch)=13);;
  closegraph;

end.



Вот сама прога
Попробуйте её....ПЛИЗ!!!
А то не хочется проблем потом от преподователя!!!
)))

Нажмите для просмотра прикрепленного файла
Олежечег(быв. Олежик)
Я отладил её..а он пишет что очень большая строка..т.е. цикл ИФ..
Как мне сделать его меньше?
volvo
Цитата
он пишет что очень большая строка..т.е. цикл ИФ..
Где именно он тебе такое пишет? Ты бы программу-то присоединил, а то телепатически не получается разобраться...
SkIv
Цитата(Олежечег(быв. Олежик) @ 1.06.2007 3:51) *

Я отладил её..а он пишет что очень большая строка..т.е. цикл ИФ..
Как мне сделать его меньше?

Ты про слишком длинную строку?
Если да. То я избавлялся от этой неприятности, так: берешь разбиваешь условие на два, что бы влазило. Заводиш булевую переменную и смотриш если первое условие выполняется, то True и в следующей проверке у тебя уже есть истинная первая часть, сравниваешь ее с оставшейся и усе.
Олежечег(быв. Олежик)
Volvo .....//
она у тебя не запускается......?
Я просто не понял!!!!
Там адрес тогда измени на свой...а то уменя там..с:/bp/bgi
)))))
Я по поводу разбиения.......
Я придумал вот что!
Спасибо SkIv за предложенную версию.....
Можешь приблизительно написать....
Я понял, но не полностью...
А что если....
В процедуре драг сделать ещё одну переменную, которую назвать NOMER и присвоить ей значение Pcircle....
..
ВОТ..
Это избавит от лишних действий...

Код

procedure Tcircle.Drag(Step:integer;ch:char;nomer1:pcircle);
var
  nomer2,nomer3:pcircle;
const
   centr1x=198;
   centr2x=354;
   centr3x=510;
   centr1y=84;
   centr2y=240;
   centr3y=396;
begin
  if nomer1=p1 then
   begin
    nomer2:=p2;
    nomer3:=p3;
   end
  else if nomer1=p2 then
   begin
     nomer2:=p1;
     nomer3:=p3;
   end
  else if nomer1=p3 then
   begin
    nomer2:=p1;
    nomer3:=p2;
   end;
   Case Ord(Ch) of
     72:if (x<>198) and
        (y<>84) and
        ((x<>354) or (y<>396)) and
        (((nomer1^.x<>centr2x) or (nomer1 ^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
         ((nomer2^.x<>centr2x) or (nomer2^.y<>centr2y))) and
        (((nomer1^.x<>centr2x) or (nomer1^.y<>centr2y)) or
         ((nomer2^.x<>centr2x) or (nomer2^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
        (((nomer1^.x<>centr3x) or (nomer1^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
         ((nomer2^.x<>centr3x) or (nomer2^.y<>centr2y))) and
        (((nomer1^.x<>centr3x) or (nomer1^.y<>centr2y)) or
         ((nomer2^.x<>centr3x) or (nomer2^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
        (((nomer1^.x<>centr2x) or (nomer1^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
         ((nomer3^.x<>centr2x) or (nomer3^.y<>centr2y))) and
        (((nomer1^.x<>centr2x) or (nomer1^.y<>centr2y)) or
         ((nomer3^.x<>centr2x) or (nomer3^.y<>centr1y))) and     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 354}
        (((nomer1^.x<>centr3x) or (nomer1^.y<>centr1y)) or       {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
         ((nomer3^.x<>centr3x) or (nomer3^.y<>centr2y))) and
        (((nomer1^.x<>centr3x) or (nomer1^.y<>centr2y)) or
         ((nomer3^.x<>centr3x) or (nomer3^.y<>centr1y))) then     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
               MoveTo(x, y-Step);   {Up}

Я ВПРИНЦИПЕ всё описал.....
Случай..когда находится стенка я описал...
Код
Case Ord(Ch) of
     72:if (x<>198) and
        (y<>84) and
        ((x<>354) or (y<>396)) and
        ...........................

а вот всё ОГРОМНОЕ что идёт далее..это проверка на встречу двух шариков, чтоб один не налез на другого...
У вас есть другие варианты.....???
SkIv
Покажи эту длинную строку.
Олежечег(быв. Олежик)
ВОТ ПРОГА!!
Вроде работает.....
Но там есть пару моментов.., когда шарик не показывается...
это обычно происходит на синей позиции!!!
В чём беда?
вроде процедура SHOW хорошо написана!!!
Код

  procedure Tcircle.show;
  var
  tempcolor:byte;

  begin
    tempcolor:=getcolor;
    setcolor(color);
    setfillstyle(solidfill,color);
    fillellipse(x,y,radius,radius);
    visible:=true;
    setcolor(tempcolor);
  end;



и процедура move...
вроде хорошо..
Но почему-то в позиции центра синего квадратика (354,240) смазывается (не показывается) синий или зелёный квадратик..
...
Может с процедурой HIDE что-то не то?
Код

procedure Tcircle.Hide;
  var
    tempColor:byte;
  begin
    tempColor:=color;
    color:=getpixel(x+radius+5,y+radius+5);
    setfillstyle(solidfill,color);
    show;
    visible:=false;
    color:=TempColor;
  end;


Добавлено через 5 мин.
Я просто пытался отлаьить на клавишу Ф7 ....а когда доходил до этой позиции....
Код

72:if (x<>198) and
.................

он пишет фразу, что линия большая...
Я щас думаю почему круги смываются в синем квадратикке....????
Подскажите!!!
Archon
Цитата
он пишет фразу, что линия большая...
Ну еще бы... Ведь компилятор все это добро:
72:if (x<>198) and
(y<>84) and
((x<>354) or (y<>396)) and
(((nomer1^.x<>centr2x) or (nomer1 ^.y<>centr1y)) or {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ ­ Ї®§ЁжЁЁ 354}
((nomer2^.x<>centr2x) or (nomer2^.y<>centr2y))) and
(((nomer1^.x<>centr2x) or (nomer1^.y<>centr2y)) or
((nomer2^.x<>centr2x) or (nomer2^.y<>centr1y))) and {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ ­ Ї®§ЁжЁЁ 354}
(((nomer1^.x<>centr3x) or (nomer1^.y<>centr1y)) or {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ ­ Ї®§ЁжЁЁ 510}
((nomer2^.x<>centr3x) or (nomer2^.y<>centr2y))) and
(((nomer1^.x<>centr3x) or (nomer1^.y<>centr2y)) or
((nomer2^.x<>centr3x) or (nomer2^.y<>centr1y))) and {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё бЁ­ҐЈ® и аЁЄ ­ Ї®§ЁжЁЁ 510}
(((nomer1^.x<>centr2x) or (nomer1^.y<>centr1y)) or {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ ­ Ї®§ЁжЁЁ 354}
((nomer3^.x<>centr2x) or (nomer3^.y<>centr2y))) and
(((nomer1^.x<>centr2x) or (nomer1^.y<>centr2y)) or
((nomer3^.x<>centr2x) or (nomer3^.y<>centr1y))) and {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ ­ Ї®§ЁжЁЁ 354}
(((nomer1^.x<>centr3x) or (nomer1^.y<>centr1y)) or {Ќ з «® Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ ­ Ї®§ЁжЁЁ 510}
((nomer3^.x<>centr3x) or (nomer3^.y<>centr2y))) and
(((nomer1^.x<>centr3x) or (nomer1^.y<>centr2y)) or
((nomer3^.x<>centr3x) or (nomer3^.y<>centr1y))) then {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ ­ Ї®§ЁжЁЁ 510}
MoveTo(x, y-Step);
считает одной строкой. Действительно не маленькая. Я в логику программы не вникал, но неужели нельзя написать проще?
volvo
Цитата
неужели нельзя написать проще?
Да можно, конечно... Вот один из способов:

{ Добавляем 2 маленькие функции: }
function check(p1, p2: pcircle; X, y1, y2: integer): boolean;
begin
check :=
((p1^.x <> X) or (p1^.y <> y1))
or
((p2^.x <> X) or (p2^.y <> y2))
end;

function check_2(p1, p2: pcircle; X, y1, y2: integer): boolean;
begin
check_2 :=
check(p1, p2, X, y1, y2)
and
check(p1, p2, X, y2, y1);
end;

{ ... и теперь эти ужасные условия сокращаются примерно до такого состояния: }
procedure Tcircle.Drag(Step:integer;ch:char);
const
centr1x=198;
centr2x=354;
centr3x=510;
centr1y=84;
centr2y=240;
centr3y=396;
begin
Case Ord(Ch) of
72:if (x<>198) and
(y<>84) and
((x<>354) or (y<>396)) and

check_2(p1, p2, centr2x, centr1y, centr2y) and
check_2(p1, p2, centr3x, centr1y, centr2y) and
check_2(p1, p3, centr2x, centr1y, centr2y) and
check_2(p1, p3, centr3x, centr1y, centr2y) and
check_2(p3, p2, centr2x, centr1y, centr2y) and
check_2(p3, p2, centr3x, centr1y, centr2y) then MoveTo(x, y-Step); {Up}

75:
{ ... Ну, и так далее ... }
...
end;

Олежечег(быв. Олежик)
VOLVO.......
огромное спасибо!
Но...тот баг я понял как убрать, но не могу реализовать!!!
Когда после запуска программы нажимаешь вправо потом вверх...
синий шарик находится в правом верхнем углу, красный под ним, зелёный рядом.....
Вот..
Из этого положения нажать вниз..и синий шарик исчезнет...
Я понял почему...
т.к. у меня ошибка выводится после вот этого!
Код
p1^.drag(156,ch,p1);
   p2^.drag(156,ch,p2);
   p3^.drag(156,ch,p3);

потому что когда я двигаю вниз,
поначалу двигается зелёный шарик, синий оказывается на красном, а потом красный перемещается и смазывает за собой свою позицию.
т.е. синий!!!!
Мне там надо сделать проверку ифами?
Олежечег(быв. Олежик)
VOLVO//
Я проверил....
Но как сделать для "Налево"?
Чек подходит для вниз и вверх..
ВОт смотри..
Я должен при движении налево у меня один у и два х
Т.е.
позиция игрик....84
а p1 и р2 могут распологаться на иксах 198 и 354..
А в функции чек я могу использовать только один х!!!!
Как мне переделать?
Олежечег(быв. Олежик)
VOLVO...
Смотри как я пишу...
Код

72:if (x<>198) and
        (y<>84) and
        ((x<>354) or (y<>396)) and
        check_2(p1, p2, centr2x, centr1y, centr2y) and
        check_2(p1, p2, centr3x, centr1y, centr2y) and
        check_2(p1, p3, centr2x, centr1y, centr2y) and
        check_2(p1, p3, centr3x, centr1y, centr2y) and
        check_2(p3, p2, centr2x, centr1y, centr2y) and
        check_2(p3, p2, centr3x, centr1y, centr2y) then
               MoveTo(x, y-Step);   {Up}
     75:if (x<>198) and
        ((x<>510) or (y<>84)) and
        check_2(p1, p2, centr1y, centr1x, centr2x) and
        check_2(p1, p2, centr2y, centr1x, centr2x) and
        check_2(p1, p2, centr3y, centr1x, centr2x) and
        check_2(p1, p3, centr1y, centr1x, centr2x) and
        check_2(p1, p3, centr2y, centr1x, centr2x) and
        check_2(p1, p3, centr3y, centr1x, centr2x) and
        check_2(p3, p2, centr1y, centr1x, centr2x) and
        check_2(p3, p2, centr2y, centr1x, centr2x) and
        check_2(p3, p2, centr3y, centr1x, centr2x) then
                    MoveTo(x-Step, y); {Left}
     77:if (x<>510) and
        ((x<>354) or (y<>84)) and
        check_2(p1, p2, centr1y, centr1x, centr2x) and
        check_2(p1, p2, centr2y, centr2x, centr3x) and
        check_2(p1, p2, centr3y, centr2x, centr3x) and
        check_2(p1, p3, centr1y, centr1x, centr2x) and
        check_2(p1, p3, centr2y, centr2x, centr3x) and
        check_2(p1, p3, centr3y, centr2x, centr3x) and
        check_2(p3, p2, centr1y, centr1x, centr2x) and
        check_2(p3, p2, centr2y, centr2x, centr3x) and
        check_2(p3, p2, centr3y, centr2x, centr3x) then
               MoveTo(x+Step, y); {Right}
     80:if (x<>198) and
        (y<>396) and
        ((x<>354) or (y<>240)) and
        check_2(p1, p2, centr2x, centr1y, centr2y) and
        check_2(p1, p2, centr3x, centr2y, centr3y) and
        check_2(p1, p3, centr2x, centr1y, centr2y) and
        check_2(p1, p3, centr3x, centr2y, centr3y) and
        check_2(p3, p2, centr2x, centr1y, centr2y) and
        check_2(p3, p2, centr3x, centr2y, centr3y) then     {Љ®­Ґж Їа®ўҐаЄЁ Єа б­®Ј® Ё §Ґ«Ґ­®Ј® и аЁЄ  ­  Ї®§ЁжЁЁ 510}
                        MoveTo(x, y+Step); {Down}
   end; { case}

На низ и вверх работает..
А влево или вправо он сжирает шары!!!!!!!!!!!!!
volvo
Цитата
На низ и вверх работает..
А влево или вправо он сжирает шары!!!!!!!!!!!!!
само собой... Тебе нужны 2 версии функций типа check и check_2: одна - для вверх/вниз, другая - для влево/вправо... Первая у тебя уже есть, вторая - вот так:

function check_3(p1, p2: pcircle; x1, x2, Y: integer): boolean;
begin
check_3 :=
((p1^.x <> X1) or (p1^.y <> y))
or
((p2^.x <> X2) or (p2^.y <> y))
end;

function check_4(p1, p2: pcircle; x1, x2, Y: integer): boolean;
begin
check_4 :=
check_3(p1, p2, X1, X2, y)
and
check_3(p1, p2, X2, X1, y);
end;

...
75:if (x<>198) and
((x<>510) or (y<>84)) and

check_4(p1, p2, centr1x, centr2x, centr1y) and
check_4(p1, p2, centr1x, centr2x, centr2y) and
check_4(p1, p2, centr1x, centr2x, centr3y) and
check_4(p1, p3, centr1x, centr2x, centr1y) and
check_4(p1, p3, centr1x, centr2x, centr2y) and
check_4(p3, p2, centr3x, centr1y, centr2y) and
check_4(p1, p3, centr1x, centr2x, centr3y) and
check_4(p3, p2, centr1x, centr2x, centr1y) and
check_4(p3, p2, centr1x, centr2x, centr2y) and
check_4(p3, p2, centr1x, centr2x, centr3y) then MoveTo(x-Step, y); {Left}

77:if (x<>510) and
((x<>354) or (y<>84)) and

check_4(p1, p2, centr1x, centr2x, centr1y) and
check_4(p1, p2, centr3x, centr2x, centr2y) and
check_4(p1, p2, centr3x, centr2x, centr3y) and
check_4(p1, p3, centr1x, centr2x, centr1y) and
check_4(p1, p3, centr3x, centr2x, centr2y) and
check_4(p1, p3, centr3x, centr2y, centr3y) and
check_4(p3, p2, centr1x, centr2x, centr1y) and
check_4(p3, p2, centr3x, centr2x, centr2y) and
check_4(p3, p2, centr3x, centr2x, centr3y) then MoveTo(x+Step, y); {Right}
(по-моему, нигде не ошибся...)
Олежечег(быв. Олежик)
VOLVO
Помоги мне,направо напиши..а налево я по примеру смогу!!!!!....
Может я чего-то не понял в функции...
Одно понял......
ОНА РЕКУРСИВНАЯ!!!
volvo
Я ж написал тебе и направо, и налево... Ты посты-то хоть читай... И где ты там рекурсию нашел? не было ее там нигде...
Олежечег(быв. Олежик)
Блин..
Я перепутал...
)))
а твоё сообщение пришло немного позже...
СПАСИБО!!!!
кстати..
посмотри мою прогу..
вроде доделал.....
Посмотри....
Вот сама прога...
Нажмите для просмотра прикрепленного файла
вот пасовский файл меню(который потом преращается в юнит)
Нажмите для просмотра прикрепленного файла
И текстовый файл..
Нажмите для просмотра прикрепленного файла
..
У меня возникают проблемы с цветом.......
ещё я не могу понять, как мне сделать так(ведь у меня в игре ближе к 1 месту получает тот, кто набрал не большее, а меньшее кол-во ходов) чтобы выводилась нормально таблица...
Цитата

VOLVO.......
огромное спасибо!
Но...тот баг я понял как убрать, но не могу реализовать!!!
Когда после запуска программы нажимаешь вправо потом вверх...
синий шарик находится в правом верхнем углу, красный под ним, зелёный рядом.....
Вот..
Из этого положения нажать вниз..и синий шарик исчезнет...
Я понял почему...
т.к. у меня ошибка выводится после вот этого!
Кодp1^.drag(156,ch,p1);
p2^.drag(156,ch,p2);
p3^.drag(156,ch,p3);
потому что когда я двигаю вниз,
поначалу двигается зелёный шарик, синий оказывается на красном, а потом красный перемещается и смазывает за собой свою позицию.
т.е. синий!!!!
Мне там надо сделать проверку ифами?

я вот что в своей программе придумал...
но полностью не работает...
Код

repeat
   ch:=readkey;
    if ord(ch)=0 then
     begin
     ch:=readkey;
     score:=score+1;
     pomosh;
     case ord(ch) of
     72: if (p1^.y=240) and (p1^.x=510) then
       begin
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p1);
       end
       else if (p2^.y=240) and (p2^.x=510) then
       begin
        p2^.drag(156,ch,p1);
        p1^.drag(156,ch,p2);
        p3^.drag(156,ch,p1);
       end
       else if (p3^.y=240) and (p3^.x=510) then
       begin
        p3^.drag(156,ch,p3);
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
       end
       else
       begin
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p3);
       end;
      75:if ((p1^.x=354) and (p1^.y=240)) or
            ((p1^.x=354) and (p1^.y=396)) then
       begin
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p3);
       end
       else if ((p2^.x=354) and (p2^.y=240)) or
               ((p2^.x=354) and (p2^.y=396))
       then
       begin
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p3);
        p1^.drag(156,ch,p1);
       end
       else if ((p3^.x=354) and (p3^.y=240)) or
               ((p3^.x=354) and (p3^.y=396)) then
       begin
        p3^.drag(156,ch,p3);
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
       end
       else
       begin
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p3);
       end;
      77:if p1^.x=354 then
       begin
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p3);
       end
       else if p2^.x=354 then
       begin
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p3);
        p1^.drag(156,ch,p1);
       end
       else if p3^.x=354 then
       begin
        p3^.drag(156,ch,p3);
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
       end
       else
       begin
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p3);
       end;
       80:if p1^.y=240 then
       begin
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p3);
       end
       else if p2^.y=240 then
       begin
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p3);
        p1^.drag(156,ch,p1);
       end
      else if p3^.y=240 then
       begin
        p3^.drag(156 ,ch,p3);
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
       end
      else
       begin
        p1^.drag(156,ch,p1);
        p2^.drag(156,ch,p2);
        p3^.drag(156,ch,p3);
       end;
     end;
   end;
  until (((p1^.x=510) and (p1^.y=396)) and
        ((p2^.x=354) and (p2^.y=240)) and
        ((p3^.x=198) and (p3^.y=84))) or
        (ord(ch)=27);


Это вроде как разрешение шариков на движение..
но всё-равно некоторые шарики, в некоторые позиции не двигаются!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.