Меня сегодня убили С помощью Вольвы сдала программку с графикой на 5 ^_^ Но сегодня дали курсавик. Змейка. Полистала тут форум, одни исходники. Хочется написать самой, ну или кусочки кодов украсть. Объекты еще не проходили, но без них думаю неполучится написать. Если не трудно. Можете помочь сделать игрушку... Объяснить с чего начать, привести парочку примеров ( Я НЕ КОГО НЕ ЗАСТАВЛЯЮ НИЧЕГО ДЕЛАТЬ, ПРОСТО ПРОШУ ПОМОЧЬ, КОМУ НЕ ТЯЖЕЛО) кусочков кодов и для чего они служат, просто совести не хватит взять чужое, и впихнуть, да и сама должна понять, как такое делается...
Lapp
18.02.2009 4:14
М
Пожалуйста, измени заголовок (Правила, п.8)
Тебе змейка в какой моде нужна: в тексте или графике?
DarkMoonSide
18.02.2009 4:54
graph+crt режимы.
Добавлено через 1 мин. Что-то типа (Модуль + основная программа)
Lapp
18.02.2009 5:04
М
Спасибо
Для змейки тебе понадобится FIFO. Реализуй его на обычных массивах, динамическая память не обязательна. Два целочисленных массива - x и y, координаты звена.
DarkMoonSide
18.02.2009 5:07
Цитата
Для змейки тебе понадобится FIFO. Реализуй его на обычных массивах, динамическая память не обязательна. Два целочисленных массива - x и y, координаты звена.
Что есть фифо?.. Учу паскаль, да и вообще программирование 3 месяца...
Lapp
18.02.2009 5:25
Цитата(DarkMoonSide @ 18.02.2009 1:07)
Что есть фифо?..
Буфер типа "первым вошел - первым вышел (First In - First Out)"
Поищи на это слово по Форуму.
TarasBer
18.02.2009 17:15
Называется Очередь.
Lapp
18.02.2009 19:38
На самом деле, 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.
DarkMoonSide
20.02.2009 1:33
Спасибо, пойду разбираться потихоньку. Приболела
TarasBer
20.02.2009 1:54
Если рисовать змейку в текстовом режиме, то я бы рисовал её из треугольничков (#16, #17, #30, #31), указывающих на следующий сегмент. Конечно, запоминать где голова и хвост - всё равно надо. Зато сразу самопересечения легко обнаруживать. Конечно, при условии, что у нас есть возможность узнать, какой символ изображён на экране по таким-то координатам. Не знаю, какая процедура за это отвечает, в принципе можно обратиться к видеопамяти.
DarkMoonSide
20.02.2009 2:00
Ребят я конечно понимаю, что вы тут все уже профи, я учу паскаль только 3 месяца.... по этому не сильно "матюкайтесь" )) плохо знаю структуры и т.п
TarasBer
20.02.2009 2:05
Какое конкретно слово если непонятно - спрашивайте.
TarasBer
20.02.2009 2:59
В общем вот примерная реализация того, что я имел в виду:
В этом коде вы можете не знать слово Textmode - оно принудительно переводит экран в режим 80 на 50 символов, и слово absolute - оно указывает переменной, какой именно адрес ей занимать. Некоторые адреса обладают специальными свойствами, например адрес $0040: $006C содержит системное время (нужно для того, чтобы корректно задавать темп игры), а адрес $B800: $0000 содержит видеопамять, поэтому любое обращение к массиву Screen эквивалентно обращению к видеопамяти. Обратите внимание, что тут приходиться в индексе сначала писать Y, а потом X.
DarkMoonSide
20.02.2009 23:33
Ага, спасибо. А можно я немного обнаглею? мне очень понравилась та змейка которую я прикрепляла, где-то в нете нашла. МОжет кто-то туда добавить коментариев? ООоооччень прошу )) хочу узнать , как там и что работает и что делается в той или иной процедуре
TarasBer
21.02.2009 0:22
Цитата(DarkMoonSide @ 20.02.2009 19:33)
Ага, спасибо. А можно я немного обнаглею? мне очень понравилась та змейка которую я прикрепляла, где-то в нете нашла. МОжет кто-то туда добавить коментариев? ООоооччень прошу )) хочу узнать , как там и что работает и что делается в той или иной процедуре
Я тоже тогда понаглею. Мне кажется, что в том, что вы прикрепили, надо бОльшую часть кода не комментировать, а выкидывать. А то зачем-то объекты приплели в такой элементарной программе, да ещё модули используюся некоторые чуть ли не из Turbo Vision. Хотя я тут ничего не утверждаю, и возможно, мне это только кажется.
DarkMoonSide
21.02.2009 0:57
Ну тогда можеш коменты к своей програмке написать ? плиз) п.с. в игре нужен щетчик очков, и несколько уровней сложности. п.с. Уровни сложности я так поняла нужно прописывать через /delay? (скорость перемешения змейки) только как ?
TarasBer
21.02.2009 1:16
Коментарии попробую, но только после оптимизации, а то кейсов у меня в коде многовато. Лучше скажи, что конкретно непонятно. А вот делэя не надо. Я зря что ли переменную Time ввёл? Вот специально чтобы не было зависимости скорости игры от мощности процессора. Счётчик очков и нарастание сложности в код вполне вставляется, но я этого делать не буду, в конце концов не мне задание дали.
DarkMoonSide
21.02.2009 1:29
Цитата(TarasBer @ 20.02.2009 22:16)
Коментарии попробую, но только после оптимизации, а то кейсов у меня в коде многовато. Лучше скажи, что конкретно непонятно. А вот делэя не надо. Я зря что ли переменную Time ввёл? Вот специально чтобы не было зависимости скорости игры от мощности процессора. Счётчик очков и нарастание сложности в код вполне вставляется, но я этого делать не буду, в конце концов не мне задание дали.
ааа...понятно А подсказачку как сделать сложность?(скорость передвижения змейки) и шетчик очков. Допустим за одну пойманную точку будет +1 очко, только как это значиние выводить на экран?
TarasBer
21.02.2009 1:43
Счётчик делается простым выводом на экран процедурой Write, естественно надо указать куда выводить при помощи GotoXY. Тут правда нюанс - эта надпись будет затираться змейкой. Поэтому её надо ограничить, не позволяя ей заходить на верхние 2 строчки (1я строчка для отображения состояния, 2я строчка - "заборчик" для наглядности), и соответственно в условие проигрыша добавить. Сложность делается, например, так - всё, что связано с движениями змейки, заключается в условный оператор if T mod Level = 0 then begin ... end То есть змейка будет двигаться не каждый такт игры, а только в тот, чей номер делится на Level. Значение 1 - максимальный уровень сложности, чем больше значение, тем медленнее двигается змейка.
Lapp
21.02.2009 11:20
TarasBer, на мой взгляд неправильно учить новичка использовать прямое обращение к системной и аппаратной памяти. Это, кроме всего прочего, вызовет удивление преподавателя (это скорее слова к DarkMoonSIde). Очень рекомендую переделать на обращение через DOS и стандартные модули.
TarasBer
21.02.2009 18:35
Цитата(Lapp @ 21.02.2009 7:20)
TarasBer, на мой взгляд неправильно учить новичка использовать прямое обращение к системной и аппаратной памяти. Это, кроме всего прочего, вызовет удивление преподавателя (это скорее слова к DarkMoonSIde). Очень рекомендую переделать на обращение через DOS и стандартные модули.
Ну хорошо, допустим ради системного времени можно подключить модуль DOS и использовать функцию GetTime, ради вывода на экран символа можно использовать GotoXY и WriteLn, но что делать со считыванием с экрана? Помню, в конце 9 класса, когда мой "стаж" был 2-3 месяца, тоже мучался с этим, не мог лабиринтик доделать. Или заводить отдельный массив, который бы хранил состояние поля (а я, кажется, тогда так и выкручивался)? Но это же перерасход жуткий.
DarkMoonSide
22.02.2009 2:25
Поправилась. Вроде и силы появились. Я хочу задать несколько вопросов. Пожалуйсто, если сможете 1) Как сделать игровое поле? т.е. сделать часть экрана полем для "действий змейки" и часть для отоброжения очков и количества жизней (пример кода) 2)Как сделать рандомное появление квадратиков на этом поле, и увеличение змейки на один квадратик, если она "кушает" этот квадратик. 3)Как сделать ,что бы если длина змейки была 14 квадратиков, то начинался новый уровень (скорость змейки увеличивалась) 4) Как сделать несколько уровней и что-бы можно было ставить припятствия, и если змейка в него врезалась=смерть ) 5)Как прописать сами движения змейки, на экране. Пожалуйсто приведите примеры...потому что сухой код я не могу еще воспринимать, и без комментариев к коду я мало что понимаю
TarasBer
22.02.2009 2:40
Ну игровое поле так и делаешь. Просто принудительно пишешь, что если HeadY < 2 то типа всё - врезались. Чтоб змейка росла - на самом дела надо просто, чтобы он именно в момент поедания яблока НЕ сдвигала хвост. Препятствия - ну просто на экране рисуешь плюсики, и в то место, где проверяется самопересечение (а там проеряется, что на месте головы стоит определённый символ), добавляешь ещё и символ стенки. Чтобы уровень начинался - ну считай длину, потом когда достигла определённой длины, увеличиваешь сложность и всё заново начинаешь. Коментарии - гм, в 100-строчном коде, неслабо наполненном водой?
Кстати, я тут подумал - а ведь будет зрелищнее, если задать режим не 80х50, а 40х25.
DarkMoonSide
22.02.2009 2:45
TarasBer а можеш написать примерную реализацию кодов к моим пунктам ? все равно не могу понять как написать..
Lapp
22.02.2009 21:06
Цитата(DarkMoonSide @ 21.02.2009 22:45)
TarasBer а можеш написать примерную реализацию кодов к моим пунктам ? все равно не могу понять как написать..
Ты бы все-таки хоть что-то свое тут привела.. Хотя бы неудачные попытки. А то игра в одни ворота быстро надоедает
TarasBer
23.02.2009 0:27
Цитата(Lapp @ 22.02.2009 17:06)
Ты бы все-таки хоть что-то свое тут привела.. Хотя бы неудачные попытки. А то игра в одни ворота быстро надоедает
Кстати да, я всё жду хоть одного вопроса типа "мне непонятен в коде такой-то оператор, что он делает". А тут видимо совсем анализ кода даже не предпринимался.
DarkMoonSide
23.02.2009 19:17
Было, и сама пыталась сделать что то, хотя бы что бы двигалось подобие на червячек. Буду сегодня вечером дома- напишу что не понятно из кода Lapp'a
Lapp
23.02.2009 19:21
Цитата(DarkMoonSide @ 23.02.2009 15:17)
Буду сегодня вечером дома- напишу что не понятно из кода Lapp'a
Польщен Давай поактивнее. Месяц - это, более, чем достаточно. Но только если делать)).
TarasBer
23.02.2009 19:25
Мне всё-таки непонятно, что в моём коде непонятно.
RathaR
6.07.2009 21:54
эм... задам вопрос: для замедления змейки использовать gettime и подключать лишний модуль, или всётаки использовать delay? ато ответа утвердительного так и не увидел
Lapp
7.07.2009 5:10
Цитата(RathaR @ 6.07.2009 18:54)
для замедления змейки использовать gettime и подключать лишний модуль, или всётаки использовать delay?
Если программа предназначается хоть сколько-то для запуска на других машинах, то использовать delay крайне не рекомендуется. GetTime вполне приемлемый способ. В подключении модуля DOS особых проблем не вижу, но в принципе есть и другие методы.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.