Перейти к публикации
Форум - ComputerCraft
Zer0Galaxy

Игровой автомат «Однорукий бандит»

Рекомендованные сообщения

Доброго времени суток. Хочу рассказать вам, как можно в игре MineCraft построить игровой автомат на подобии всем известного «Однорукого бандита». Для тех кто подзабыл напомню принцип действия этого автомата http://ru.wikipedia.org/wiki/Слот-машина. Игрок делает ставку после чего запускает машину. Машина имеет три вращающихся барабана с нанесенными на них различными символами. Барабаны останавливаются в случайном положении и в зависимости от выпавших символов игрок либо проигрывает, либо получает свою ставку умноженную в несколько (иногда в сотни) раз.

 

Для постройки у вас должны быть установлены следующие моды: ComputerCraft(как же без него) с аддоном OpenCCSensors, BuildCraft и ProjectRed.

 

Построим вот такую конструкцию из золотого блока и шести золотых мониторов. На золотой блок установим кнопку.

post-6-14160783972457_thumb.png

С обратной стороны монитора установим компьютер (подойдет как золотой так и обычный) и соединим его с золотым блоком при помощи красного провода как показано на рисунке.

post-6-14160783974183_thumb.png

Чуть в сторонке от компьютера, по диагонали установите сундук.

post-6-14160783975016_thumb.png

Этот сундук будет использоваться для хранения предметов, на которые идет игра. Если играть вы планируете по крупному, то объём сундука должен быть как можно большим. Для этой цели подойдет алмазный сундук, ну или на худой конец – серебряный.

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Под правым нижним углом монитора установим обсидиановую трубу. В нее игрок будет вносить свою ставку.

post-6-14160783976022_thumb.png

Соединим обсидиановую трубу с сундуком золотой трубой. В самом конце поставим алмазную трубу, чтобы в сундук попадали только те предметы, на которые должна идти игра.

 

Теперь самое время определить, на что именно мы будем играть. Предположим, это будут железные слитки. Внимательно смотрим, какой конец алмазной трубы подсоединен к сундуку. Ага – серый. Заходим в настройки алмазной трубы и устанавливаем в серую ячейку железный слиток.

post-6-14160783976779_thumb.png

В сундук тоже нужно положить 20-30 стаков железных слитков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Теперь сделаем трубу, по которой слитки будут извлекаться из сундука, для выдачи игроку его выигрыша. Это должен быть, разумеется, отрезок деревянной трубы. Установим и настроим при помощи ключа отрезок железной трубы. Оставшуюся часть трубы сделаем из золота. Другой конец трубы выведем под левым нижним углом монитора как показано на рисунке.

post-6-14160783977422_thumb.png

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

post-6-14160783978181_thumb.png

Настроим пульсирующий гейт на управление редстоун-сигналом и выберем ему функцию – «EnergyPulser».

post-6-14160783979272_thumb.png

Нам осталось установить над компьютером сенсор. Сенсор нужен для того, чтобы компьютер мог контролировать количество предметов в сундуке. В сенсор нужно зарядить Inventory Sensor Card.

post-6-14160783980281_thumb.png

На этом аппаратная часть закончена. Приступаем к программированию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Заходим в терминал компьютера и выполняем команду pastebin get ihL5CTxd casino

 

Возможно, полученную программу придется чуть подкорректировать. Сначала определим координаты сундука относительно сенсора. Для этого выполним ocs/programs/sensorview

 

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

post-6-14160783980868_thumb.png

Запоминаем координаты сундука относительно сенсора. В случае на картинке это -1,-1,1.

 

Выходим из sensorview и открываем на редактирование файл casino. Находим в пятой строчке переменную ChestPos и присваиваем ей значение ‘-1,-1,1’

post-6-14160783981689_thumb.png

Сохраняем файл casino и запускаем его вот таким образом monitor right casino.

 

Если всё сделано правильно, на мониторе мы должны увидеть вот такую картину.

post-6-14160783982403_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как же работает эта машина?

 

Счастливой цифрой является, разумеется, семерка. В трубу справа от кнопки вносим ставку. Это должны быть железные слитки в количестве от 1 до 5. Таблица чисел вверху экрана белым цветом показывает сделанную ставку и возможный выигрыш в случае выпадения одной, двух или трех семерок.

 

Когда ставка принята, нажимаем кнопку. И вот теперь всё зависит от фортуны. Что же выпадет на баранах? Если нам повезло и среди выпавших цифр есть хотя бы одна семерка, получаем выигрыш из левой трубы.

 

Для завершения нам осталось создать файл startup с текстом shell.run(“monitor right casino”), перегрузить компьютер и сделать корпус из GoldBlockCover.

post-6-14160783982988_thumb.png

На этом можно было бы и закончить, но для тех, кто дружит с математикой, я хотел бы добавить еще вот что. В строке номер 100 файла casino можно найти табличку bonus={2,20,200}. Она содержит числа, которые определяют выигрыш игрока в случае выпадения одной, двух или трех семерок соответственно. Давайте подсчитаем матожидание выигрыша.

 

M=B1*P1+B2*P2+B3*P3

 

Где B1, B2, B3 – выигрыш в случае выпадения одной, двух или трех семерок;

 

P1, P2, P3 – вероятность соответствующего события.

 

Вероятность выпадения только одной семерки равна 0,243. Вероятность выпадения двух семерок – 0,027. Трех семерок – 0,001. Кто силен в комбинаторике, проверьте меня.

 

Таким образом, матожидание выигрыша равняется:

 

M=2*0,243+20*0,027+200*0,001=1,226

 

Что это значит? Это значит, что на тысячу принятых слитков автомат выдаст в качестве призов 1226. Согласитесь, для казино разорительно. И если вы, построив такой автомат, хотите сколотить на нем состояние то вам стоит подкорректировать табличку bonus.

 

Считайте ваши денежки и удачной вам игры!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

bonus={2,20,200}

M=B1*P1+B2*P2+B3*P3

Где B1, B2, B3 – выигрыш в случае выпадения одной, двух или трех семерок;

P1, P2, P3 – вероятность соответствующего события.

Вероятность выпадения только одной семерки равна 0,243. Вероятность выпадения двух семерок – 0,027. Трех семерок – 0,001. Кто силен в комбинаторике, проверьте меня.

 

Таким образом, матожидание выигрыша равняется: M=2*0,243+20*0,027+200*0,001=1,226

Что это значит? Это значит, что на тысячу принятых слитков автомат выдаст в качестве призов 1226.

 

Ой, Дмитрий! Чувствую, где-то подвох, не пойму пока где:). Играл, и разорился до нитки:D

У меня такое чувство,что М на 3 разделить что ли. А то получается, прибыльность 123%. Отбросим ничтожный вариант выпадения один из тысячи - где платят 200 кусочков(то есть на тысячу ставок по 1 кусочку железа в среднем выигрываем 200) Та же история и с двумя семерками.

 

На сотне семерка встречается 20 раз (19 раз по одной и раз в числе 77 две). Верю, что от 000 до 999 - 243 числа с одной семеркой, не помню уже формул комбинаторики, киньте формулу, пожалуйста. Ну так вот - за вероятность 0,243 выигрыш всего один к одному, как на красное-черное, где вероятность 0,5!:p Что-то не сходиться. Как по мне, строку бонуса увеличить надо ~ до 4, 37, 1000!

 

С каверами автоматик вообще конфетка, эстетично очень смотрится. Настроить бы у нас на сервере таких в казино, а рулетку по центру поставить!

 

P.S. Тема была перемещена в этот раздел, как готовый и оформленый проект. (Администрация форума)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

О вероятностях.

Вероятность выпадения семерки на отдельно взятом барабане - 0,1. Вероятность не выпадения - 0,9. Эти два факта, вроде, сомнений не вызывают.

Теперь какие возможны варианты выпадения семерок на трех барабанах?

1) Ни одной семерки не выпало. Это означает, что на первом барабане не выпало И на втором не выпало И на третьем не выпало. Поскольку независимые события собираются по "И" вероятности перемножаются. Т. е. имеем

P0=0,9*0,9*0,9=0,729

2) Только на одном барабане выпала семерка. Это означает, что на первом барабане выпала семерка И на втором не выпала И на третьем не выпала. А так же надо учесть варианты, когда семерка выпала на втором ИЛИ на третьем барабане. Там где независимые события собираются по "И" - вероятности умножаем, там где взаимоисключающие события собираются по "ИЛИ" - складываем:

P1=0,1*0,9*0,9+0,9*0,1*0,9+0,9*0,9*0,1=0,243

3) Семерки выпали на двух барабанах: рассуждения аналогичны п.2

P2=0,1*0,1*0,9+0,1*0,9*0,1+0,9*0,1*0,1=0,027

4) Выпали три семерки: P3=0,1*0,1*0,1=0,001

Эти четыре варианта исхода являются взаимоисключающими (т.е. возникновение двух из них одновременно невозможно) и взаимодополняющими (других вариантов нет), а значит сумма их вероятностей должна равняться единице. Проверяем

P=P0+P1+P2+P3=0,729+0,243+0,027+0,001=1

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за исчерпывающий ответ, по "теорверу" в универе 5-ка была, но почти 15 лет прошло, забывается все.:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если бы комбинаторика преподавалась повсюду на примере казино, то народ бы охотнее учился :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость romaha_7

Супер !:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хе хе, чувствую запах прибыли >:D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Убедитесь, что у Вас установлен аддон OpenCCSensors. Если установлен, опишите подробнее при выполнении какого действия какое именно сообщение выдается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ошибка выходит при выводе программы на монитор. Аддон есть. Все настроено по вашей схеме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выполните, пожалуйста, команду monitor right casino и поместите в эту тему скрины терминала компьютера и внешнего монитора

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Похоже, у нас разные версии OpenCCSensors. Выложи, пожалуйста, на под спойлер или на пастебин содержимое файла ocs/apis/sensor. Будем разбираться

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вопрос, как открыть этот файл?

edit ocs/apis/sensor

Или, если так не даст, то в два приема:

cd ocs/apis/
edit sensor

В сингле - просто открой папку с сейвом и найди каталог computer. Там все файлы внутри должны быть.

Изменено пользователем Totoro

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
edit ocs/apis/sensor
Или, если так не даст, то в два приема:

cd ocs/apis/
edit sensor
В сингле - просто открой папку с сейвом и найди каталог computer. Там все файлы внутри должны быть.

В CC системные файлы которые вшитые в мод, в сейве не отображаются.

Аддоны считаются тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, тогда придется открывать файл мода WinRAR'ом и искать там что-то вроде assets/lua.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно скопировать его командой copy ocs/apis/sensor /sensor а потом искать в папке computers

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Похоже, у нас разные версии OpenCCSensors. Выложи, пожалуйста, на под спойлер или на пастебин содержимое файла ocs/apis/sensor. Будем разбираться

local function waitForResponse( _id )
	while true do
		local event = {os.pullEvent()}
		if event[2] == _id then
			if event[1] == "ocs_success" then
				return event[3]
			elseif event[1] == "ocs_error" then
				return nil, event[3]
			end
		end
	end
end

function wrap(side)
	local wrappedTable = {}
	if peripheral.getType(side) == "sensor" then
		local periph = peripheral.wrap(side)
		for k,v in pairs(periph) do
			if type(k) == "string" and type(v) == "function" then
				wrappedTable[k] = function(...)
					local id = periph[k](...)
					if id == -1 then
						return false
					end
					return waitForResponse(id)
				end
			end
		end
		return wrappedTable
	else
		return nil, "not a sensor"
	end
end

function call(side, ...)
	if peripheral.getType(side) == "sensor" then
		local id = peripheral.call(side, ...)
		if id == -1 then
			return false
		end
		return waitForResponse(id)
	else
		return nil, "not a sensor"
	end
end

Это или нет ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Это или нет ?

 

Это. И файлы у нас одинаковые. Только почему-то он не подключается как API. Попробуй перенести его в корень диска и подключить оттуда. Во 2-й строке нужно будет написать 

os.loadAPI("sensor")
вместо
os.loadAPI("ocs/apis/sensor")

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Слушай, можешь дать свой скайп, я свяжусь с тобой, я мало что понимаю в моде, поэтому прошу помощи, однако этот файл я открыл в дирректории где майн лежит. В игре не получилось. Не допер как.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Слушай, можешь дать свой скайп, я свяжусь с тобой, я мало что понимаю в моде, поэтому прошу помощи, однако этот файл я открыл в дирректории где майн лежит. В игре не получилось. Не допер как.

Заходи в РК по будням

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×