RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2425501 views

Белый Шарик,
Вообще-то есть красный крестик в углу для таких случаев, но можно сделать и так:

'Хотите выйти?'
act 'Yes': n = 1 & gt $curloc 
IF n = 1: gt $curloc

И что произойдет?

Бесконечный цикл с перезаходом в текущую локацию?

evp,
Не даётся мне пока программисткий юморок.. Но по идее, плеер вешается и вылетает. У меня слетает без лишних “долгих” подгружаний - быстро и решительно…
За помощь с динамиком - спасибо. Я как-то в том же направлении и думал, вот только новые слова, вроде DYNAMIC пока ещё смущают.

Классический плеер не вылетает в бесконечном цикле. А вот Навигатор - да. Вылетает после ~1400-1900 циклов и при этом не обязательно, чтобы цикл был действительно бесконечным. Но Nex, к сожалению, фиксить не хочет. Считает некритичным багом.

svandrus:

За помощь с динамиком - спасибо.

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

Кстати, это хороший пример, не абстрактно-теоретический, а применяемый для решения конкретной практической задачи, использования циклов с заранее неизвестным количеством проходов. Есть ненулевая вероятность вылета Навигатора при исполнении этого кода. Может быть, этот пример сподвигнет Nex-а на исправление бага :)

evp,
Про бесконечный цикл - я на классике сделал и проверил. Вылетело. Может от системы зависит?
Про динамик - я в вопросе и написал, что не хотелось бы status quo запоминать, а потом циклы прогонять пока не попадёт. В совете сделано просто и понятно, но я всё-таки пытался запилить своё и без динамика сам.. Потому и со “спасибо” немного затянул - не проверил ещё, если честно.. Отвлёкся малость…
В идеале как хотелось: Есть восемь условий-направлений плюс одно - стояние на месте. Для каждого монстра все условия проверяются один раз за ход - исполнимые записываются в список вариантов из которых выбирать, а затем следует случайный выбор уже из заведомо сбыточного варианта. Вариант сбывается и переходим к следующему монстру. Если монстров 10 - это же одно дело, а если их на уровне 1000 генерировать? И карту побольше? Хотя, мне бы пока механизм освоить…

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

А что касается самого алгоритма, то - да. Сделано так - генерируется ход, а потом проверяется подходит он нам или нет. Если не подходит - генерируется новый. Метод далеко не идеальный и я об этом написал. Но для условий конкретнойзадачи с заданным размером поля и количеством монстров, вполне приемлемый.

evp:

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

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

Например, демоны 0,0 и 0,2. При предварительном анализе клетка 0,1 доступна для обоих. И что, если для каждого из них случайно будет выбрано перемещение в 0,1?

Вот модернизированный вариант, усложненный и лишенный недостатков варианта первого.

dynamic $FOR, 'dmnIndx', 0, ARRSIZE ('$daemon')-1, 1, {
	$coord = $daemon[dmnIndx]
	dynamic $FOR, 'd_x', -1, 1, 1, {
		dynamic $FOR, 'd_y', -1, 1, 1, {
			new_x = VAL (MID ($coord, 1, 1)) + d_x
			new_y = VAL (MID ($coord, 3, 1)) + d_y
			$new_coord = '<<new_x>>,<<new_y>>'
			if new_x > 0 and new_x < 9 and new_y > 0 and new_y < 10 and (ARRPOS ('$daemon', $new_coord) < 0 or ARRPOS ('$daemon', $new_coord) = dmnIndx): $AvailableSteps[] = $new_coord
		}
	}
	$daemon[dmnIndx] = $AvailableSteps[RAND(0, ARRSIZE('$AvailableSteps')-1)]
	KILLVAR '$AvailableSteps'
}

Как и раньше, dynamic используется только в целях наглядности кода. Сами по себе, используемые dynamic, представляют всего-лишь циклы в сокращенной записи.

Итак, проверяются все ходы для демона, а возможные из них помещаются в массив $AvailableSteps[]. Потом выбирается случайный элемент из $AvailableSteps[], он и считается выполняемым ходом. Потом переходим к следующему демону и процедура повторяется.

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

evp:

Например, демоны 0,0 и 0,2. При предварительном анализе клетка 0,1 доступна для обоих. И что, если для каждого из них случайно будет выбрано перемещение в 0,1?

Они же по очереди ходят. Цикл закончится на том, как демон “сходил”, а не “куда решил сходить”. Т.е. для второго вариант с занятой уже клеткой отсекается.

svandrus:

Если монстров 10 - это же одно дело, а если их на уровне 1000 генерировать? И карту побольше? Хотя, мне бы пока механизм освоить…

Во втором варианте алгоритма “по-барабану” сколько демонов и насколько велико поле.

Подскажите, пожалуйста, как сделать кликабельное изображение в основном окне.
1. Мне нужно, что бы при нажатии на картинку осуществлялся переход на другую локацию.
2. Что бы при нажатии на картинку воспроизводилась музыка. При повторном нажатии, что бы музыка начиналась заново.

1.

USEHTML = 1
*nl '<a href="exec: gt 'location'"><img src="/img/img.png"></a>'

evp,
Спасибо большое. Половину проблемы решил) А вот с музыкой как быть то, exec: gt кидает в новую комнату, а мне необходимо, что бы ничего не происходило кроме воспроизведения музыки.

Вы сами поставили такое условие

Mr.Crazzyr:

  1. Мне нужно, что бы при нажатии на картинку осуществлялся переход на другую локацию.

Вот вам три варианта, выбирайте любой.

*nl '<a href="exec: gt 'location'"><img src="/img/img.png"></a>'
*nl '<a href="exec: PLAY '/sound/music.mp3',50"><img src="/img/img.png"></a>'
*nl '<a href="exec: PLAY '/sound/music.mp3',50 & gt 'location'"><img src="/img/img.png"></a>'

Со звуком я не имел дела. Так что, на всякий случай, вот вам ссылочка.

Mr.Crazzyr:

  1. Что бы при нажатии на картинку воспроизводилась музыка. При повторном нажатии, что бы музыка начиналась заново.

Может так подойдёт?

'<a href ="exec: CLOSE ''veta.mp3'' & PLAY ''veta.mp3''"><img src = ''wolf.jpg''></a>'

Log in or Register to post comments.