Воскресенье, 01 Декабря 2024, 23:15

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Результаты поиска
nonameДата: Суббота, 16 Марта 2013, 14:33 | Сообщение # 241 | Тема: Вечный двигатель. Я сделал это, ДА!
заслуженный участник
Сейчас нет на сайте
Цитата (Apati)
Суть вечного двигателя в том, что его КПД больше или равен 100%.

что-то ты совсем не в ту степь ушёл. в идеале, при отсутствии трения, при отсутствии потери тепла на нагрев частей и т.п. и обычный любой двигатель будет иметь КПД 100%, но он ни разу не вечный. с другой стороны, и твой "двигатель" с колесом в воде, будет преодолевать трение и прочее и не будет иметь КПД 100%, так что ты что-то не то говоришь.

НО где-то на прошлой странице ты действительно начал говорить правильно о том, что трение, испарение и прочее не существенно, ЕСЛИ мы рассматриваем именно вечный двигатель. а почему? да потому, что вечный двигатель невозможен даже из идеальных материалов и даже в идеальных условиях. он не возможен в принципе.

если мы сможем получить даром, из ниоткуда 1000Дж, потеряем из них 999Дж и только 1Дж сможем применить для совершения работы, то это будет переворотом современных научных представлений. и это будет вечный двигатель. про КПД тут сложно что-нибудь сказать, потому что в данном случае мы получаем энергию даром, вырабатываем её из ничего, а КПД говорит об эффективности системы в передаче или преобразовании энергии.

хотя, доля правды во фразе о КПД есть: если двигатель будет иметь КПД выше 100%, то он будет вечным. то есть, двигатели с КПД более 100%- это разновидность вечных двигателей.

Цитата (Monteg)
В космосе перем любую вешь и вращаем, толкаем etc.
????
Вечный двигатель!

"вечный двигатель" это то, что может "вечно двигать", то есть вечно совершать какую-то работу. в идеальных условиях что-то может вечно двигаться, но если оно при этом будет совершать работу, то будет терять энергию и в конце-концов это прекратится.

короч- суть вечного двигателя в получении энергии из ничего. при этом различают не вечные, но даровые двигатели: использующие энергию солнца, ветра, приливов и т.п. при этом, практическом плане, мы получаем энергию как бы даром, но получается не вечный двигатель, а просто получение энергии извне.

короче- кто не читал книжку "Занимательная физика", все идите в библиотеку и почитайте. там много чего интересного есть. и про вечные двигатели и про человека-невидимку и много ещё про что.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Суббота, 16 Марта 2013, 14:36
nonameДата: Пятница, 15 Марта 2013, 22:11 | Сообщение # 242 | Тема: Вечный двигатель. Я сделал это, ДА!
заслуженный участник
Сейчас нет на сайте
Цитата (Apati)
Это все - вопросы технической реализации

да, как-то так. суть в том, что даже в идеальных условиях создать вечный двигатель не получилось бы.
Цитата (Apati)
то представь, что конструкция подвергается регулярному техническому обслуживанию

а вот это уже не надо было писать.
Цитата (Apati)
вода подливается, изнашиваемые детали своевременно заменяются.

а заодно и обруч крутится- чего уж там.


все правила форумной игры Дуэль Программистов
nonameДата: Пятница, 15 Марта 2013, 21:53 | Сообщение # 243 | Тема: Text Manager
заслуженный участник
Сейчас нет на сайте
tifaso, я бы предложил поискать места где водятся люди, пишущие под разные странные проги. для FireURQ или под Ren'Py например. или скрипты под что-нибудь.

часто так бывает, что у них нет нормальной удобной программы, подсвечивающей их синтаксис. для этого есть какой-то notepad++, но там надо этот синтаксис настраивать, эта настройка не совсем чтобы универсальна да и не хочется лишний раз с этой настройкой заморачиваться.

ну а ты мог бы выпустить версию блокнота как раз под их нужды.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Пятница, 15 Марта 2013, 21:54
nonameДата: Пятница, 15 Марта 2013, 21:41 | Сообщение # 244 | Тема: Вечный двигатель. Я сделал это, ДА!
заслуженный участник
Сейчас нет на сайте
Цитата (pelmenka)
Хотя-бы из-за того, что вода поднимается и стекает по фитилю медленнее, чем вытекает из дырки.

ну будет вода медленно набираться и медленно наполнять через трубу очередную чашу на колесе.
Цитата (stalker5889)
Хм... а с чего бы воде стекать с фитиля? Её будет удерживать та же сила что поднимает воду.

наверное, ты прав. ну не та же сила, но я так понимаю, что стекать она не будет.
Цитата (Undead)
Вода то высохнет.

дело не в этом. более того- есть схожие проекты, где перекатывающиеся шары должны двигать колесо, так вот: ни неразрушимое колесо ни конструкция из идеального материала без трения не позволят вечному двигателю работать. так и тут- испарение воды могло бы помешать этому двигателю быть вечным, но не успеет- он и так не вечный.
Цитата (Apati)
Слабо кому-нибудь объяснить почему это не будет работать?

баланс сил как и в других многочисленных проектах с колёсами и шарами и прочим. даже если удастся плотно заткнуть дырку колесом и не создать трения, то всё равно получается, что с одной стороны вода должна выталкивать всё колесо в одну сторону, и при этом это колесо должно входить снизу, не смотря на то, что вода выталкивает пенопласт. тут получается, что сила должна превозмочь саму себя. короч- оно просто будет стоять в одном положении и всё.
Цитата (Amri)
Я думаю, стоит подсчитать баланс сил

да.
Цитата (Undead)
Ты думаешь они знают, что такое книга?

кста- есть такая книжка "Занимательная Физика" в двух частях. автор- Перельман. там много чего интересного есть, в том числе есть и про вечные двигатели вообще и разбор некоторых конкретных "вечных" двигателей.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Пятница, 15 Марта 2013, 21:42
nonameДата: Пятница, 15 Марта 2013, 19:45 | Сообщение # 245 | Тема: Вечный двигатель. Я сделал это, ДА!
заслуженный участник
Сейчас нет на сайте
Цитата (Sh_o0_ter)
Не знаю, но, я уверен, что такая скажем простая и оригинальная идея вечного двигателя актуальна, его давно бы тогда сделали великие Умы в этой области!
было время, их придумывали тысячами, и делали десятки. причём, интересно, что некоторые даже как-то работали, в силу различных уловок или мошенничества или если это был на самом деле даровый двигатель(использующий энергию ветра, вращения Земли или т.п.).

приведённый топикстартером пример не будет двигаться вообще никак.

есть вариант проще и интереснее:

этот двиг даже может сделать пару оборотов.. и почему бы ему не крутиться вечно?


все правила форумной игры Дуэль Программистов
nonameДата: Пятница, 15 Марта 2013, 16:20 | Сообщение # 246 | Тема: генерация лабиринтов
заслуженный участник
Сейчас нет на сайте
лан, нормуль.

Цитата (stalker5889)
noname, когда я делал свой алгоритм я реализовал несколько комнат с одной дверью в рандомной стороне, но как соеденить их я не придумал.

есть простой способ: в готовом лабиринте вырезаешь комнату. скорее всего она будет иметь множество выходов и точно будет соединена с остальным лабиринтом. потом просматриваешь края комнаты и помечаешь выходы плюсиком.
-----------------

а я решил сделать следующее: пару прог, генерящих разные шаблоны и одну прогу, которая будет по шаблону делать лабиринт.

это попытка сделать универсальное решение. суть в чём- шаблон- это типа такой же лабиринт, поля которого помечены:
0- пустое поле
1- стена
2- подлежит генерации

например, одна прога будет заполнять лабиринт двойками и вырезать в нём комнаты нулями

другая прога будет заполнять лабиринт двойками и вырезать в нём пятно из нулей, перечёркнутое единицами

любой из этих прог или своей прогой, вообще как угодно, создаёшь шаблон.

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

вся сложность для меня в том, чтобы поднапрячься и начать это делать. но- сделаю. жди.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Пятница, 15 Марта 2013, 16:29
nonameДата: Пятница, 15 Марта 2013, 16:00 | Сообщение # 247 | Тема: Обсуждение курса "Основы С++ для начинающих..."
заслуженный участник
Сейчас нет на сайте
я бы предложил вместо курса "Основы С++ для начинающих программистов игр" сделать отдельно уроки "Основы С++" и отдельно "создание 2d игры" и "создание 3d игры".

основы C++- это ввод/вывод в т ч из файла, структуры и функции и прочее подобное, что как раз и есть в ваших уроках.

"создание 2d игры"- это отрисовка, отслеживание событий, перемещение спрайта, анимация, создание меню, отслеживание столкновений. примеры создания полноценных готовых простых игр: крестики-нолики, тетрис, собирание вишенок в лабиринте вид сверху, space invaders, платформер и как сделать прыжки. и многое другое.

"создание 3d игры"- создание пустой комнаты с персонажем, создание новых комнат, размещение новых моделек, организация перемещения и учёт препятствий. перемещение по неровной местности и лестницы. как сделать оружие. как сделать двигающихся противников. как организовать уничтожение противников оружием- с видимыми медленно летящими снарядами и с моментальными пулями и холодным оружием. и многое другое.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Пятница, 15 Марта 2013, 18:17
nonameДата: Пятница, 15 Марта 2013, 15:12 | Сообщение # 248 | Тема: 7 и 1 вопрос по реализации меню на HGE (есть пример)
заслуженный участник
Сейчас нет на сайте
Цитата (OdIUm)
1) С точки зрения кода - лучше это делать в одном классе Menu и там прописывать все части? Или каждый элемент (фон, левое меню, правое меню) - это отдельный класс и прописывается отдельно, а потом все соединяется?

фон, левое меню и правое меню- отдельные элементы заставки, так же как и левая панелька и каждая кнопка слева- отдельные элементы левого меню и, в идеале, хорошо бы строить классы исходя из этого.

но, я бы предложил сделать проще: не создавать класс заставки, а создать просто функцию отрисовки заставки, которая отрисовывает все входящие в неё элементы. она вызывает метод отрисовки каждого элемента(или функцию отрисовки чего-то там). вначале отрисовывается фон и левая панелька, затем остальное- то, что перерисуется поверх этого.

Цитата (OdIUm)
2) Анимированый фон. Это одна большая картинка, которая двигается медленно? Или это несколько разных спрайтов?

похоже, что это одна большая картинка, которая свёрнута в кольцо и наша область видимости медленно двигается по этому кольцу. чтобы такое нормально получилось, надо, чтобы края картинки нормально стыковались.

как это сделать: это одна большая картинка и каждый раз отображается какая-то часть этой картинки. или две части: уходящий конец картинки+ надвигающееся начало той же картинки. при отрисовке картинки засекай время и стадию отображения картинки. при следующей отрисовке смотри разницу во времени и делай вывод, насколько её прокрутить.

в этом нелёгком деле тебе поможет пример перемещения обычного квадрата в HGE. такой или похожий пример должен к нему прилагаться или спроси у кого-нить. после того как поймёшь как в HGE правильно двигать спрайт, можешь пробовать делать движение фона и остальные движения, про которые ты понаспрашивал.

Цитата (OdIUm)
3) Кнопки слева - это уже готовые картинки с текстом в двух видах (обычный текст и подсвеченный) и при клике они меняются на мгновение?
проще всего сделать именно так. при клике они меняются на определённое время, которое нужно задать.

Цитата (OdIUm)
4) Самый главный вопрос, выдвигающаяся часть меню. Как это сделать? То есть я близко не представляю...Если делать это как картинку, которая сначала двигается, а когда заканчивает - заменяется уже интерактивным меню
именно так. проще всего двигать просто картинку. и, поскольку при её движении нам не нужно реагировать на нажатия кнопок, то и не фик искать себе лишних сложностей.

при создании статической картинки используется фон + на него накладывается кнопка. когда картинка создана, отрисовывается её часть, всё б0льшая и б0льшая часть. когда картинка не дорисована- отрисовываем её дальше. и только когда картинка отрисована- мы готовы реагировать на кнопки.

про то, как правильно организовать движение, я сказал выше и больше возвращаться к этому не буду.

Цитата (OdIUm)
5) В кредитсах плывет текст, который идет снизу вверх и плавно появляется...Как такое реализовать?
как сделать именно такую прозрачность как в примере? насколько я успел разглядеть, там низ и верх одной и тоже строки могут иметь разную прозрачность.. я бы предположил, что картинка выводится построчно, строками вышиной в 1 пиксель. и прозрачность зависит от координат строки по y.

Цитата (OdIUm)
6) В опциях есть слайдеры, которые меняют громкость музыки и звуков. Через что их делать в HGE? есть интсрумент?

я мало работал с HGE, но думаю, что такого инструмента всё же нет. придётся всё делать самому.

Цитата (OdIUm)
7) При нажатии "Новая игра" появляется окошко для ввода имени...каким образом это реализовано?
отслеживаем щелчок мышью, если его координаты попали на кнопку, вызываем соответствующую функцию. например, в этом случае, отрисовывается картинка окошка для ввода имени. как сделать ввод с клавиатуры- должно быть в примерах к HGE. там должно быть и про вывод и про ввод.

Цитата (OdIUm)
Каким образом рассчитывать координаты расположения объектов на экране? Ну текста, кнопок и т.п.? Ну чтоб они располагались на нужных местах?
никто, кроме тебя, не знает, как ты хочешь расположить свои кнопки. но, вообще.. если ты в цикле выводишь левые вертикальные кнопки, то ты вполне можешь вызывать функцию отрисовки кнопки номер N, которая из этого N будет вычислять её координаты по вертикали и номер картинки, откуда её взять.

Цитата (OdIUm)
gui->AddCtrl

нихрена себе! в HGE есть какие-то средства для вывода контролов? не знал.. интересно, что там ещё есть.

OdIUm, для решения твоей задачи надо уметь программировать И знать HGE.

чтобы научиться программировать можешь для начала ставить перед собой реально достижимые цели. например: крестики-нолики с нормальной хорошей менюшкой (выбор стороны, начать/завершить игру, выйти из программы) и ИИ, который выбирает равновероятно любой ход из возможных. когда сделаешь- придумай себе что-нить посложнее.

чтобы знать HGE, надо изучать документацию по HGE.

а там- сам решай, что тебе делать.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Пятница, 15 Марта 2013, 15:17
nonameДата: Четверг, 14 Марта 2013, 20:40 | Сообщение # 249 | Тема: генерация лабиринтов
заслуженный участник
Сейчас нет на сайте
Цитата (stalker5889)
Я посмотрел твой код. Понял что я ещё зелёный нубас и тупо привинтил его к своему двужку) Надеюсь ты не против?

было бы в тысячу раз лучше, если бы ты понял алгоритм, а потом сделал бы его как умеешь- хотя бы без указателей, на массивах. тогда будет проще и короче- весь TList можно будет выкинуть на фик.

я же специально описал алгоритм в отдельном файле. он простой совсем. как сделать список из массива- читай в этой теме выше.

ты думаешь, я что в этой теме делаю? пишу программы на заказ? лично я надеялся, что даю интересную пищу для ума.

алгоритмы нужны не для того, чтобы их копировать, а для того, чтобы освоить какой-то приём, который можно потом по-разному применять в разных ситуациях.

Цитата (stalker5889)
пожелание: если в качестве дверей (при входе в комнату) будут двери (знак +) то это будет круто)

cry хочешь научиться программировать? так учись!


все правила форумной игры Дуэль Программистов
nonameДата: Четверг, 14 Марта 2013, 19:01 | Сообщение # 250 | Тема: генерация лабиринтов
заслуженный участник
Сейчас нет на сайте
Цитата (stalker5889)

Дальнейшая реализация идеи с комнатами предвидится?

ну, я уже почти решил, что и как я хотел бы сделать, но.. давать ли код или просто выложить алгоритм? пожалуй, выложу код. но придётся подождать.


все правила форумной игры Дуэль Программистов
nonameДата: Четверг, 14 Марта 2013, 18:28 | Сообщение # 251 | Тема: Разные действия при нажатий левого клика!
заслуженный участник
Сейчас нет на сайте
Цитата (tourniquet)
сть такой кусочек кода для игры "Крестики - нолики", думал сделать "ход конём", что бы при первом нажатии появился спрайт для Х, а при втором нажатии на тот же левый клик, появился спрайт для 0

кхм.. если это учебное задание, то дай точную формулировку задачи.

если же ты просто делаешь крестики-нолики, то по нажатию левого клика надо определить, попал ли клик на игровую доску и если да, то на какое поле доски и посмотреть соответствующую ячейку в массиве, чтобы узнать, свободно ли это поле. и только если это поле свободно, то только тогда заносить в соответствующую ячейку массива нужное обозначение(крестик или нолик), отрисовывать нужный значок(смотря что занесли в массив) и изменять значение переменной, в которой хранится чей сейчас ход(именно из этой переменной мы узнаём, что заносить в массив).

Цитата (tourniquet)
whatCase = !whatCase;
} else if(event.mouse.x > 300 && event.mouse.x < 450 && event.mouse.y > 150 && event.mouse.y < 300) {

вместо всех этих страшных вложенных проверок можно вычислить по координате x курсора координату x игрового поля. то есть, число 150..299 должно давать 0, число 300..449 должно давать 1, число 450..599 должно давать 2. других вариантов не должно быть, потому что мы уже проверили, что координаты точно попадают на игровую доску. и так переводим обе координаты. после этого заглядываем в массив, и.. смотри выше.

ещё небольшой момент: если ты хочешь, чтобы щелчки между клетками не засчитывались, то тогда можно, после вычисления координат щелчка на игровом поле, перевести эти координаты в координаты квадрата, куда должен попасть щелчок, чтобы быть засчитанным. например, мы хотим сделать отступ по 10 пикселей, тогда координаты x=1 y=1 должны дать xr1= 160, xr2= 289, yr1= 160, yr2= 289. щелчок попадает в рамку в том случае, если ((x>=xr1)&&(x<=xr2)&&(y>=yr1)&&(y<=yr2)). в этом случае, после щелчка, сначала проверяем, попал ли щелчок по игровой доске, и если да, то вычисляем координаты поля доски, по которому попал щелчок, после этого вычисляем координаты рамки куда должен вписаться щелчок. и только если щелчок вписался в координаты рамки, заглядываем в массив, и.. ну, ты понял.

Добавлено (14.03.2013, 17:58)
---------------------------------------------

Цитата (noname)
вместо всех этих страшных вложенных проверок можно вычислить по координате x курсора координату x игрового поля. то есть

без проверок. одной формулой. которую ты сам придумаешь.

Добавлено (14.03.2013, 18:28)
---------------------------------------------
tourniquet, чтобы понять как работает твой первый код, хорошо бы знать, в каких случаях он вообще выполняется. и как обрабатываются события в используемой тобой среде.

вот, например, в Borland C++ код обработки левого клика мыши можно повесить на щелчок левой кнопкой мыши по форме. то есть, кликнул гамер где-то в пределах рабочей области окошка игры(не в меню или пр.) и запускается наша функция, которая анализирует, куда он щёлкнул, и что теперь делать.

возможно, в твоём случае, нужно самому проверять случившиеся события. я не знаю как там на самом деле, но такое может быть. это похоже на использование игрового движка.

так как у тебя написано, получается следующее(то есть я не знаю, как там получается, но попробую предположить): если случился щелчок на игровом поле, то ты в первой проверке

Цитата (tourniquet)
if(!whatCase)
отрисовываешь туда спрайт крестика и поднимаешь флаг whatCase, а во второй проверке
Цитата (tourniquet)
if(whatCase)
тут же отрисовываешь туда же спрайт нолика и опускаешь флаг whatCase. итого: по щелчку мыши гамер видит отрисовывание нолика(это если я тебя понял правильно и если дальше в коде не случается ничего неожиданного).


все правила форумной игры Дуэль Программистов
nonameДата: Четверг, 14 Марта 2013, 17:44 | Сообщение # 252 | Тема: C или с чего начать лепить платформер
заслуженный участник
Сейчас нет на сайте
Цитата (imperator12)
Не понимаю зачем заставлять использовать то что давно вышло из употребления. Ведь недаром програмисты используют С++ ,а не С ? Вот где логика?

в настоящее время для написания программ, от которых требуется повышенная надёжность, используется чистый C. это связано с возможностью для любой ситуации доказать, что программа будет вести себя предсказуемым образом- именно так, как нам требуется. и не то, чтобы не было компиляторов C++, дающих абсолютно надёжный код.. просто не всё так уж легко задокументировать в соответствии с требованиями соответствующих стандартов.

короче, и в России и в мире есть и долго ещё будут существовать преуспевающие фирмы, в которых пишут программы на чистом C.


все правила форумной игры Дуэль Программистов
nonameДата: Четверг, 14 Марта 2013, 16:39 | Сообщение # 253 | Тема: Рандомизация массива!
заслуженный участник
Сейчас нет на сайте
tourniquet, ты последовательно меняешь значение каждого элемента массива с любым другим элементом.

а я бы последовательно менял значение каждого элемента массива, кроме последнего, с любым другим элементом, кроме тех, чей индекс меньше.

смысл в следующем:
1. в первую ячейку массива заносим любое из хранимых значений. и всё- от этой ячейки мы добились всего, что нам нужно, так давайте не будем больше её трогать.
2. и так же поступаем с оставшейся частью лабиринта(без выбывшей ячейки).
3. и, да- если у нас осталась одна ячейка, то не трогаем её- смысла нет.


все правила форумной игры Дуэль Программистов
nonameДата: Четверг, 14 Марта 2013, 16:13 | Сообщение # 254 | Тема: генерация лабиринтов
заслуженный участник
Сейчас нет на сайте
Цитата (-Mikle-)
Код очень простой.

посмотрел код прямоугольного лабиринта. код действительно очень прост, за счёт использования рекурсии. да, рекурсия рулит, если уметь её применять!

а я работал со списком.. впрочем, списки тоже хороши и удобны для решения широкого круга задач.

обычно списки организуют с помощью указателей. но многие игроделы используют скриптовые языки конструкторов, в которых указатели не предусмотрены. что тогда делать?

в этом случае список можно организовать с помощью достаточно большого массива и переменной, хранящей количество элементов "списка".

обычно смысл списка в том, что каждый элемент хранит какую-то информацию и ссылку на следующий элемент(в двусвязных списках- ещё и на предыдущий). НО на практике важно не внутреннее устройство списка, а то, чтобы с нашей структурой можно было работать как со списком.

вот, например, как могут быть организованы операции над списком из моей программы, для "списка" из достаточно большого массива и переменной, хранящей количество элементов "списка":

1) добавление элемента в список:
в "списке" все элементы хранятся подряд, начиная с начала массива и далее. благодаря тому, что мы всегда знаем количество элементов "списка", мы всегда знаем номер последнего элемента. так вот, новый элемент мы будем добавлять в следующую за ним ячейку. и нарастим количество элементов на 1.

2) просмотр элемента списка номер N:
ну, это совсем просто- если нам нужно просмотреть информацию элемента "списка" номер N, мы просто обращаемся к соответствующей ячейке массива.

3) удаление из списка элемента номер N:
вот тут есть маленькая хитрость. как мы выкрутимся, если нам надо уметь удалять любой элемент "списка"? на самом деле удаление можно сделать очень просто: меняем местами содержимое последнего элемента и элемента N. а затем уменьшаем количество элементов на 1. вот и всё! то, что находится в массиве после элементов "списка", никого не интересует.

схожим образом можно организовать и популярные в программировании списки типа "стек" и "очередь". стек проще, очередь- чуть сложнее.

Добавлено (14.03.2013, 16:04)
---------------------------------------------
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
собирался сегодня рассказать об особенностях лабиринтов, получающихся при генерации моим способом(как я понял, применяя рекурсию можно добиться ровно тех же результатов). но решил, что те, кому эта информация может быть полезна, способны и сами всё понять. так зачем писать очевидное? лучше я подкину вам задачку.

задача: разместить в лабиринте вход, три ключа(красный, синий, зелёный), три двери(красная, синяя зелёная) и три сундука(красный, синий, зелёный) так, чтобы игрок, вошедший в лабиринт через вход, гарантированно имел бы возможность добраться до каждого сундука. но при этом, чтобы до сундука можно было добраться только после прохода через дверь такого же цвета. изначально все двери заперты, но могут быть открыты ключом такого же цвета.

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

можно решить задачу и более сложным способом: так, чтобы сундук мог оказываться далеко за дверью, чтобы его приходилось искать. причём, можно генерить лабиринт так, чтобы к завершению генерации все объекты были уже в нём расставлены. это не просто. не то, чтобы сложно, но придётся проявить упорство, чтобы написать такую программу.

возможно, в вашей лабиринтовой игре вообще не будет ключей, НО разобравшись с этим упражнением, вы в любом случае сможете подойти более осмысленно к заполнению лабиринта. например, разбрасывая в лабиринте монстров разной силы и оружие разной мощности, вы можете позаботиться о том, чтобы не создавать изначально безнадёжных для игрока ситуаций.

и, конечно же, на основе моего алгоритма можно делать не только такие лабиринты с видом сверху. я видал одну старую 2d-игрушку с видом сбоку, в которой лабиринт состоял из одинаковых прямоугольных комнат, разделённых тонкими перегородками. чтобы генерить такие лабиринты нужно внести совсем не большие изменения в алгоритм.

и, вообще- интерес даже не именно в лабиринтах.. мало ли какие ещё структуры можно генерить. и важно понимать, что случайная генерация может создавать не только хаос, но и сложные упорядоченные структуры.

Добавлено (14.03.2013, 16:13)
---------------------------------------------
ну и решил выложиться на нормальный хостинг: http://yadi.sk/d/SDPz2lWo3HYgw


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Четверг, 14 Марта 2013, 16:13
nonameДата: Среда, 13 Марта 2013, 22:07 | Сообщение # 255 | Тема: Мои вопросы по С++
заслуженный участник
Сейчас нет на сайте
Цитата (vknw123)
Вчера установил Visual C++® 2008 Express.
Но даже несмог сделать "Hellо World",

немножко понятной инфы для самого старта есть здесь:
http://code-live.ru/tag/cpp-manual/

Цитата (vknw123)
но хочу узнать
эта программа может сделать автономно запускаемый экзешник, компактного вида?

экзешник делается автоматически. и я обычно запускаю именно экзешник в папке debug, вместо того, чтобы запускать прогу из среды разработки. но это дело вкуса. НО тут есть тонкий момент: когда программа будет готова, нужно в среде переключиться с debug на release и скомпилить прогу. тогда создастся папка release и в ней будет такой экзешник, который будет запускаться у тех, у кого не установлен VC++.


все правила форумной игры Дуэль Программистов
nonameДата: Среда, 13 Марта 2013, 20:49 | Сообщение # 256 | Тема: проэкт wenter-space
заслуженный участник
Сейчас нет на сайте
Цитата (Qvant)
"Бекграунд" неба с облаками - должен быть бесшовным .

есть небольшая хитрость, как сделать из обычной картинки такую, которую можно будет скроллировать по кругу.

вот, например: вы нашли свободную красивую картинку с городским пейзажем для вашего горизонтального 2d-скроллера, но при прокрутке края картинки не стыкуются. что делать?

берём, обрезаем картинку так, чтобы вертикальная линия обреза проходила ровно через середину одного из небоскрёбов картинки. после этого копируем получившуюся картинку, вставляем и отражаем её так, чтобы у нас получилась часть исходной картинки+ её зеркальное отражение.

края получившейся картинки должны стыковаться нормально- ведь теперь край, фактически, стыкуется сам с собой. но, бывают и исключения: например, если с краю исходной картинки была видна четверть автомобиля, то теперь, после стыковки, у нас получится автомобиль, состыкованный из двух одинаковых четвертей. в таких случаях исходную картинку нужно резать не один, а два раза, каждый раз подбирая отрез так, чтобы отрезанный край нормально стыковался сам с собой.

вот и всё.

если бекграунд у вас скроллируется не только горизонтально, но и вертикально, то и резать может понадобиться не только горизонтально, но и вертикально.

(и, да- я знаю, что некоторые покажут на меня пальцем и назовут некропостером))


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Среда, 13 Марта 2013, 20:50
nonameДата: Среда, 13 Марта 2013, 20:10 | Сообщение # 257 | Тема: Порталы, как в Portal.
заслуженный участник
Сейчас нет на сайте
вряд ли эта инфа чем-то поможет, но ещё интересно порталы сделаны в игре Prey:

Prey была издана раньше чем Portal, и в ней портал просто не заметен: там есть момент, где ты просто идя по коридору, проходишь через портал в другую часть коридора, и это совершенно не заметно. обычно же там порталом является, например, одна из сторон ящика или дверной проём, стоящий посреди комнаты- смотришь в ящик(или такой проём) и видишь другую комнату и можешь в неё войти. при этом, некоторые порталы можно и отключать.


все правила форумной игры Дуэль Программистов
nonameДата: Вторник, 12 Марта 2013, 18:41 | Сообщение # 258 | Тема: генерация лабиринтов
заслуженный участник
Сейчас нет на сайте
моя программа генерации лабиринтов
на C++
с исходником,
описанием алгоритма,
с выводом результата работы в текстовый файл:
http://zalil.ru/34340028
файл будет удалён через 10 дней после последнего скачивания.

и будьте бдительны: проверяйте файл на вирусы!

Добавлено (12.03.2013, 18:41)
---------------------------------------------
получающиеся лабиринты не похожи на те, которые вы могли видеть в рогаликах. тем не менее, можно придумать игры, для которых именно такая генерация идеально подойдёт. получающиеся лабиринты похожи на лабиринты из синклеровской игрушки Maziacs.

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

например, можно было пробивать не по две клетки в выбранную сторону, а по одной. только тогда надо внимательно проверять соседние поля. мой алгоритм проверяет только одно поле- то, до которого пробивается. а если вы решите пробиваться по одной клетке, то необходимо предварительно проверить, что рядом с ней нет уже пробитых ранее полей. иначе вместо лабиринта может получиться открытая поляна.

дальнейшее развитие идеи в том, чтобы генерировать лабиринты с комнатами, как в рогаликах.

например, вы можете видеть это на второй картинке здесь.

или в лабиринтах, генерируемых здесь.


все правила форумной игры Дуэль Программистов
nonameДата: Вторник, 12 Марта 2013, 18:20 | Сообщение # 259 | Тема: Генерация мира(2d)
заслуженный участник
Сейчас нет на сайте
Цитата (stalker5889)
noname, если поможет, вот нарыл.

Цитата
Алгоритм построения подзе мелий

В настоящее время на этой странице нет текста. Вы можете найти упоминание данного названия в других статьях, или найти соответствующие записи журналов.


stalker5889, только что дописал прогу. щазз выложу.

это- первая версия. без крупных комнат. только узкие коридоры.

в следующей версии добавлю комнаты.

в-общем, я поигрался со ссылкой, которую здесь уже давал, и мне уже более-менее ясен их алгоритм. они хитренькие: у них задаются не точные параметры: количество и размер комнат и прочего, а приблизительные. это даёт возможность упростить алгоритм. надо бы и мне так попробовать.

Добавлено (12.03.2013, 18:19)
---------------------------------------------
выложил программу здесь:
http://gcup.ru/forum/7-30888-505039-16-1363097916

Добавлено (12.03.2013, 18:20)
---------------------------------------------
дайте какой-нибудь отзыв в той теме.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Вторник, 12 Марта 2013, 18:12
nonameДата: Вторник, 12 Марта 2013, 15:04 | Сообщение # 260 | Тема: Генерация мира(2d)
заслуженный участник
Сейчас нет на сайте
Цитата (forhl)
Да, можно. Есть какой-нибудь пример на эту тему, noname?

от меня примеров пока не будет. я что-то с лабиринтами увяз.

хорошие идеи респавна начинаются с этой:
Цитата (noname)
если после хода игрока открываются поля лабиринта, которые раньше были не видны, то с вероятностью 1/3 мы ставим одного монстра на любое из этих полей. эффект будет такой, как будто игрок сам находит монстров. вероятность появления монстра подберёшь чтобы лучше подходило для твоей игры.
до неё там плохая идея была.

Цитата (forhl)
а вообще- не зря в рогаликах монстров заранее на карте расставляют..

Разве? Главное ведь в играх такого типа - случайность и, соответственно, реиграбельность. Да и как их можно расставить программно, если мир игры генерируется случайно?

мир генерируется случайно и в нём монстры случайно расставляются. можно и не случайно, а так, чтобы игрок имел шанс добраться сначала до слабых монстров, собрать оружие, а потом добраться до более сильных.

Цитата (forhl)
можно программно расставлять монстров заранее (рандомно)

stalker5889, пробовал. Они оказываются за пределами карты.

открывай тему, выкладывай свой пример и спрашивай помощи.

Цитата (forhl)
можно заранее расставить (программно -кэп)

Как на генерируемой карте можно расставить заранее программно?

процесс генерёжки карты заключается в том, что программно расставляются стены и пустоты лабиринта. точно так же можно потом добавить и монстров. и, да- при этом можно много чего интересного учесть. не только тот факт, что монстры не должны заменить собой стены.

Цитата (jorji)
ТАК,Это уже немайнкрафт?

название темы- "генерацию мира 2d". про майнкрафт тебе уже дали ссылку на то, как его создавать. там и создание мира есть.

насчёт генерации лабиринтов:
тысячу лет назад для FireURQ сделал генерацию лабиринта и бродячего монстра:
Код
; монстр в лабиринте
; УТОЧНЕНИЕ: n монстров в лабиринте 100х100(?) клеточек
:генератор
invkill
perkill
maxxr = 8 ; кол-во комнат по горизонтали
maxyr = 8 ; кол-во комнат по вертикали
maxx = maxxr*2+1 ; кол-во ячеек(комнаты+стены/проходы) по горизонтали
maxy = maxyr*2+1 ; кол-во ячеек по горизонтали
crx=0 ; переменные- счётчики
:цикл1_x
crx=crx+1
cry=0
:цикл1_y
cry=cry+1
world_#crx$_#cry$ = 1 ; заполняем мир
if cry<maxy then goto цикл1_y
if crx<maxx then goto цикл1_x
maxap=1 ; кол-во активных точек
x1=2*rnd#maxxr$ ; координаты первой активной точки
y1=2*rnd#maxyr$ ; точки всегда указывают на комнаты
world_#x1$_#y1$=2 ; создаём первую пустую комнату
:генератор_выбор_точки
t=rnd#maxap$ ; выбираем текущую активную точку
crn=0 ; счётчик направлений пробива
dir1=0 & dir2=0 & dir3=0 & dir4=0
if world_#x#t$ $_#y#t$ -2$= 1 then crn=crn+1 & dir1=1; пробив возможен: север
if world_#x#t$ -2$_#y#t$ $= 1 then crn=crn+1 & dir2=1; запад
if world_#x#t$ $_#y#t$ +2$= 1 then crn=crn+1 & dir3=1; юг
if world_#x#t$ +2$_#y#t$ $= 1 then crn=crn+1 & dir4=1; восток
if crn>0 then dir=rnd#crn$ & goto пробиватор
if crn=0 then x#t$= x#maxap$ & y#t$= y#maxap$ & maxap=maxap-1 ; гасим точку
if maxap>0 then goto генератор_выбор_точки
if maxap=0 then goto начало
end
:пробиватор
ndir=0
if dir1=1 then ndir=ndir+1
if dir=ndir then goto пробив1
if dir2=1 then ndir=ndir+1
if dir=ndir then goto пробив2
if dir3=1 then ndir=ndir+1
if dir=ndir then goto пробив3
if dir4=1 then ndir=ndir+1
if dir=ndir then goto пробив4
end
:пробив1
world_#x#t$ $_#y#t$ -1$=2 & world_#x#t$ $_#y#t$ -2$=2 ; пробиваем проход и делаем комнату
maxap=maxap+1 ; добавляем новую активную точку
x#maxap$=x#t$ ; указывающую на эту комнату
y#maxap$=y#t$-2
goto генератор_выбор_точки
end
:пробив2
world_#x#t$ -1$_#y#t$ $=2 & world_#x#t$ -2$_#y#t$ $=2
maxap=maxap+1 ; добавляем новую активную точку
x#maxap$=x#t$-2 ; указывающую на эту комнату
y#maxap$=y#t$
goto генератор_выбор_точки
end
:пробив3
world_#x#t$ $_#y#t$ +1$=2 & world_#x#t$ $_#y#t$ +2$=2
maxap=maxap+1 ; добавляем новую активную точку
x#maxap$=x#t$ ; указывающую на эту комнату
y#maxap$=y#t$+2
goto генератор_выбор_точки
end
:пробив4
world_#x#t$ +1$_#y#t$ $=2 & world_#x#t$ +2$_#y#t$ $=2 ; пробиваем проход и делаем комнату
maxap=maxap+1 ; добавляем новую активную точку
x#maxap$=x#t$+2 ; указывающую на эту комнату
y#maxap$=y#t$
goto генератор_выбор_точки
end
:начало
ggrx= 2 & ggry= 7 & instr ggface= север
ggx=ggrx*2 & ggy=ggry*2
instr letters= a b c d e f g h
tokens letters
instr w1= стена
instr w2= выход
instr ситуац= /в тупике/на прямом пути/на повороте/на развилке/на перекрёстке/
:начало_метка_1
pln
pln я- монстр. стою в комнате #%token#ggrx$$#9-ggry$, мордой на #%ggface$.
pln на севере- #%w#world_#ggx$_#ggy-1$$$, на западе- #%w#world_#ggx-1$_#ggy$$$, на юге- #%w#world_#ggx$_#ggy+1$$$, на востоке- #%w#world_#ggx+1$_#ggy$$$.
crn=0
dir1=0 & dir2=0 & dir3=0 & dir4=0
if world_#ggx$_#ggy-1$= 2 then crn=crn+1 & dir1=1; выход: север
if world_#ggx-1$_#ggy$= 2 then crn=crn+1 & dir2=1; выход: запад
if world_#ggx$_#ggy+1$= 2 then crn=crn+1 & dir3=1; выход: юг
if world_#ggx+1$_#ggy$= 2 then crn=crn+1 & dir4=1; выход: восток
if crn=1 then ситуац = "в тупике" & goto м_назад ; идём в единств возм сторону
; на момент начала игры монстр может оказаться в тупике лицом в любую сторону
if (crn=2)and(dir1=dir3) then ситуац = "на прямом пути" & goto м_дальше ; идём куда угодно, Только НЕ назад
; монстр теоретически может оказаться на прямом пути лицом к стене на момент начала игры
if (crn=2)and(dir1<>dir3) then ситуац = "на повороте" & goto м_дальше ; идём куда угодно, Только НЕ назад
if crn=3 then ситуац = "на развилке" & goto м_дальше ; идём куда угодно, Только НЕ назад
if crn=4 then ситуац = "на перекрёстке" & goto м_дальше ; идём куда угодно, Только НЕ назад
: начало_метка_2
pln так что я нахожусь #%ситуац$, и пойду теперь на #%ggface$
; перемещаем монстра:
if ggface="север" then ggry=ggry-1 & ggy=ggy-2
if ggface="запад" then ggrx=ggrx-1 & ggx=ggx-2
if ggface="юг" then ggry=ggry+1 & ggy=ggy+2
if ggface="восток" then ggrx=ggrx+1 & ggx=ggx+2
btn начало_метка_1, press ENTER
end
:м_назад
if dir1=1 then ggface="север"
if dir2=1 then ggface="запад"
if dir3=1 then ggface="юг"
if dir4=1 then ggface="восток"
goto начало_метка_2
end
:м_дальше
crn=crn-1 ; отбрасываем одно направление (назад)
dir = rnd#crn$
if ((dir<=1)and(not(ggface="юг" )))and(dir1=1) then ggface="север" & goto начало_метка_2
if ((dir<=2)and(not(ggface="восток")))and(dir2=1) then ggface="запад" & goto начало_метка_2
if ((dir<=3)and(not(ggface="север" )))and(dir3=1) then ggface="юг" & goto начало_метка_2
if ((dir<=4)and(not(ggface="запад" )))and(dir4=1) then ggface="восток" & goto начало_метка_2
end

а сейчас делаю на C++ просто генерацию лабиринта и выходит длиннее гораздо и я что-то не так сделал и завяз с указателями. вот, разгребаюсь. алгоритм на самом деле не сложный. так что буду делать, набираться опыта.

FireURQ- это для текстовых игр. в моей проге мы наблюдаем лабиринт с точки зрения бродячего монстра.

копируете текст проги в файл с расширением qst и запускаете фуркой. фурку(FireURQ) найдёте по ссылке, которую я дал выше.

Добавлено (12.03.2013, 14:56)
---------------------------------------------
--

поскольку из текста проги выше нифига не понятно, и даже из проги на C++ может быть не всё понятно, то выкладываю АЛГОРИТМ ГЕНЕРАЦИИ лабиринта. алгоритм простой, но хороший:

- заполняем всю область лабиринта стенами '#'
- выбираем случайное поле лабиринта
- отмечаем выбранное поле пустотой '.'
- заносим выбранное поле в список
- делай:
--- выбираем наугад поле из списка
--- подсчитываем стороны куда можно расшириться от выбранного поля
--- если никуда нельзя расшириться,
----- то удаляем поле из списка
--- иначе
----- выбираем одно из доступных направлений
----- пробиваем в эту сторону два '.' подряд
- пока список не пуст

вот и всё!

как убедиться, что в какую-то сторону можно расшириться? координаты не должны выходить за край лабиринта и целевая точка(в ту сторону на 2 шага от нашей) должна быть заполнена стеной(мы специально заранее заполняли весь лабиринт стенами).

а теперь пойду ковырять C++ дальше.

Добавлено (12.03.2013, 14:58)
---------------------------------------------
да, вот это:

- делай:
..
- пока список не пуст

это цикл с постусловием. то есть, в конце проверяется пуст ли список и если нет, то цикл крутится ещё раз от слов "делай".

Добавлено (12.03.2013, 15:04)
---------------------------------------------
так, ошибку в своей проге на С++ нашёл. а всего-то, я там в одной проверке написал = вместо == и долго не мог понять, что у меня происходит. скоро будут вам лабиринты. но, главное- алгоритм(выложил выше).

прогу выложу в другом, более подходящем, разделе, здесь размещу ссылку туда.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Вторник, 12 Марта 2013, 14:56
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг