Меня сегодня убили С помощью Вольвы сдала программку с графикой на 5 ^_^ Но сегодня дали курсавик. Змейка. Полистала тут форум, одни исходники. Хочется написать самой, ну или кусочки кодов украсть. Объекты еще не проходили, но без них думаю неполучится написать. Если не трудно. Можете помочь сделать игрушку... Объяснить с чего начать, привести парочку примеров ( Я НЕ КОГО НЕ ЗАСТАВЛЯЮ НИЧЕГО ДЕЛАТЬ, ПРОСТО ПРОШУ ПОМОЧЬ, КОМУ НЕ ТЯЖЕЛО) кусочков кодов и для чего они служат, просто совести не хватит взять чужое, и впихнуть, да и сама должна понять, как такое делается...
Для змейки тебе понадобится FIFO. Реализуй его на обычных массивах, динамическая память не обязательна. Два целочисленных массива - x и y, координаты звена.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Для змейки тебе понадобится FIFO. Реализуй его на обычных массивах, динамическая память не обязательна. Два целочисленных массива - x и y, координаты звена.
Что есть фифо?.. Учу паскаль, да и вообще программирование 3 месяца...
На самом деле, FIFO не обязательно. Если не жалко памяти и есть возможность хранить состояния всех точек поля (экрана), то может быть даже проще.
Вот простенькая реализация змейки с FIFO, я сейчас набросал с учетом твоих требований (юниты, текст с возможностью подключения графики). Управление на стрелочках, конец игры при ударе в стенку, самопересечения допускаются пока. Поиграйся и попробуй разобраться. А потом можно будет и без фифы сделать - кстати, так даже проще отлавливать самопересечения.
procedure SetMode(m: tMode); function MinX: integer; function MaxX: integer; function MinY: integer; function MaxY: integer; procedure ShowBoard; procedure Show(p: tPict; x,y:integer);
implementation
procedure SetMode(m: tMode); begin Mode:=m end;
function MinX: integer; begin case Mode of Gr: ; Tx: MinX:=Lo(WindMin)+1; end end;
function MaxX: integer; begin case Mode of Gr: ; Tx: MaxX:=Lo(WindMax)+1; end end;
function MinY: integer; begin case Mode of Gr: ; Tx: MinY:=Hi(WindMin)+1; end end;
function MaxY: integer; begin case Mode of Gr: ; Tx: MaxY:=Hi(WindMax)+1; end end;
procedure ShowBoard; begin case Mode of Gr: ; Tx: ClrScr; end end;
procedure Show(p: tPict; x,y: integer); begin case Mode of Gr: ; Tx: begin GoToXY(x,y); Write(TxPict[p]) end end end;
begin Mode:=No end.
Файл Viper.pas
uses FIFO,Board,Dos,CRT;
var i,x,y,u,v,x1,Rx,Ry,y1,x2,y2,sx,sy: integer; t,dt: LongInt; c: char; e: boolean;
function Time: LongInt; var m,d,h,mi,s,s1:word; l:LongInt; begin GetDate(h,m,d,mi);GetTime(h,mi,s,s1);l:=d; Time:=(((l*24+h)*60+mi)*60+s)*100+s1 end;
begin SetMode(Tx); ShowBoard; x1:=MinX; x2:=MaxX; y1:=MinY; y2:=MaxY; for i:=x1 to x2 do begin GoToXY(i,y1); Write('*'); GoToXY(i,y2); Write('*'); end; Inc(y1); Dec(y2); for i:=y1 to y2 do begin GoToXY(x1,i); Write('*'); GoToXY(x2,i); Write('*'); end; Inc(x1); Dec(x2);
x:=x1; y:=(y1+y2) div 2+1; Show(Head,x,y); Put(x,y); sx:=1; sy:=0; Rx:=10; Ry:=y; t:=Time; dt:=15; e:=true; repeat if e then begin Show(Rabb,Rx,Ry); e:=false end; t:=t+dt; Show(Bond,x,y); x:=x+sx; y:=y+sy; Show(Head,x,y); Put(x,y); if (x<>Rx)or(y<>Ry) then begin Get(u,v); Show(Noth,u,v) end else begin Rx:=Random(x2-x1-1)+x1+1; Ry:=Random(y2-y1-1)+y1+1; e:=true end; repeat until Time>t; if KeyPressed then begin c:=ReadKey; if c=#0 then begin c:=ReadKey; case c of #72: if sy<>1 then begin sx:=0; sy:=-1 end; #75: if sx<>1 then begin sx:=-1; sy:=0 end; #77: if sx<>-1 then begin sx:=1; sy:=0 end; #80: if sy<>-1 then begin sx:=0; sy:=1 end end end end until (x<x1)or(y<y1)or(x>x2)or(y>y2) end.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Если рисовать змейку в текстовом режиме, то я бы рисовал её из треугольничков (#16, #17, #30, #31), указывающих на следующий сегмент. Конечно, запоминать где голова и хвост - всё равно надо. Зато сразу самопересечения легко обнаруживать. Конечно, при условии, что у нас есть возможность узнать, какой символ изображён на экране по таким-то координатам. Не знаю, какая процедура за это отвечает, в принципе можно обратиться к видеопамяти.
В этом коде вы можете не знать слово Textmode - оно принудительно переводит экран в режим 80 на 50 символов, и слово absolute - оно указывает переменной, какой именно адрес ей занимать. Некоторые адреса обладают специальными свойствами, например адрес $0040: $006C содержит системное время (нужно для того, чтобы корректно задавать темп игры), а адрес $B800: $0000 содержит видеопамять, поэтому любое обращение к массиву Screen эквивалентно обращению к видеопамяти. Обратите внимание, что тут приходиться в индексе сначала писать Y, а потом X.
Ага, спасибо. А можно я немного обнаглею? мне очень понравилась та змейка которую я прикрепляла, где-то в нете нашла. МОжет кто-то туда добавить коментариев? ООоооччень прошу )) хочу узнать , как там и что работает и что делается в той или иной процедуре
Ага, спасибо. А можно я немного обнаглею? мне очень понравилась та змейка которую я прикрепляла, где-то в нете нашла. МОжет кто-то туда добавить коментариев? ООоооччень прошу )) хочу узнать , как там и что работает и что делается в той или иной процедуре
Я тоже тогда понаглею. Мне кажется, что в том, что вы прикрепили, надо бОльшую часть кода не комментировать, а выкидывать. А то зачем-то объекты приплели в такой элементарной программе, да ещё модули используюся некоторые чуть ли не из Turbo Vision. Хотя я тут ничего не утверждаю, и возможно, мне это только кажется.
Ну тогда можеш коменты к своей програмке написать ? плиз) п.с. в игре нужен щетчик очков, и несколько уровней сложности. п.с. Уровни сложности я так поняла нужно прописывать через /delay? (скорость перемешения змейки) только как ?
Коментарии попробую, но только после оптимизации, а то кейсов у меня в коде многовато. Лучше скажи, что конкретно непонятно. А вот делэя не надо. Я зря что ли переменную Time ввёл? Вот специально чтобы не было зависимости скорости игры от мощности процессора. Счётчик очков и нарастание сложности в код вполне вставляется, но я этого делать не буду, в конце концов не мне задание дали.
Коментарии попробую, но только после оптимизации, а то кейсов у меня в коде многовато. Лучше скажи, что конкретно непонятно. А вот делэя не надо. Я зря что ли переменную Time ввёл? Вот специально чтобы не было зависимости скорости игры от мощности процессора. Счётчик очков и нарастание сложности в код вполне вставляется, но я этого делать не буду, в конце концов не мне задание дали.
ааа...понятно А подсказачку как сделать сложность?(скорость передвижения змейки) и шетчик очков. Допустим за одну пойманную точку будет +1 очко, только как это значиние выводить на экран?
Счётчик делается простым выводом на экран процедурой Write, естественно надо указать куда выводить при помощи GotoXY. Тут правда нюанс - эта надпись будет затираться змейкой. Поэтому её надо ограничить, не позволяя ей заходить на верхние 2 строчки (1я строчка для отображения состояния, 2я строчка - "заборчик" для наглядности), и соответственно в условие проигрыша добавить. Сложность делается, например, так - всё, что связано с движениями змейки, заключается в условный оператор if T mod Level = 0 then begin ... end То есть змейка будет двигаться не каждый такт игры, а только в тот, чей номер делится на Level. Значение 1 - максимальный уровень сложности, чем больше значение, тем медленнее двигается змейка.
TarasBer, на мой взгляд неправильно учить новичка использовать прямое обращение к системной и аппаратной памяти. Это, кроме всего прочего, вызовет удивление преподавателя (это скорее слова к DarkMoonSIde). Очень рекомендую переделать на обращение через DOS и стандартные модули.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой