RU 📌 Pinned

Как сделать?

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

Aleks Versus Moderator 02.06.2016 11:45 (9 years ago)

Genryzz:

Сумма группы = 7 Цены монстров 2 и 3 Может ли получиться такой вариант 2,2,2 с остатком 1 который некуда пристроить?

в моём примере такой случай исключён. Условие

summ - (number + min('mass')) < 0

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

Spoiler
!#enemy_search
args[0] = args[0] & ! стоимость всех монстров (то, что было summ)
$args[1] = $args[1]+',' & ! цены всех монстров через запятую

! первое, что делаем, вытаскиваем цены за монстров из аргумента
:price
if len($args[1])>0:
	! запоминаем число
	mass[]=val($mid($args[1],1,instr($args[1],",")-1))
	! удаляем его из строки
	if instr($args[1],",")<>len($args[1]):
		$args[1]=$mid($args[1],instr($args[1],",")+1)
	else
		$args[1]=''
	end
	jump 'price'
end

! Теперь выполняем тот же алгоритм, что мы уже писали,
! только исключая лишние глобальные переменные  (используем args)

! начинается цикл. Метка:
:for
! выкидываем число (стоимость монстра) из массива
	! получаем индекс
	args['index'] = rand(0,arrsize('mass')-1)
	! фиксируем число
	args['number']=mass[args['index']]
	
! проверяем, возможно ли вычитание
if args[0] - args['number'] = 0:
! если при вычитании числа из args[0] получается 0, значит мы нашли последнее число
	! записываем его
	search[]=args['number']
elseif args[0] - args['number'] < min('mass'):
! если разность args[0] и числа - меньше минимального значения в массиве, значит
	! число, которое мы вытянули, нам не подходит
	! и не подойдёт, его можно убрать из исходного массива
	killvar 'mass',args['index']
	! записывать его не нужно, просто возвращаемся и повторяем цикл
	jump 'for'
elseif args[0] - (args['number'] + min('mass')) < 0:
! если разность между args[0] и суммой выпавшего и минимального чисел в массиве
! меньше нуля, это число так же нам не подходит и не подойдёт
	killvar 'mass',args['index']
	jump 'for'
	! можно объединить с предыдущим условием через оператор OR
elseif arrsize('mass')<1:
! защита от дурака. Если размер массива mass упал до нуля, значит мы перебрали все
! возможные варианты и значит изначальное условие задано неверно или 
! решение, которое начал подбирать алгоритм изначально неверно подбиралось
	! *pl 'неверное решение'
	! $result = 'false'
	jump 'endandexit'
else
! во всех остальных случаях число нам подходит:
	! запоминаем его в конечный массив
	search[]=args['number']
	! уменьшаем args[0] на это число
	args[0] -= args['number']
	! повторяем цикл
	jump 'for'
end
! результат прописывается в массив search
! массив mass удаляем, он был временным
:endandexit
killvar 'mass'
exit

Пример вызова:

gosub 'enemy_search',9,'2,3,5,9'
Edited at 03.06.2016 10:11 (9 years ago)

Как вставить изображение в окно описания перед текстом? И как изменить его размер?

Aleks Versus Moderator 02.06.2016 14:55 (9 years ago)

Совёнок,
используй html. Включение html в QSP:

usehtml = 1

Вывод изображения с указанием ширины в пикселях:

*pl '<img src="путь к файлу изображения/картинка.png" width=250> какой-то текст, какой-то текст, какой-то текст'
*pl 'ещё какой-то текст'

Здравствуйте Гуру!
Нужна следующая функция:

Пример:

Если Если Если
яблоко = 1 груша = 1 слива = 1
То То То
груша =0 яблоко = 0 яблоко = 0
слива = 0 слива = 0 груша =0
апельсин = 0 апельсин = 0 апельсин = 0

Ну и т.д только чтоб для каждого случая отдельно не писать все условие

Aleks Versus Ваш алгоритм я не понял, но нашел другое решение.

P.S.
price_enemy_loc_current[war] - текущая цена локации №war
price_enemy_loc[war] - номинальная цена локации №war
price_graveyard_archer и price_graveyard_warrior - цена монстров

P.S.S. Удалил сообщение из-за бага в цикле(так как не знал сколько времени займет поиск причины). После решения проблемы восстановил.

Spoiler
enemy = 0
:Убей_ИХ_всех
if enemy => 1:
KILLVAR 'enemyXP',enemy
KILLVAR '$enemy_name',enemy
KILLVAR 'enemyDM',enemy
KILLVAR 'enemyDM_DIS',enemy
KILLVAR 'enemyDIST',enemy
enemy -= 1
Jump 'Убей_ИХ_всех'
else
enemy = 0
price_enemy_loc_current[war] = 0
:Сотворение
if price_enemy_loc_current[war] = price_enemy_loc[war]:
Jump 'Последний_штрих'
elseif price_enemy_loc_current[war] > price_enemy_loc[war]:
Jump 'Убей_ИХ_всех'
elseif price_enemy_loc_current[war] < price_enemy_loc[war]:
enemy += 1
mob = rand(1,2)
if mob = 1:
$enemy_name[enemy] = $enemy_graveyard_warrior
enemyXP[enemy] = enemy_graveyard_warrior_XP
enemyDM[enemy] = enemy_graveyard_warrior_DM
enemyDM_DIS[enemy] = 0
enemyDIST[enemy] = 0
price_enemy_loc_current[war] += price_graveyard_warrior
Jump 'Сотворение'
end
if mob = 2:
$enemy_name[enemy] = $enemy_graveyard_archer
enemyXP[enemy] = enemy_graveyard_archer_XP
enemyDM[enemy] = enemy_graveyard_archer_DM
enemyDM_DIS[enemy] = enemy_graveyard_archer_DM_DIS
enemyDIST[enemy] = 0
price_enemy_loc_current[war] += price_graveyard_archer
Jump 'Сотворение'
end
end
end
Aleks Versus Moderator 03.06.2016 09:46 (9 years ago)

Genryzz:

Aleks Versus Ваш алгоритм я не понял,

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

Genryzz:

но нашел другое решение.

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

Bup0H,
не понятно, какие данные приходят к этой функции изначально? Т.е. что должно быть, если придёт яблоко = 1 и слива = 1? Приоритет у яблока? Или в этом случае должно всё сбрасываться в 0? Или вообще ничего не должно меняться?

И ещё. Пользуясь словом “функция”, ты имеешь ввиду действительно функцию ака FUNC, или просто алгоритм ака кусочек кода?

Bup0H:

Если Если Если
яблоко = 1 груша = 1 слива = 1
То То То
груша =0 яблоко = 0 яблоко = 0
слива = 0 слива = 0 груша =0
апельсин = 0 апельсин = 0 апельсин = 0

Ну и т.д только чтоб для каждого случая отдельно не писать все условие

непонятно… а почему не сделать просто рандом на выпадение одного случайного фрукта, тогда будет только один из списка и остальные просто останутся в рандоме невыпавшими?

Aleks Versus Moderator 03.06.2016 17:16 (9 years ago)

Aaaspavel:

а почему не сделать просто рандом на выпадение одного случайного фрукта?

Вот-вот. Непонятно, зачем нужна проверка и выставление остальных значений.

Aleks Versus,
Я думаю и за нехватки опыта, то бишь, не знание о такой вещицы как рандом, во.

Помогите решить проблему. Почему эта часть кода не работает? Что я сделал не так?

Spoiler

выше все как часики работает

elseif hour =17 and minute <5:
$нина=‘дом’
$нина_статус=‘направляется на кухню’

!именно вот эта часть
elseif hour =17 and minute >=5:
if готово[’еда’] =0:
$нина=‘кухня’
$нина_статус=‘готовит кушать’
elseif готово[’еда’] =1:
$нина=‘кухня’
$нина_статус=‘гадает кросворд’
end
end
end

все спс разобрался, забыл прописать на локации $loc=$curloc

Edited at 05.06.2016 05:32 (9 years ago)

Можно ли запустить одновременно 2 звуковых дорожки?
Например идет звук боя и после удара воспроизводится звук, в то же время пока проигрывается звук боя.

Genryzz,
можно.

Доброго времени суток. У меня тут вопрос появился. Может кто поможет мне с ним.
Собственно, я так и не смог придумать ничего путного для создания скрипта кротчайшего пути от точки к точке.
Суть такова:
Есть координатная сетка вида (x,y,z), есть npc который определяет свое местонахождение с помощью этих координат и отрисовывается на соответствующей клетке. Я могу заставить его бездумно бродить по локации и определять что находится вокруг него на расстоянии в 1 клетку. А вот как заставить npc анализировать координатную сетку и составлять адекватный, кротчайший путь к другой ячейке, я ну вот совершенно не могу понять.

Svartberg:

кротчайший путь к другой ячейке, я ну вот совершенно не могу понять

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

Как?

Вот есть список музыкальных тем, есть композиции.

Идет в течении боя тема $music_theme = ‘war’
Здоровье противника приблизилось к нулю и включается $music_theme = ‘death_time’ и в тоже время продолжает играть $music_theme = ‘war’. При этом $music_theme = ‘death_time’ играет пару секунд после подтверждения условия запуска композиции.

Log in or Register to post comments.