Форум «Всё о Паскале» _ Написание игр _ Перемещение мячиков одновременно
Автор: Олежечег(быв. Олежик) 15.04.2007 22:02
Всем привет... В институте курсовой работой будет игра. Я предложил свой варант игры....и преподы дали мне согласие.
Игра будет реализовывать перемещение мячиков( 3 штуки ) по доске 3х3..( т.е. 9 сегментов ).....
ОПИСАНИЕ.
1.на поле 3х3 расположены 3 шарика разного цвета.... - СИНИЙ - КРАСНЫЙ - ЗЕЛЁНЫЙ
2.на поле 3х3 есть 3 сегмента разного цвета... - СИНИЙ - КРАСНЫЙ - ЗЕЛЁНЫЙ
3. КРАСНЫЙ шарик расположен на ЗЁЛЁНОМ сегменте..... СИНИЙ шарик расположен на СИНЕМ сегменте(т.е. на своём месте он находится)............ ЗЕЛЁНЫЙ шарик расположен на КРАСНОМ сегменте.........
( В архиве содержатся 6 картинок, последовательностью от 1 до 6 )
4.Представьте, что это как доска, которую вы держите в руках....и при наклоне ВПЕРЁД( а на экране вверх ) перемещаются все шарики ВПЕРЁД( Если , конечно, перед этим шариком нет препятствия )...
5.На поле расположены несколько стенок, через которые шарики перекатиться не могут
ЗАДАЧА ( В чём же заключается победа игры) Надо, путём совместного передвигания шариков, поставить каждый шарик на свой сегмент....
Хотелось бы услышать ваши предложения......
А сделать я бы хотел её совместно с вами.... Меню хотелось бы найти на вашем форуме (ЕДИНСТВЕННЫЙ МИНУС....модуль ГРАФ будем тока проходить в инсте в этот понедельник, поэтому особо незнаю, как там что =) )
Автор: Олежечег(быв. Олежик) 18.04.2007 4:18
народ. Будет ли лучше.. если я сделаю масив 3х3? т.к. я посмотрел..и подумал, что лучше будет, если просто на экране... после того как нарисую 9 квадратиков..буду просто перемещать свои шарики... Допустим... У меня для каждого шарика есть своё значение...mestox1,mestoу1 ..mestox2,mestoy2...mestoх3,mestoу3... Значения будут const.... и...я ставлю перед всем этим while , который будет сравнивать эти значения через каждый ход, совершённый пользователем. ДО ТЕХ ПОР ПОКА mestox1<>х1 and........и так далее......
Можете помочь с проверкой месторасположением шариков!!!!
Автор: Lapp 18.04.2007 5:23
Цитата(Олежечег(быв. Олежик) @ 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 9:35
а по какому критерию лучше выискивать лидера в таблице рекордов.... ????? Задать время......или сказать, сколько он потратил ходов? Как это реализовать?
Автор: Гость 18.04.2007 10:06
Цитата(Олежечег(быв. Олежик) @ 18.04.2007 5:35)
Задать время......или сказать, сколько он потратил ходов? Как это реализовать?
И то и другое неплохо. Сам выбирай. Реализовать - время берешь с помощью GetTime. А ходы считать как - сам думай
Я вижу еще одну трудность. Не совсем понимаю, как задавать стенки между клетками.. Думаю, надо добавить в запись для клетки еще два поля - скажем, Left и Up. Наличие 1 в них будет означать стенку, а 0 - нет стенки.
Автор: Lapp 18.04.2007 10:56
Предыдущий пост - мой. Кстати, на всякий случай: процедура GetTime - в модуле DOS
Автор: Олежечег(быв. Олежик) 27.04.2007 21:31
Вот.... уря...сделал менюшку... но вот проблема..... Мне сказали ей переделать в динамическое меню.... Подскажите как?
Код
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.
Автор: Олежечег(быв. Олежик) 22.05.2007 20:51
Тут попробовал новую тему..... Менюшку сделал... Слава богу!!! Динамическое!!! Так горд собой))) А насчёт своей игры....понапридумывал многое.. ))))))) Я хочу сделать вот так!!! Вы увидели массив.. заполненный 0-ми и 1-ми. Якобы...... Шарики могут двигаться тока по нечётным координатам.... [1,1][1,3][1,5][3,1][3,3][3,5][5,1][5,3][5,5] И..перед каждым шагом делаю проверку.. Таким образом я хочу показать стенки!!!!! Т.Е. Где стоят цифры 1, это стенки! Если на пути встречаются 2 последовательных нуля(0), то шарик двигается! В противном случае не происходит движение шарика. Вроде хорошо!!!! Как идейка? Или можно описать стенки по-лучше?
Автор: Олежечег(быв. Олежик) 31.05.2007 22:24
LAPP... Посмотри пожалуйста.... Да и все.. посмотрите это пожалуйста.... )) Я сделал реализацию своей игры... Впринципе работает.. Но вот в чём глюк.. в некоторых моментах Шарик двигаться не хочет..... Или наоборот.. исчезает.. в основном исчезает на синей позиции....... Т.е. на синем квадратике.... Посмотрите пожалуйста........ Заранее скажу.. В процедуре драг...... На каждую клавишу ставлю проверку... Конечно длинная... но как смог.. Вот.. )))
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 1.06.2007 7:10
Цитата
он пишет что очень большая строка..т.е. цикл ИФ..
Где именно он тебе такое пишет? Ты бы программу-то присоединил, а то телепатически не получается разобраться...
Автор: SkIv 1.06.2007 10:55
Цитата(Олежечег(быв. Олежик) @ 1.06.2007 3:51)
Я отладил её..а он пишет что очень большая строка..т.е. цикл ИФ.. Как мне сделать его меньше?
Ты про слишком длинную строку? Если да. То я избавлялся от этой неприятности, так: берешь разбиваешь условие на два, что бы влазило. Заводиш булевую переменную и смотриш если первое условие выполняется, то True и в следующей проверке у тебя уже есть истинная первая часть, сравниваешь ее с оставшейся и усе.
Автор: Олежечег(быв. Олежик) 1.06.2007 14:25
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 1.06.2007 14:46
Покажи эту длинную строку.
Автор: Олежечег(быв. Олежик) 1.06.2007 14:47
ВОТ ПРОГА!! Вроде работает..... Но там есть пару моментов.., когда шарик не показывается... это обычно происходит на синей позиции!!! В чём беда? вроде процедура 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 1.06.2007 15:10
Цитата
он пишет фразу, что линия большая...
Ну еще бы... Ведь компилятор все это добро:
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 1.06.2007 16:13
Цитата
неужели нельзя написать проще?
Да можно, конечно... Вот один из способов:
{ Добавляем 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;
Автор: Олежечег(быв. Олежик) 3.06.2007 3:18
VOLVO....... огромное спасибо! Но...тот баг я понял как убрать, но не могу реализовать!!! Когда после запуска программы нажимаешь вправо потом вверх... синий шарик находится в правом верхнем углу, красный под ним, зелёный рядом..... Вот.. Из этого положения нажать вниз..и синий шарик исчезнет... Я понял почему... т.к. у меня ошибка выводится после вот этого!
потому что когда я двигаю вниз, поначалу двигается зелёный шарик, синий оказывается на красном, а потом красный перемещается и смазывает за собой свою позицию. т.е. синий!!!! Мне там надо сделать проверку ифами?
Автор: Олежечег(быв. Олежик) 4.06.2007 2:38
VOLVO// Я проверил.... Но как сделать для "Налево"? Чек подходит для вниз и вверх.. ВОт смотри.. Я должен при движении налево у меня один у и два х Т.е. позиция игрик....84 а p1 и р2 могут распологаться на иксах 198 и 354.. А в функции чек я могу использовать только один х!!!! Как мне переделать?
Автор: Олежечег(быв. Олежик) 4.06.2007 3:00
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 4.06.2007 3:23
Цитата
На низ и вверх работает.. А влево или вправо он сжирает шары!!!!!!!!!!!!!
само собой... Тебе нужны 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}
(по-моему, нигде не ошибся...)
Автор: Олежечег(быв. Олежик) 4.06.2007 3:36
VOLVO Помоги мне,направо напиши..а налево я по примеру смогу!!!!!.... Может я чего-то не понял в функции... Одно понял...... ОНА РЕКУРСИВНАЯ!!!
Автор: volvo 4.06.2007 3:37
Я ж написал тебе и направо, и налево... Ты посты-то хоть читай... И где ты там рекурсию нашел? не было ее там нигде...
Автор: Олежечег(быв. Олежик) 5.06.2007 13:12
Блин.. Я перепутал... ))) а твоё сообщение пришло немного позже... СПАСИБО!!!! кстати.. посмотри мою прогу.. вроде доделал..... Посмотри.... Вот сама прога... APARIN_O.PAS ( 13.43 килобайт )
Кол-во скачиваний: 616
вот пасовский файл меню(который потом преращается в юнит) MENU_1_1.PAS ( 5.49 килобайт )
Кол-во скачиваний: 682
.. У меня возникают проблемы с цветом....... ещё я не могу понять, как мне сделать так(ведь у меня в игре ближе к 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);
Это вроде как разрешение шариков на движение.. но всё-равно некоторые шарики, в некоторые позиции не двигаются!!!