вторник, 15 сентября 2015 г.

Головоломка сделанная на макросах в Excel



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

Все макросы, которые задействованы в этом файле взяты в интернете, долго-долго проверялись и допиливались, чтобы предусмотреть почти все возможные варианты игры. Для того чтобы посадить человека в лодку, нужно дважды щелкнуть на ячейку, чтобы это заработало, пришлось искать в инете «Как запустить макрос при клике на ячейку» и после изучения нескольких советов добавил такой скрипт в исходный код листа (если кто не знает, то его вызвать можно щелкнув правой кнопкой снизу на названии рабочего листа)
Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = "$P$2" Or Target.Address = "$P$3" Then Макрос5
End Sub
В нем я расписал все ячейки по которым нужно будет кликать — конструкция сложная, уверен можно решить все это диапазонами ячеек, но чтобы не тратить время зря на поиск более изящного решения я сделал именно так. Самое сложное было сделать макрос «копирования значения ячейки в одну пустую ячейку» — перебрал много вариантов и пришел к такому довольно простому способу, который оказался очень универсальным
Sub Макрос5()
Selection.Copy Range("AA1")
Selection.Value = ""
Set nextCellInColumn = Cells(Rows.Count, 11).End(xlUp).Offset(1, 0)
nextCellInColumn.Value = Range("AA1").Value
Range("A9").Select
End Sub
В макросе выделенная ячейка сначала копируется в буфер АА1, затем «опустошается» (=»») и благодаря условному форматированию меняется ее цвет. Дальше идет проверка пустых ячеек в указанном столбце (номер 11 соответствует K). Потом копируется именно значение из буфера АА1 в свободную ячейку.
Всплывающие «сообщения» типа перегруза, или скушанного миссионера делаются простым копированием его из буферного листа. Такой макрос записывается самостоятельно средствами записи макросов Excel, сам проводишь  данную операцию, и потом просто делаешь вызов макроса при наступлении определенных условий, или по клику на кнопке (в данном случае Новая игра — это копирование первоначального поля из буферного листа на рабочий лист). Некоторые условия добавляются в исходный код листа, например
If Range(«J5»).Value = 0 And Range(«K1»).Value > 0 Then Утонул
Тут проверяются условия  чтобы человека не посадили в лодку, если она находится на другом берегу. В левом верхнем углу у лодки написана цифра 5 и если лодка стоит на другом берегу, тогда по адресу J5 будет ноль, а вторым условием проверяется оправили ли на это место человека, и если человека туда отправили а лодка на другом берегу, то он тонет, и запускается макрос Утонул, который копирует из буферного листа сообщение на рабочий лист. Так же и проверяется условие «Победы» — когда сумма всех человечков на левом берегу будет равна 33 (10 это число для людоедов, и когда их трое сумма 30, а 1 число для миссионеров, и их тоже должно быть трое) то запускается макрос «Победа»
Также был добавлен макрос, который проверяет чтобы пустая лодка не переплывала на другой берег, при нажатии на кнопку, например влево:
Sub влево()
If Range("J1").Value = 5 And Range("K1").Value = 0 Then
MsgBox "Пустая лодка не может плыть"
ElseIf Range("J1").Value = 5 And Range("K1").Value > 0 Then
Application.Run "Переправа"
Else
MsgBox "Лодка с другой стороны"
End If
End Sub
Тут всего лишь всплывает предупреждающее сообщение при невыполнении некоторых условий, а в случает если условия для переправы соблюдены, то запускается макрос переправы, который перерисовывает лодку и «человечков» в ней на другом берегу. Сейчас немного допилю файл чтобы человечков можно было ссаживать с лодки если их нечаянно туда посадили, исправлю сообщения, например вместо победы сделаю миссия выполнена, ведь там миссионеры же). После этого выложу файл, чтобы вы могли потестить как это работает. Спасибо за внимание)
PS вот и ссылка на файл Excel головоломку.
Много недочетов, как например неправильное выстраивание после разгрузки с лодки, и даже погрузиться могут неправильно после неправильной опять же разгрузки — косяков немало, но все же вариант вполне работоспособный уже 
Чуток подправил, сделал все всплывающие сообщения через Msgbox, и теперь тонуть люди не будут, потому что идет проверка на заполнение лодки.Убрал лишний лист, разместив буфер в конце листа, и скрыл его от посторонних глаз

Еще игры Excel можно найти на этой странице Ecel игры, или нажмите на тег excel, vba

Комментариев нет:

Отправить комментарий