RU 📌 Pinned

Как сделать?

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

Календарь от evp вынес в отдельную тему: Календарь по методу счёта Юлианских дней

svandrus:

Поделюсь своим календарём, может кому и пригодится:

Spoiler

sec += 1
IF sec = 60:
sec = 0
minute += 1
END

IF minute = 60:
minute = 0
hour += 1
END

:loop
IF minute > 60:
minute -= 60
hour += 1
IF minute > 60: JUMP ‘loop’
END

!Правильное отображение минут
$minute = IIF (minute < 10 and minute!0, ’0<<minute>>’, ‘<<minute>>’)

IF hour = 24:
hour = 0
day += 1
END

:loop_1
IF hour > 24:
hour -= 24
day += 1
IF hour > 24: JUMP ‘loop_1’
END

IF day > 30:
day = 1
mounth += 1
END
IF mounth > 13:
mounth = 1
year += 1
END

$mounth[1] = ‘Месяц Луны’
$mounth[2] = ‘Месяц Мороза’
$mounth[3] = ‘Месяц Ветра’
$mounth[4] = ‘Месяц Воды’
$mounth[5] = ‘Месяц Земли’
$mounth[6] = ‘Месяц Огня’
$mounth[7] = ‘Месяц Цветов’
$mounth[8] = ‘Месяц Света’
$mounth[9] = ‘Месяц Урожая’
$mounth[10] = ‘Месяц Листопада’
$mounth[11] = ‘Месяц Дождей’
$mounth[12] = ‘Месяц Тишины’
$mounth[13] = ‘Месяц Снегопада’

clr
pl ‘<<hour>> : <<$minute>> : <<sec>>’
pl ‘<<day>> <<$mounth[mounth]>> <<year>> год 7 Эпохи’

В отличие от “учебного” способа, тут не надо умноЖать и делить, в чём я всегда путаюсь.. Косяков за методом не заметил.. Поскольку я сам придумал систему времявычисления, то в месяце у меня по 30 дней, но в вашей Солнечной системе любят всё усложнять, поэтому можно понатыкать условий, вроде:

IF mounth = 2 and day > 28:
mounth += 1
day = 1
END

С усталостью или придётся к каждому действию прописать сколько усталости отнимется:

act 'Arbeiten':
fatigue = fatigue - 100
end

Или привязать ко времени на той же локации, где измеряется время:

IF minute > 60:
minute = 0
hour = hour + 1
fatigue = fatigue - 50
END

P.S. Про пятницу.. В твоём случае:

IF неделя = 5:
 act 'Ура, пятница!!! Убежать праздновать!': gt 'Кабак'
END

P.P.S. Про усталость и голод - нужно знать как работает твой календарь - через счётчик (реал-тайм) или через GS, тогда и варианты можно будет предложить.

Огромное спасибо!
Воспользовался вашим календарём и всё стало намного проще и понятней! :)

А про пятницу, да, что то я сам затупил там…

Что касается усталости и голода, я просто добавил сюда такие строчки:

Spoiler

:loop
IF minute > 60:
minute -= 60
hour += 1
energy = energy - 7
if energy < 0:energy = 0
golod = golod - 14
if golod < 0:golod = 0
jajda = jajda - 20
if jajda < 0:jajda = 0
alc = alc - 10
if alc < 0:alc = 0
if alc > 0:jajda - 5
IF minute > 60: JUMP ‘loop’
END

И теперь каждый час отнимается ровно столько, сколько нужно :)

evp:

Я же показал нормальныйкалендарь несколькими страницами ранее.

flipslam, там пятница - это пятница :) weekday = 5.

С пятницей разобрался, сам затупил :D
А вот с календарём так и не понял, всё своё закоментил, вставил ваше и так и не понял как оно должно работать и где и куда там можно добавить свои строки с той же усталостью, я пока не знаком с такими командами.
Но всё равно спасибо за отклик на просьбу помочь! :)

Простите, я опять с глупым вопросом.
Я добавляю деньги в инвентарь:

ADDOBJ 'деньги - 15 золотых'
gold_index = COUNTOBJ
gold = 15
SHOWOBJS 1

Пока все в порядке.
Если я хочу обновить количество денег и использую следующий код:

gold = gold - 5
KILLOBJ gold_index
ADDOBJ 'Деньги - ' + STR(gold), gold_index
SHOWOBJS 1

то я получаю две строчки в инвентаре:
Деньги - 15 золотых
Деньги - 10 золотых

В чем моя ошибка? Разве нельзя удалять предмет из инвентаря по индексу?

А почему нельзя просто в виде одной переменной сделать деньги? Так гораздо ж проще.

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

rutigl,
У тебя деньги и в виде объекта (’деньги - 15 золотых’) и в переменной (gold = 15).
То, как написал ты, работает правильно, если в инвентаре 1 объект (gold_index = 1) или деньги это самое последнее, что есть в инвентаре.
P.S. - Получается, кстати без золотых. Т.е. было “Деньги - 15 золотых”, стало “Деньги - 10”.
“Деньги - 15 золотых” - это один объект. COUNTOBJ считает все объекты в инвентаре, а не разбирается есть ли в имени объекта цифры. KILLOBJ удаляет из инвентаря объект с заданным индексом. Т.е. если других предметов, кроме денег нет, индекс будет равен 1. Первый предмет удалится.
UPD.
Инвентарь с яблоками…

rutigl,
для считаемых предметов есть специальный модуль.

Всем огромное спасибо

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

mkir,
посмотри эту тему.

Появился небольшой вопросик - как сделать ‘невидимую’ локацию. Т.е. смысл такой - есть 10 уровней подземелья, на каждом уровне есть 3-5 специфичных моба, характерных только для этого этажа, при каждом ходе на этаже у игрока есть шанс наткнутся на монстра, при этом игрока должно отправить на эту ‘невидимую’ локацию, где произойдет генерация моба, т.е сперва рандом выбирает один из типов монстров(допустим пень, злое дерево, слайм), потом подбирает один из подтипов монстров(древний, могучий, ловкий) и только после этого отправляет игрока в бой, причем автоматически.
В общем виде я пытался сделать примерно так:

Spoiler
enemyrand=rand(1,2)
    if enemyrand=1: 
    $enemyname='Дерево'
    if enemyrand=2:
    $enemyname='Пень'
    end
gt'types'

и вот это на странице types

Spoiler
if $enemyname='Дерево':
   lvlv=1
   strengv=8
   speedv=12
   agilv=12
   vitalv=10
   intelv=6
   healthv=vitalv*5
   mannav=intelv*3
   end 
   if $enemyname='пень':
   lvlv=1
   strengv=12
   speedv=10
   agilv=10
   vitalv=6
   intelv=6
   healthv=vitalv*5
   mannav=intelv*3
   end
gt'battle'
end

думаю я в коде допустил пару косяков,поскольку когда переходит на локацию battle hp врага показывает 0, как и имя врага так же 0, помогите пожалуйста все исправить, и да, я только учусь программировать)

leo_24,
И чего это взрослые молчат? Опять мне, дилетанту, помогать?
Почитай про GS. Энтот оператор позволит проверить содержимое посторонней локации, не уходя с настоящей.
Ну или можно как ты сделал через GT. Интерпретатор экспрессом проносится по локации ‘type’, считывая имеющийся там код, а пользователь этого даже не замечает. Только в своём примере

enemyrand=rand(1,2) 
    if enemyrand=1: 
    $enemyname='Дерево' 
    if enemyrand=2: 
    $enemyname='Пень' 
    end 
gt'types'

ты, однако, end забыл… А во втором наоборот, один лишний…

>>UPD>>
Вот так, будет работать..
Локация ‘Start’

Spoiler
KILLALL
SHOWINPUT 0
Usehtml = 1
enemyrand=rand(1,2) 
    if enemyrand=1: 
    $enemyname='Дерево'
    end 
    if enemyrand=2: 
    $enemyname='Пень' 
    end 
gt'types'

Локация ‘types’

Spoiler
if $enemyname='Дерево': 
   lvlv=1 
   strengv=8 
   speedv=12 
   agilv=12 
   vitalv=10 
   intelv=6 
   healthv=vitalv*5 
   mannav=intelv*3 
end 
if $enemyname='Пень': 
   lvlv=1 
   strengv=12 
   speedv=10 
   agilv=10 
   vitalv=6 
   intelv=6 
   healthv=vitalv*5 
   mannav=intelv*3 
end 
gt'battle'

Локация ‘battle’

Spoiler
'Против вас стоит <<$enemyname>>'
'Vv = <<vitalv>>'
act 'Ещё разок': gt 'Start'

Vv - это для проверки, правильно ли чего показывает. Если в одном случае ‘Пень’ написано с Большой буквы, а во втором с маленькой, то это два разных пня. Если на локации battle забыть поставить ‘$’ перед enemyname - будет показывать 0.

Такая задача:
Есть поле, размером 10*10. На поле 9 фигур противника и фигура игрока. На одной координате может находиться только одна фигура. Как сделать расчёт возможных ходов игрока, чтобы он не вышел за границы поля или не наехал на фигуру противника я сообразил, но задача усложнилась. Каждый ход каждая фигура противника случайным образом делает свой ход на одну клетку в случайном направлении (или остается на месте с вероятностью 1 к 9). Так вот, у меня не получается грамотно (хотя, чего уж там, никак не получается) задать условия перемещения фигур противника, чтобы они не убегали за пределы поля и не сталкивались друг с дружкой.
По идее, надо для каждой фигуры разузнать ближайшее окружение на наличие свободного места и сформировать список вариантов из которых, случайным образом выбрать один. Что-то намечалось с выборкой из всех девяти и в случае фейла, строился цикл, опять возвращавший к выбору вариантов, но для этого приходится запоминать status quo, а это не совсем то… В общем, помогите, люди добрые, советом или примером наглядным.

Мы будем работать с текстовым массивом $daemon, элементы которого хранят в себе координаты демонов в виде ‘x,y’.

Например: daemon[5] = ’8,6’ означает, что 5-й демон находится в точке с координатами x=8, y=6.

!Первоначальная расстановка
dynamic $FOR, 'dmnIndx', 0, 8, 1, {
	:NextAttempt
	$coord = '<<RAND(0,9)>>,<<RAND(0,9)>>'
	if ARRPOS ('$daemon', $coord) >= 0: jump 'NextAttempt'
	$daemon[dmnIndx] = $coord
}
!Ходы
dynamic $FOR, 'dmnIndx', 0, ARRSIZE ('$daemon')-1, 1, {
	:NextAttemptMove
	$coord = $daemon[dmnIndx]
	new_x = VAL (MID ($coord, 1, 1)) + RAND (-1,1)
	new_y = VAL (MID ($coord, 3, 1)) + RAND (-1,1)
	$coord = '<<new_x>>,<<new_y>>'
	if new_x < 0 or new_x > 9 or new_y < 0 or new_y > 10 or (ARRPOS ('$daemon', $coord) >= 0 and ARRPOS ('$daemon', $coord) ! dmnIndx): jump 'NextAttemptMove'
	$daemon[dmnIndx] = $coord
}

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

dynamic $FOR тот же, что и тут.

P.S. Код далеко не оптимальный. Если ход не удовлетворяет критериям, то генерируется новый ход, что влечет за собой выполнение новых циклов. Теоретически существует вероятность, хоть и очень маленькая, что по этой причине иногда он будет исполняться непозволительно долго. Например, демон в 0,0 и постоянно генерируются отрицательные new_x и new_y. Мой перфекционизм не позволит вставить такой код в программу по этой причине. Но, тем не менее, это работающий пример, достойный улучшения.

Белый Шарик #100 24.06.2015 10:44 (10 years ago)

Пардон за дилетантский вопрос. Как в коде прописать опцию Quit ? Ну тоесть выход из игры.

Log in or Register to post comments.