Как сделать?
…
svandrus,
Ну кот и че. Попробовал твой код с картинкой, не работает
Spoiler
USEHTML = 1
'
<center>Название таблицы
<table width="300" bgcolor="plum" border="1"
align="center" cellspacing="5" cellpadding="10"
rules="rows" frame="void">
<tr><th>1</th><th>2</th><th>3</th></tr>
<tr><td>11</td><td>12</td><td>13</td></tr>
<tr><td>21</td><td>22</td><td>23</td></tr>
<tr><td>31</td><td>32</td><td>33</td></tr>
</table> </center>
'
svandrus,
НО И ПОЛТОРА КИЛОГРАММА ЛЕГКОУСВОЯЕМОГО МЯСА! СПАСИБО ЗА КОД
svandrus:
Spoiler
USEHTML = 1 ' <center>Название таблицы <table width="300" bgcolor="plum" border="1" align="center" cellspacing="5" cellpadding="10" rules="rows" frame="void"> <tr><th>1</th><th>2</th><th>3</th></tr> <tr><td>11</td><td>12</td><td>13</td></tr> <tr><td>21</td><td>22</td><td>23</td></tr> <tr><td>31</td><td>32</td><td>33</td></tr> </table> </center> '
Атрибуты rules и frame не поддерживаются классическим плеером. Кроме того, у вас после названия лишний перевод строки, а после таблицы - 9 лишних переводов строки. Пофиксил.
Spoiler
USEHTML = 1
*nl'<center>Название таблицы'
*p'<table width="300" bgcolor="plum" border="1"'
*p'align="center" cellspacing="5" cellpadding="10">'
*p'<tr><th>1</th><th>2</th><th>3</th></tr>'
*p'<tr><td>11</td><td>12</td><td>13</td></tr>'
*p'<tr><td>21</td><td>22</td><td>23</td></tr>'
*p'<tr><td>31</td><td>32</td><td>33</td></tr> '
*p'</table> </center>'
evp,
То есть ни картинка с котиком, ни ссылка на энциклопедию, объясняющую жест, так и не задали нужного тона для ответа?
Ну нельзя же так серьёзно всё воспринимать…
svandrus, не понимаю, какое отношение имеют фейспалм и котик к тому, что вы опубликовали код, после использования которого возникнут вопросы типа: “А шо у миня там за пробелы после таблицы? Я так нихотел.”
Очень, очень-очень нужна помощь разворотить навороченное!
Задумка была в создании мини-игры по типу “Лживые кости”, как из Пиратов Карибского моря.
Сначала сделала лайт-версию, где просто игрок и нпс бросают кости, у кого больше, тот и выиграл. Но мне захотелось большего…
Короче, код большой, я его разбила на несколько локаций, чтобы хоть как-то облегчить, но он почему-то зацикливается на броске кубиков игроком и продолжает бросать снова и снова… Прошу помощи знающих людей. Вот, собственно, код:
Spoiler
!локация 'стол'
if раунд > 6:
раунд = 0
gt $curloc
end
раунд = раунд + 1
if ставка = 0:
act 'Сделать ставку':
a = input 'Делайте ставку!'
if a > благосостояние:
'У вас нет столько денег!'
else
благосостояние = благосостояние - a
ставка = 1
gt $curloc
end
end
end
end
if ставка = 1:
act 'Бросить кубики':
gt 'лживые кости'
end
end
!локация 'лживые кости'
if раунд = 1 or раунд = 3 or раунд = 5:
gs 'лживые кости0'
end
if раунд = 2 or раунд = 4 or раунд = 6:
gs 'лживые кости1'
end
!служебная локация '!бросок'
кость1 = rand (1,6)
кость2 = rand (1,6)
ответ = кость1 + кость2
кость3 = rand (1,6)
кость4 = rand (1,6)
ответ2 = кость3 + кость4
!локация 'лживые кости0'
*p 'Раунд <<раунд>>
'
gs '!бросок'
'Вы бросаете кубики...'
wait 2000
'Вы выкинули число <<ответ>>'
wait 1000
'Противник бросает кубики...'
act 'Солгать о выкинутом числе':
ложь = 1
правда = 0
gt $curloc
'Вы решили сблефовать.'
end
act 'Сказать правду':
правда = 1
ложь = 0
gt $curloc
'Вы решили не блефовать.'
end
end
if ложь = 1 or правда = 1:
wait 1000
*p 'Противник думает...'
думает = rnd
if думает > 500 or думает = 500:
блеф = 1
неблеф = 0
gt $curloc
*p 'Противник думает, что вы блефуете!'
else
блеф = 0
неблеф = 1
gt $curloc
*p 'Противник думает, что вы говорите правду!'
wait 1000
end
end
if ложь = блеф and ложь = 1:
*p 'Вы проиграли. Противник раскусил вас!'
delact 'Бросить кубики'
act 'Еще разок!':
gt 'стол'
end
end
if ложь = неблеф and ложь = 1:
*p 'Вы открываете свои кубики ошарашенному противнику. Вы выиграли!'
благосостояние = благосостояние + a + a
delact 'Бросить кубики'
act 'Еще разок!':
gt 'стол'
end
end
if правда = блеф and правда = 1:
*p 'Вы открываете свои кубики ошарашенному противнику. Вы выиграли!'
благосостояние = благосостояние + a + a
delact 'Бросить кубики'
ставка = 0
act 'Еще разок!':
gt 'стол'
end
end
if правда = неблеф and правда = 1:
*p 'Вы проиграли. Противник раскусил вас!'
delact 'Бросить кубики'
ставка = 0
act 'Еще разок!':
gt 'стол'
end
end
!служебная локация '!противник'
if блеф = 1:
лицо = rand (1,3)
if лицо = 1:
$лицо = 'Противник цепко следит за вами немигающим взглядом. Вы замечаете, как по лбу у него стекает капля пота.'
end
if лицо = 1:
$лицо = 'Противник утирает пот с верхней губы. Вы замечаете, что у него непроизвольно дернулся уголок рта.'
end
if лицо = 1:
$лицо = 'Противник чешет затылок. Вы замечаете, как он рефлкторно кусает губу.'
end
end
if неблеф = 1:
лицо = rand (1,3)
if лицо = 1:
$лицо = 'Противник смотрит на вас холодными глазами. Он не делает никаких лишних телодвижений.'
end
if лицо = 1:
$лицо = 'Противник отвел взгляд в сторону. Он сидит очень уверенно, словно не замечая вас.'
end
if лицо = 1:
$лицо = 'Противник задумчиво смотрит на свои кости. Лоб его гладок.'
end
end
!локация 'лживые кости1'
*p 'Раунд <<раунд>>
'
gs '!бросок'
'Вы бросаете кубики...'
wait 2000
'Вы выкинули число <<ответ>>'
wait 1000
'Противник бросает кубики...'
грань1 = rand (1,6)
грань2 = rand (1,6)
врет = грань1 + грань2
говорит = rnd
if говорит > 500 or говорит = 500:
блеф = 1
неблеф = 0
gt $curloc
*p 'Противник говорит число <<врет>>.'
else
блеф = 0
неблеф = 1
gt $curloc
*p 'Противник говорит число <<ответ2>>.'
wait 1000
end
gs '!противник'
act 'Рассмотреть противника':
*p '<<$лицо>>'
delact 'Рассмотреть противника'
end
act 'Вы решаете, что противник блефует'
блеф1 = 1
неблеф1 = 0
delact 'Вы решаете, что противник блефует'
gt $curloc
wait 1000
end
act 'Вы решаете, что противник говорит правду':
блеф1 = 0
неблеф1 = 1
delact 'Вы решаете, что противник говорит правду'
gt $curloc
wait 1000
end
if блеф1 = блеф and блеф1 = 1:
*p 'Противник меняется в лице. Вы выиграли!'
благосостояние = благосостояние + a + a
delact 'Бросить кубики'
ставка = 0
act 'Еще разок!':
gt 'стол'
end
end
if блеф1 = неблеф and блеф1 = 1:
*p 'Противник злорадно улыбается. Вы ошиблись, и этот раунд не за вами.'
delact 'Бросить кубики'
ставка = 0
act 'Еще разок!':
gt 'стол'
end
end
if неблеф1 = неблеф and неблеф1 = 1:
*p 'Противник меняется в лице. Вы выиграли!'
благосостояние = благосостояние + a + a
delact 'Бросить кубики'
ставка = 0
act 'Еще разок!':
gt 'стол'
end
end
if неблеф1 = блеф and неблеф1 = 1:
*p 'Противник злорадно улыбается. Вы ошиблись, и этот раунд не за вами.'
delact 'Бросить кубики'
ставка = 0
act 'Еще разок!':
gt 'стол'
end
end
Начну с сообщения, что в локации ‘стол’ в строке 17 у вас лишний end. Но не этот end является причиной ошибки.
Ошибка тут:
else
благосостояние = благосостояние - a
ставка = 1
gt $curloc
end
gt $curloc возвращает нас в текущую локацию и весь код исполняется еще раз, а это значит, что выполняется также строчка
раунд = раунд + 1
тем самым необоснованно увеличивая раунд.
Еще раз. При первом заходе в локацию ‘стол’ раунд становится равен 1, а после того как вы сделали ставку, код локации обрабатывается еще раз и раунд становится 2. Я подозреваю, что вам это не нужно.
Исправить легко:
!локация 'стол'
if раунд > 6:
раунд = 0
gt $curloc
end
раунд = раунд + 1
if ставка = 0:
act 'Сделать ставку':
a = input 'Делайте ставку!'
if a > благосостояние:
'У вас нет столько денег!'
else
благосостояние = благосостояние - a
ставка = 1
cla
act 'Бросить кубики': gt 'лживые кости'
end
end
end
Дальше не смотрел, так как зацикливания о котором шла речь удалось избежать.
UPD. Упс… Теперь закливается в другом месте, надо дальше править.
evp,
Спасибо большое, попробую вставить в свой код)
Получается, все дело в излишних gt $curloc? Очевидно, и дальше зацикливается из-за них.
Насчет того, что дальше - всего есть шесть раундов. В первом, третьем и пятом противник должен угадать, блефует игрок или нет, а во втором, четвертом и шестом угадывает игрок.
К сожалению, сейчас нет доступа к компьютеру, так что проверить, где дальше зацикливается, не смогу, но спасибо большое за разъяснения :)
Продолжим.
Мне кажется, что вы думаете, что оператор gt $curloc в локации ‘лживые кости0’ вернет вас в эту локацию и код ‘лживые кости0’ выполнится еще раз. Если это так, то вы ошибаетесь.
Что происходит? Вот кусок кода локации ‘лживые кости’:
if раунд = 1 or раунд = 3 or раунд = 5:
gs 'лживые кости0'
end
и кусок кода ‘лживые кости0’:
gs '!бросок'
'Вы бросаете кубики...'
wait 2000
'Вы выкинули число <<ответ>>'
wait 1000
'Противник бросает кубики...'
act 'Солгать о выкинутом числе':
ложь = 1
правда = 0
gt $curloc
'Вы решили сблефовать.'
end
act 'Сказать правду':
правда = 1
ложь = 0
gt $curloc
'Вы решили не блефовать.'
end
end
Я не буду заострять внимание на лишнем операторе end в 22-й строке, перейдем к сути.
1. Раунд 1, из локации ‘лживые кости’ по условию вызывается выполнение подпрограммы - кода локации ‘лживые кости0’. Не переход туда, а именно просто исполнение кода - оператор gs.
2. Выполняется код ‘лживые кости0’, бросаются кубики, wait, отображаются два действия.
3. Игрок выбирает одно из 2-х действий. В любом из них есть оператор gt $curloc. В какой локации мы находимся? Это локация ‘лживые кости’!!!
4. Работает оператор gt $curloc, выполняется код локации ‘лживые кости’, переход к пункту 1.
Цикл без выхода.
Я не знаю правил игры и вашего алгоритма, поэтому исправить так легко, как в первом случае у меня не получится. Хотите помощи - облегчите мне работу - опишите правила игры и алгоритм который вы реализуете.
evp,
Ох, так, я поняла и разобралась. Теперь объясню все по порядку. Цель игры - угадать, блефует (врет) противник или нет. Всего шесть раундов. В трех из них угадывает игрок, он может рассмотреть противника, в зависимости от того, блефует ли нпс или нет, будут разные реакции. В других трех угадывает нпс, и тут уже воля рандома.
Победителем игры считается тот, кто победил в большем количестве раундов. Если побед равное количество (3:3), дается дополнительный раунд. Победитель забирает все ставки.
Итак, в данной версии я хотела реализовать механизм самой игры, чтобы нпс умел “блефовать” и “угадывать”. Сейчас я выложу исправленный и работающий код и все объясню. Пришлось, кстати, добавить две дополнительные локации.
Spoiler
!служебная локация "!бросок". К ней идет обращение, когда нужно перекидывание "кубиков".
кость1 = rand (1,6)
кость2 = rand (1,6)
ответ = кость1 + кость2
кость3 = rand (1,6)
кость4 = rand (1,6)
ответ2 = кость3 + кость4
!локация "стол"
!здесь все так, как вы показали.
if раунд > 6:
раунд = 0
gt $curloc
end
раунд = раунд + 1
if ставка = 0:
act 'Сделать ставку':
a = input 'Делайте ставку!'
if a > благосостояние:
'У вас нет столько денег!'
else
благосостояние = благосостояние - a
ставка = 1
cla
act 'Бросить кубики': gt 'лживые кости'
end
end
end
!локация "лживые кости"
!тут все тоже без изменений
if раунд = 1 or раунд = 3 or раунд = 5:
gs 'лживые кости0'
end
if раунд = 2 or раунд = 4 or раунд = 6:
gs 'лживые кости1'
end
!локация "лживые кости0
!тут выполняется код, если это нечетный раунд.
!спасибо, что сказали, я разобралась и вынесла часть кода в отдельную локацию
*p 'Раунд <<раунд>>
'
gs '!бросок'
'Вы бросаете кубики...'
wait 2000
'Вы выкинули число <<ответ>>'
wait 1000
act 'Солгать о выкинутом числе':
ложь = 1
правда = 0
gs 'лживые кости0_1'
end
act 'Сказать правду':
правда = 1
ложь = 0
gs 'лживые кости0_1'
end
!локация "лживые кости0_1
!тут выполняется вторая часть кода, если раунд нечетный. В нечетном раунде нпс угадывает, врет игрок или нет с помощью рандома
if ложь = 1:
'Вы решили сблефовать.'
else
'Вы решили не блефовать.'
end
cla
wait 1000
*p 'Противник думает...'
думает = rnd
if думает > 500 or думает = 500:
блеф = 1
неблеф = 0
*p '
Противник думает, что вы блефуете!'
else
блеф = 0
неблеф = 1
*p '
Противник думает, что вы говорите правду!'
wait 1000
end
if ложь = блеф and ложь = 1:
*p '
Вы проиграли. Противник раскусил вас!'
ставка = 0
правда = 0
ложь = 0
неблеф = 0
блеф = 0
act 'Еще разок!':
gt 'стол'
end
end
if ложь = неблеф and ложь = 1:
*p '
Вы открываете свои кубики ошарашенному противнику. Вы выиграли!'
благосостояние = благосостояние + a + a
ставка = 0
правда = 0
ложь = 0
неблеф = 0
блеф = 0
act 'Еще разок!':
gt 'стол'
end
end
if правда = блеф and правда = 1:
*p 'Вы открываете свои кубики ошарашенному противнику. Вы выиграли!'
благосостояние = благосостояние + a + a
ставка = 0
правда = 0
ложь = 0
неблеф = 0
блеф = 0
act 'Еще разок!':
gt 'стол'
end
end
if правда = неблеф and правда = 1:
*p 'Вы проиграли. Противник раскусил вас!'
правда = 0
ложь = 0
неблеф = 0
блеф = 0
ставка = 0
act 'Еще разок!':
gt 'стол'
end
end
!теперь четные раунды. Тут уже игрок должен угадать, врет противник или нет. Для этого была создана служебная локация "!противник", в которой рандомом задаются его описания, когда он врет или не врет.
!локация "!противник"
if блеф = 1:
лицо = rand (1,3)
if лицо = 1:
$лицо = 'Противник цепко следит за вами немигающим взглядом. Вы замечаете, как по лбу у него стекает капля пота.'
end
if лицо = 2:
$лицо = 'Противник утирает пот с верхней губы. Вы замечаете, что у него непроизвольно дернулся уголок рта.'
end
if лицо = 3:
$лицо = 'Противник чешет затылок. Вы замечаете, как он рефлкторно кусает губу.'
end
end
if неблеф = 1:
лицо = rand (1,3)
if лицо = 1:
$лицо = 'Противник смотрит на вас холодными глазами. Он не делает никаких лишних телодвижений.'
end
if лицо = 2:
$лицо = 'Противник отвел взгляд в сторону. Он сидит очень уверенно, словно не замечая вас.'
end
if лицо = 3:
$лицо = 'Противник задумчиво смотрит на свои кости. Лоб его гладок.'
end
end
!локация "лживые кости1". Ее я тоже разбила. Тут снова бросаются кости в служебной локе "!бросок", после чего определяется, будет нпс блефовать или нет.
*p 'Раунд <<раунд>>
'
gs '!бросок'
'Противник бросает кубики...'
грань1 = rand (1,6)
грань2 = rand (1,6)
врет = грань1 + грань2
говорит = rnd
if говорит > 500 or говорит = 500:
блеф = 1
неблеф = 0
gs 'лживые кости1_1'
else
блеф = 0
неблеф = 1
gs 'лживые кости1_1'
end
!локация "лживые кости1_1". Вторая часть.
if блеф = 1 and блеф1 = 0 and неблеф1 = 0:
*p '
Противник говорит число <<врет>>.'
end
if неблеф = 1 and блеф1 = 0 and неблеф1 = 0:
*p '
Противник говорит число <<ответ2>>.'
end
gs '!противник'
wait 1000
act 'Рассмотреть противника':
*p '
<<$лицо>>'
delact 'Рассмотреть противника'
end
act 'Вы решаете, что противник блефует':
блеф1 = 1
неблеф1 = 0
cla
gs 'лживые кости1_1'
wait 1000
end
act 'Вы решаете, что противник говорит правду':
блеф1 = 0
неблеф1 = 1
cla
gs 'лживые кости1_1'
wait 1000
end
if блеф1 = блеф and блеф1 = 1:
*p '
Противник меняется в лице. Вы выиграли!'
благосостояние = благосостояние + a + a
ставка = 0
неблеф1 = 0
блеф = 0
блеф1 = 0
неблеф = 0
cla
act 'Еще разок!':
gt 'стол'
end
end
if блеф1 = неблеф and блеф1 = 1:
*p '
Противник злорадно улыбается. Вы ошиблись, и этот раунд не за вами.'
ставка = 0
неблеф1 = 0
блеф = 0
блеф1 = 0
неблеф = 0
cla
act 'Еще разок!':
gt 'стол'
end
end
if неблеф1 = неблеф and неблеф1 = 1:
*p 'Противник меняется в лице. Вы выиграли!'
благосостояние = благосостояние + a + a
ставка = 0
неблеф1 = 0
блеф = 0
блеф1 = 0
неблеф = 0
cla
act 'Еще разок!':
gt 'стол'
end
end
if неблеф1 = блеф and неблеф1 = 1:
*p 'Противник злорадно улыбается. Вы ошиблись, и этот раунд не за вами.'
неблеф1 = 0
блеф = 0
блеф1 = 0
неблеф = 0
ставка = 0
cla
act 'Еще разок!':
gt 'стол'
end
end
Я все это подчистила, там в четных раундах дублировался кусок текста, это я тоже убрала. Собственно, в Пиратах Карибского моря игра эта сложнее, там больше игроков и больше костей. Я просто взяла принцип и упростила его. Код опробовала, вроде работает как надо Х))
P.S.: Да, и простите, что так долго не отвечала, ринулась исправлять, осенило Х)
Обычно я для переменных, которые будут принимать только булевы значения, заранее объявляю две константы:
false = 0
true = -1
Это не обязательно делать, просто потом легче читать понимать код.
Я это к тому, что у меня вопрос: зачем переменные блеф и неблеф? Не проще обойтись одной? Заодно легкочитаемые условия получатся, да и уследить за изменением значения одной переменной легче, чем двух:
bluff = true
if bluff:
!действия при блефовании
end
bluff = false
if no bluff:
!действия при отсутствии блефа
end
У вас часто поторяется код
ставка = 0
неблеф1 = 0
блеф = 0
блеф1 = 0
неблеф = 0
Имеет смысл при старте игры определить текстовую переменную
$resetLyingDice = {
ставка = 0
неблеф1 = 0
блеф = 0
блеф1 = 0
неблеф = 0
}
И по мере надобности вместо нескольких строчек кода писать лишь
dynamic $resetLyingDice
К примеру, вместо
if неблеф1 = блеф and неблеф1 = 1:
*p 'Противник злорадно улыбается. Вы ошиблись, и этот раунд не за вами.'
неблеф1 = 0
блеф = 0
блеф1 = 0
неблеф = 0
ставка = 0
cla
act 'Еще разок!':
gt 'стол'
end
end
Достаточно
if неблеф1 = блеф and неблеф1 = 1:
*p 'Противник злорадно улыбается. Вы ошиблись, и этот раунд не за вами.'
dynamic $resetLyingDice
cla
act 'Еще разок!':
gt 'стол'
end
end
evp,
хм, спасибо, исправлю, просто я к кодировании новичок, только вот с февраля начала QSP изучать и до dynamic еще не добралась)
переменные блеф и неблеф обозначают, блефует ли нпс, с которым игрок играет ил нет, для того, чтобы когда игрок рассматривал нпс, выводилась нужная строчка с описанием, вот)
я почитаю еще про dynamic, судя по всему, он способен неплохо упростить мне жизнь)
Lisichka:
переменные блеф и неблеф обозначают, блефует ли нпс, с которым игрок играет ил нет
Если это так, то достаточно одной переменной блеф.
!блеф может принимать всего два значения
!блеф = true или блеф = -1 или любому значению отличному от 0, но лучше придерживаться значения -1
!блеф = false или блеф = 0
if блеф:
!непись блефует
else
!непись говорит правду
end
if no блеф:
!непись говорит правду
else
!непись блефует
end
evp,
Спасибо, добавила dynamic, запомнила на будущее :)
Насчет переменных true и false - это действительно удобно, но если я сейчас их начну использовать, придется отследить и переписать и значения других переменных, например:
if ложь = блеф and ложь = 1:
*p '
Вы проиграли. Противник раскусил вас!'
dynamic $resetLyingDice
act 'Еще разок!':
gt 'стол'
end
end
придется переписывать значение переменной “ложь” и всех остальных, и не только в конкретном куске, а везде в мини-игре. Лучше я использую этот способ где-нибудь еще, он и правда удобен :)
еще убрала переменную “неблеф”, она не нужна.
Спасибо за помощь!