SlideShare a Scribd company logo
1 of 53
Проектирование игр:  функциональный подход Автор:  Кирилл Лебедев ,  компания  Evosquare [email_address] При участии:  С.В. Сычёва ,  Система «ТРИЗ-ШАНС» [email_address]
Содержание: ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Условия Пример "Аквариум" ,[object Object],[object Object],[object Object],[object Object],[object Object]
class  Противник { // и т.д. }; class  Скат :  public  Противник { // и т.д. }; class  Рак :  public  Противник { // и т.д. }; Пример "Аквариум"
Пример "Аквариум"
Пример "Аквариум"
Пример "Аквариум"
Пример "Аквариум"
Пример "Аквариум"
Пример "Аквариум" ,[object Object],[object Object],[object Object],[object Object]
Пример "Аквариум"
Пример "Аквариум"
Пример "Аквариум" ,[object Object],[object Object],[object Object],[object Object]
Пример "Аквариум"
Пример "Аквариум"
Пример "Аквариум" Противоречие " должно быть одно – и должно быть другое "   С одной стороны, класс необходимо поместить в одну ветвь иерархии, а с другой стороны – класс нужно поместить в другую, параллельную, ветвь иерархии.
Пример "Аквариум"
Пример "Аквариум" class  Модель; class  Роль; class  Передвижение; class  ИгровойОбъект { Модель * m_pМодель; Роль * m_pРоль; Передвижение * m_pПередвижение; };
Пример "Аквариум"
Объект или функция? Построение непротиворечивой иерархии  объектным  способом  невозможно
Альтернативы Объект или функция? Игровой Объект == набор функций Игровой Объект – точка в пространстве функций
Объект или функция? Смена парадигмы ,[object Object],[object Object],[object Object],[object Object]
Как создать конвейер? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Как создать конвейер? Ситуация ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Как создать конвейер? Шаг 1. Упорядочить действия ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Шаг 1. Упорядочить действия Пример 1 ,[object Object],[object Object],[object Object]
Шаг 1. Упорядочить действия Пример 2 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Как создать конвейер? Шаг 2. Избавиться от ветвлений ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Как создать конвейер? Шаг 2. Избавиться от ветвлений
Шаг 2. Избавиться от ветвлений Пример enum  ICriterious { eUseShield, eMakeTurn, eAvoidMine }; ICriterious iCriterious; switch  (iCriterious) { case  eUseShield:  UseShield();  break ; case  eMakeTurn:  Turn();  break ; case  eAvoidMine:  AvoidMine();  break ; } Увернуться Нет Близко Есть Включить щит Есть Близко Есть Объехать мину Не важно Далеко Есть Действие Критерий 3 "Наличие щита" Критерий 2 "Расстояние до мины" Критерий 1 "Наличие мины"
Как создать конвейер? Шаг 3. Избавиться от циклов ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Шаг 3. Избавиться от циклов Пример // Игровой цикл while  (bRun) { // ... // Код AI bool  bHasMine = FindMine(); if  (bHasMine) { float  fltDistanceToMine = GetDistanceToMine(); if  (fltDistanceToMine > DANGER_DISTANCE) { AvoidMine(); } // ... } // ... } ,[object Object],[object Object]
Шаг 3. Избавиться от циклов Пример ,[object Object],//  Игровой   цикл while  (bRun) { // ... //  Код  AI bool  bHasMine = FindMine(); if  (bHasMine) { float  fltDistanceToMine = GetDistanceToMine(); if  (fltDistanceToMine > DANGER_DISTANCE) { //  Раскрытие   функции  AvoidMine() MakeTrack(); while  (!bIsMineAvoided) { FollowTrack(); } } // ... } // ... }
Шаг 3. Избавиться от циклов Пример ,[object Object],// Игровой цикл while  (bRun) { // ... // Код AI bool  bHasMine = FindMine(); if  (bHasMine) { float  fltDistanceToMine = GetDistanceToMine(); if  (fltDistanceToMine > DANGER_DISTANCE) { MakeTrack(); FollowTrack(); } // ... } // ... }
Шаг 3. Избавиться от циклов Пример ,[object Object],[object Object],[object Object]
Как создать конвейер? Шаг 4. Сгруппировать элементарные операции ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Шаг 4. Сгруппировать операции Пример ,[object Object],[object Object],[object Object],[object Object],[object Object],Прокладка маршрута Перестроить траекторию Далеко Есть Увернуться  (свернуть с траектории) Нет Близко Есть Двигаться по траектории Нет Двигаться по траектории Далеко Есть Руление Двигаться по траектории Есть Близко Есть Защита Включить щит Есть Близко Есть Обязанность Действие Щит Расстояние Мина
Как создать конвейер? Упорядочить модули ,[object Object],[object Object]
Цепочка обязанностей ,[object Object],[object Object],[object Object]
Проблемы при расширении Цепочка обязанностей ,[object Object],[object Object],[object Object],Проблемы при расширении Цепочка обязанностей
Причина проблем Цепочка обязанностей ,[object Object],[object Object],[object Object],[object Object],[object Object],Причина проблем Цепочка обязанностей
Решение Цепочка обязанностей ,[object Object],[object Object],[object Object],[object Object],[object Object]
Выводы ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Статистика ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Объём документации Статистика 50 3 Итого: 36 2 Ридер 14 1 Компилятор Количество страниц Количество документов Название проекта
Объём кода Статистика 1378 3940 49 Итого: 646 1938 22 Ридер 732 2002 27 Компилятор Количество строк комментариев Количество строк кода Количество классов Модуль
Сроки Статистика Причина задержки  – возникновение непредвиденных задач при реализации стыка между картами 240 128 Итого: 56 16 Тестирование, отладка и оптимизация 84 16 Кодирование 84 80 Проектирование 16 16 Постановка задачи Время, реальное (ч) Время, прогноз (ч) Этап
Производительность Статистика 22  – 50 20 несколько тысяч Норма (п о данным  IBM ) 131 30 3940 База данных для роутинга Скорость разработки (строк кода в день) Время разработки (в днях) Объем  (в строках кода ) Проект
Качество Статистика ,[object Object],[object Object],[object Object],4,569 18 Общие данные 4,645 9 Ридер 4,496 9 Компилятор Количество внесенных ошибок на 1000 строк кода Количество внесенных ошибок Модуль
Качество Статистика Ошибки, оставшиеся в модуле до прохождения тестирования Качество Статистика 0.5 2 Общие данные 0.5 1 Ридер 0.5 1 Компилятор Количество ошибок до тестирования на 1000 строк кода Количество ошибок до тестирования Модуль
Литература по ТРИЗ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Литература по ТРИЗ в программировании ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Литература по программированию и проектированию ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Литература (остальное) ,[object Object],[object Object],[object Object]

More Related Content

Similar to КРИ 2008. Проектирование игр: функциональный подход

Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Глеб Тарасов
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
Andrey Karpov
 
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
lshevtsov
 
Selenium 2.0: обзор новых возможностей
Selenium 2.0: обзор новых возможностейSelenium 2.0: обзор новых возможностей
Selenium 2.0: обзор новых возможностей
Paul Stashevsky
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
Eduard Antsupov
 

Similar to КРИ 2008. Проектирование игр: функциональный подход (20)

Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
Метапрограммирование: строим конечный автомат. Сергей Федоров ➠ CoreHard Aut...
Метапрограммирование: строим конечный автомат. Сергей Федоров ➠  CoreHard Aut...Метапрограммирование: строим конечный автомат. Сергей Федоров ➠  CoreHard Aut...
Метапрограммирование: строим конечный автомат. Сергей Федоров ➠ CoreHard Aut...
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...Системное тестирование  приложений на Ruby on Rails с применением Rspec и Cap...
Системное тестирование приложений на Ruby on Rails с применением Rspec и Cap...
 
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Selenium 2.0: обзор новых возможностей
Selenium 2.0: обзор новых возможностейSelenium 2.0: обзор новых возможностей
Selenium 2.0: обзор новых возможностей
 
C# Web. Занятие 02.
C# Web. Занятие 02.C# Web. Занятие 02.
C# Web. Занятие 02.
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-C
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
Человекопонятные отчёты
Человекопонятные отчётыЧеловекопонятные отчёты
Человекопонятные отчёты
 

КРИ 2008. Проектирование игр: функциональный подход