RU 📌 Pinned

Как сделать?

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

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

придется переписывать значение переменной “ложь” и всех остальных, и не только в конкретном куске, а везде в мини-игре. Лучше я использую этот способ где-нибудь еще, он и правда удобен :)
еще убрала переменную “неблеф”, она не нужна.
Спасибо за помощь!

Log in or Register to post comments.