Все таже змейка, добить раз и навсегда, сделать хвост |
Все таже змейка, добить раз и навсегда, сделать хвост |
a100 |
15.12.2010 12:45
Сообщение
#1
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: a100 Репутация: 0 |
Здравствуйте! Благодаря информации с вашего форума, получилось написать, так сказать. костяк программы) не просто списать, а понять что для чего, это получилось. Опыт программирования еще совсем маленький.
Вот мой код:
пока не хватает знаний, чтоб сделать хвост змее, который растет, когда змея съедает яблоко... надеюсь на вашу помощь |
Lapp |
15.12.2010 13:37
Сообщение
#2
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
надеюсь на вашу помощь Самый лучший вариант - завести двумерный массив из байтов по числу клеток игрового поляb: array [xn..xx,yn..yx] of byte; В нем рисуй тело от хвоста до головы. Вот такие обозначения: 0 - пустая клетка 1 - тело идет вверх 2 - тело идет вправо 3 - тело идет вниз 4 - тело идет влево 5 - голова (тело закончилось 6 - кролик 7 - мангуста 8 - препятствие .... Вот тебе пример такого поля и змеи на нем: 0000000000 При этом храни в двух парах переменных текущие координаты головы и хвоста. Так ты сможешь "двигать змею". Если змея в этот момент движется вправо, то следующий кадр будет такой: 0000000000 Подумай над этим как следует. Если будут вопросы - задавай. Меня не будет до ночи, но кто-то еще может подсказать.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
TarasBer |
15.12.2010 14:30
Сообщение
#3
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
b: array [xn..xx,yn..yx] of byte; В нем рисуй тело от хвоста до головы. Вот такие обозначения: 0 - пустая клетка 1 - тело идет вверх 2 - тело идет вправо 3 - тело идет вниз 4 - тело идет влево 5 - голова (тело закончилось 6 - кролик 7 - мангуста 8 - препятствие Фу, это же магические числа. Я предпочитаю делать так:
-------------------- |
Lapp |
15.12.2010 14:34
Сообщение
#4
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Фу, это же магические числа. Я предпочитаю делать так:
Одобрямс! Только тогда с отладкой и промежуточными печатями могут быть проблемы.. Не совсем проблемы, просто дополнительная писанина + значения могут случайно съехать.. Но это все мелочи. Правильно, нужно именно так делать. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
TarasBer |
15.12.2010 14:37
Сообщение
#5
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Как раз с отладкой проблем меньше, потому что когда видишь в отладчике число 3, то долго думаешь, что бы оно значило, а когда видишь fDown, то всё понятно.
Что касается печати, то тут да, язык в данной реализации не содержит модные фичи (рефлексия, или как её), позволяющие без ретипизации написать WriteLn(f[i, j]) так, что выведется "fDown". Сообщение отредактировано: TarasBer - 15.12.2010 14:38 -------------------- |
Lapp |
15.12.2010 14:59
Сообщение
#6
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Что касается печати, то тут да, язык в данной реализации не содержит модные фичи (рефлексия, или как её), позволяющие без ретипизации написать WriteLn(f[i, j]) так, что выведется "fDown". Да даже если выведется Up или Down - как тогда будет выглядет карта типа той, что я выше привел? )) Так что все равно нужно вывод организовывать с фильтром.-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
a100 |
15.12.2010 19:54
Сообщение
#7
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: a100 Репутация: 0 |
Самый лучший вариант - завести двумерный массив из байтов по числу клеток игрового поля b: array [xn..xx,yn..yx] of byte; В нем рисуй тело от хвоста до головы. Вот такие обозначения: 0 - пустая клетка 1 - тело идет вверх 2 - тело идет вправо 3 - тело идет вниз 4 - тело идет влево 5 - голова (тело закончилось 6 - кролик 7 - мангуста 8 - препятствие .... Вот тебе пример такого поля и змеи на нем: 0000000000 При этом храни в двух парах переменных текущие координаты головы и хвоста. Так ты сможешь "двигать змею". Если змея в этот момент движется вправо, то следующий кадр будет такой: 0000000000 Подумай над этим как следует. Если будут вопросы - задавай. Меня не будет до ночи, но кто-то еще может подсказать.. получается, сначала надо заполнить массив нулями, а потом в ячейки добавить значения? чтот пока не доходит |
Lapp |
16.12.2010 12:03
Сообщение
#8
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
получается, сначала надо заполнить массив нулями, а потом в ячейки добавить значения? чтот пока не доходит Заполнить нулями, начальным телом змеи и поставить кролика.Вот, смотри. Тут практически все готово кроме вывода. То есть вывод самый примитивный. Нужно добавить визуализацию на основе либо CRT, либо графики. Когда разберешься с основой, можно будет этим заняться. uses -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
a100 |
16.12.2010 22:45
Сообщение
#9
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: a100 Репутация: 0 |
спаааааасибо! буду разбираться
|
a100 |
21.12.2010 11:50
Сообщение
#10
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: a100 Репутация: 0 |
в принципе более менее разобрался)
но есть куча вопросов%) Подскажите пожалуйста...
Вот это место, Write(CellPrint[b[j,i]+1]), что оно выводит на экран, что значит? Потом, в каком месте в коде, написано, что когда змейка идет вверх, рисовать ^ вниз V вправо > влево < и т.д.? И по периметру стенка обозначается буквой W? Спасибо за внимание |
TarasBer |
21.12.2010 12:15
Сообщение
#11
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> Вот это место, Write(CellPrint[b[j,i]+1]), что оно выводит на экран, что значит?
> Потом, в каком месте в коде, написано, что когда змейка идет вверх, рисовать ^ вниз V вправо > влево < и т.д.? Вот в нём и написано. Посмотри описание строки CellPrint - в ней находятся все нужные символы. То есть для вывода нужного символа достаточно просто обратиться к нужному элементу строки. Например, CellPrint[1] - это первый символ строки CellPrint, CellPrint[i] - это i-ый символ этой строки итд. Задание таких вещей в константный массив избавляет программиста от написания большого числа однообразных ветвлений и повторяющегося кода, а значит, и от попадания на ГК. -------------------- |
Lapp |
21.12.2010 15:11
Сообщение
#12
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Спасибо, Тарас, +1 (P.S. - сделаю завтра, на сегодня лимит исчерпал..)
Потом, в каком месте в коде, написано, что когда змейка идет вверх, рисовать ^ вниз V вправо > влево < и т.д.? Обрати внимание на эти две строчки:CellPrint: string= ' ^>v<0RWOM..........';Комментарий внизу точно позиционирован, соотнеси цифры со строкой выше. Сам по себе комментарий, конечно, ни на что не влияет, но поможет разобраться. Цитата И по периметру стенка обозначается буквой W? Да. Это та же самая стенка, которую можно при желании поставить и в поле (она обозначается числом 7). Установка такой стенки по краю избавляет от необходимости делать дополнительную проверку для выхода змеи за край поля.-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
a100 |
22.12.2010 6:46
Сообщение
#13
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: a100 Репутация: 0 |
Друзья, огромное Вам спасибо за помощь!
попробуюс) |
a100 |
22.12.2010 14:31
Сообщение
#14
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Реальное имя: a100 Репутация: 0 |
не получается сделать, чтоб змейка постоянно была в движении((
|
Текстовая версия | 28.04.2024 5:32 |