03.05 Git: трёхстороннее слияние; приложения с командной строкой
Трёхстороннее слияние
- Повторение: интерференция коммитов в git
diff3 и ему подобные
ручное вмешательство при merge или rebase (правка, коммит, continue) — или abort
- формат 3way diff файла
упражнение: merge интерферирующих веток, разрешение конфликтов
- Создайте и закоммитьте файл "snark.txt" с текстом, приведённым ниже на врезке
- Создайте и поместите в рабочую копию (git checkout -b) ветку "snark"
- Во второй строке замените "вокруг" на "кругом", сделайте коммит.
- Создайте и поместите в рабочую копию ветку "snark_alt", начинающуюся от коммита с первоначальным текстом.
- Во второй строке замените "Потрясавший" на "Ужасавший", в последней - "со страху сбивался" на "от ужаса сбился", сделайте коммит (один на оба изменения)
- Верните в рабочую копию ветку "snark"
- Сделайте merge ветки "snark_alt" на ветку "snark" (возникнет конфликт правок во второй строке); объедините вручную правки во второй строке - должно получиться "Ужасавший кругом всю округу". Обратите внимание, что изменение в последней строке не породило конфликта и не требует ручного объединения.
Врезка с текстом:
И Бобер, сам не свой, слушал бешеный вой, Потрясавший вокруг всю округу. А когда в третий раз вой всю душу потряс, Он вздрохнул и ахрюкнул с испугу. Он делил, отнимал, умножал, прибавлял. Тяжела оказалась работа. И опять, и опять начинал он считать, Но со страху сбивался со счета.
Использование mergetool (kdiff3 / [g]vimdiff / …)
упражнение: rebase интерферирующих веток c kdiff3 или gvimdiff
Создание приложения с командной строкой
проверить работоспособность
- Принципы разбора командной строки
в цикле ввести командную строку вида
число параметр1 параметр2 …
- Вывести соответствующий параметр, а если число отрицательное или больше, чем количество параметров, закончить цикл
- (повторение) принцип организации:
do_*()
complete_*()
- docstring-и
TODO пример do_()
Принцип работы complete_*()
TODO пример
- (повторение) принцип организации:
Задача_1: напишите программу, реализующую простейший multi-user dungeon
- имеется поле 10х10 клеток (по каждой оси нумерация с 0 по 9); рисовать поле и его наполнение - не нужно
- в каждой клетке может находиться 0 или более монстров, у каждого монстра есть имя и число очков здоровья (hp - hit points)
- по полю ходит игрок; попав на клетку с монстром, он может его атаковать, нанося урон (списывая очки здоровья)
- в начале игры игрок появляется в случайной клетке (0, 0)
- клетка с координатами (0, 0) находится в левом верхнем углу поля
- настройка поля и игровой процесс организованы при помощи командной строки (readline/shlex/cmd); должен поддерживаться следующий командный язык:
add monster name <имя монстра> hp <число очков здоровья> coords <X> <Y>
- добавить в клетку с заданными координатами монстра с заданным именем и числом очков здоровья
- если в этой клетке уже есть монстр с таким именем, его число очков здоровья меняется на новое
пример: add monster name Gnoll hp 23 coords 5 7
пример (чтобы работал shlex): add monster name "War Troll" hp 100 coords 4 2
show monsters
- вывести про каждого монстра на отдельной строке информацию: его имя, координаты, число очков здоровья
пример: War Troll at (4 2) hp 100
move <направление>
подвинуть игрока на одну клетку в заданном направлении (варианты: up, down, left, right), если это возможно с учетом границ поля; up, down - смещение по оси Y; left, right - по оси X
пример: move up
после подвижки (т.е. успешного изменения позиции) вывести информацию о новой позиции, например: player at 6 9; если подвижка невозможна, вывести: cannot move
если после подвижки игрок попал на клетку с монстром, вывести информацию о монстре (монстрах) в этой клетке, например: encountered: War Troll 57 hp, Lizardman 13 hp
attack <имя монстра>
- атаковать монстра с заданным именем, находящегося в той же клетке, где игрок
- атака списывает у монстра 10 очков здоровья; по результатам выводится сообщение:
если у монстра осталось положительное число очков здоровья: <имя монстра> lost 10 hp, now has <число> hp
если у монстра осталось 0 или менее очков здоровья (традиция допускает "уход в минус"), то: <имя монстра> dies
- монстр, у которого в результате атаки осталось 0 или менее очков здоровья, исчезает
если монстра с заданными именем нет в клетке с игроком, выводится сообщение: no <имя монстра> here
- автодополнение должно работать:
для основного имени команды (add, show и т.п.)
для направления в команде move
для имени монстра, находящегося в клетке с игроком - например, введя attack и нажимая TAB, пользователь может перебирать имена монстров в текущей клетке; при этом имена, содержащие пробелы, должны перебираться с экранированными пробелами