Создание компьютерной игры "Эволюция"

Алгоритмическое представление и описание правил игры "Эволюция". Построение диаграммы прецедентов. Разработка графического интерфейса пользователя. Реализация интерфейса в среде Unity. Структура файла сохранения игры. Проектирование поведения компьютера.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 18.02.2017
Размер файла 3,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

В фазу развития бот может: с вероятностью 65% положить карту в виде свойства, с вероятностью в 30% положить карту в виде животного, или с вероятностью 5% пропустить ход. На рисунке 2.16 показан алгоритм действий бота в фазу развития. При выборе действия «Добавление свойства» система рассчитывает все возможные варианты, исходя из типа свойства, всех животных находящихся на столе и уже имеющихся у этих животных свойств, далее при помощи датчика случайных чисел выбирается один из этих вариантов. Если выбрано действие «Добавление свойства», но по какой-то причине оно не может быть добавлено - выбирается действие «Добавить животное».

В фазу питания бот может: с вероятностью 60% взять фишку еды из кормовой базы, с вероятностью 35% применить свойство, например использовать хищника, чтобы атаковать другое животное на игровом поле или с вероятностью 5% пропустить ход. На рисунке 2.17. показан алгоритм действий бота в фазу питания. Здесь также существует несколько вариантов: например, есть свойства, которые могут быть использованы совместно с взятием фишки еды из кормовой базы или с применением другого свойства, в данном случае алгоритм будет повторно проверять возможность использования свойств с тем условием, что ход уже сделан. Вероятность применить свойство, таким образом, равна 50%. Также учитывается правило: «Нельзя пропустить ход, если имеются фишки в кормовой базе или не накормленные животные на столе» в данном случае, действие «Пропустить ход» заменяется на действие «Взять фишку еды».

Рис. 2.16. Действие бота в фазу развития.

Рис. 2.17. Действие бота в фазу питания.

2.6 Выводы по главе

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

3. Разработка

3.1 Перемещение карт

Для того чтобы выкладывать карты на стол в виде животных и их свойств был выбран механизм Drag-and-Drop. Данный способ реализуется путём «захвата» (нажатием и удержанием левой кнопки мыши) отображаемого на экране объекта, программно доступного для подобной операции, и перемещении его в другое место (для изменения расположения) либо «бросания» его на другой элемент (для вызова соответствующего, предусмотренного программой, действия).

Для того чтобы игровой объект - карта получила возможность перемещаться по нажатию и удерживанию левой кнопки мыши. Был написан класс DraggableCard, который реализует интерфейсы: IBeginDragHandler, IDragHandler, IEndDragHandler (см. рис. 3.1.).

Рис. 3.1. Интерфейсы класса DraggableCard.

Данные интерфейсы содержат обработку следующих событий:

· OnBeginDrag - срабатывает при начале перемещения объекта (При нажатии и удерживании левой клавиши мыши).

· OnDrag - срабатывает в момент перемещения объекта.

· OnEndDrag - срабатывает в конце перемещения объекта (При отпускании левой клавиши мыши).

Данные события присутствуют в Unity по умолчанию. И принимают на вход объект класса PointerEventData хранящий информацию о положении курсора мыши на экране, области наведения и перемещаемом объекте [8].

В начале перемещения создается пустой элемент принимающий форму и размеры карты, необходимый для сохранения текущей позиции и возвращения карты в данную позицию, в случае если игрок отпустит её в недействующей области игрового поля, а также данный элемент необходим для сортировки карт. Подробная реализация обработчика OnBeginDrag с комментариями показана на рисунке 3.2.

Рис. 3.2. Обработчик события OnBeginDrag.

Ключевым моментом в реализации является то, что карта может перемещаться в 2х плоскостях: фронтальной области экрана (по координатам курсора) и по области игрового поля, которое расположено в 3D пространстве, расположение карты в обоих случаях показано на рисунках 3.3. и 3.4. Данный механизм реализован при помощи отслеживания положения курсора. Если карта выходит за пределы области блока родителя она перемещается в 3D пространство параллельно игровому полю и дальнейшие перемещение карты происходит в данной области. Координаты карты в данном случае рассчитываются путем преобразования координат курсора в луч и нахождения точки пересечения этого луча с игровым полем. Подробная реализация обработчика события OnDrag с комментариями показана на рисунке 3.5.

Рис. 3.3. Перемещение карты в рамках родительского блока.

Рис. 3.4. Перемещение карты в рамках родительского блока.

Рис. 3.5. Обработчик события OnBeginDrag.

При завершении перемещения карты происходит проверка области, в которой она находится в момент отпускания кнопки мыши. Если карта находилась в фронтальной области в рамках родительского блока, она примет положение пустого элемента - держателя, а данный элемент уничтожается. Если карта находится в игровом пространстве и была положена в виде животного или свойства, то произойдет удаление карты, иначе - произойдет возвращение карты обратно в родительский блок. Подробная реализация обработчика события OnEndDrag с комментариями показана на рисунке 3.6.

Рис. 3.6. Обработчик события OnEndDrag.

a.

3.2 Игровое поле игрока

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

Рис. 3.7. Область для размещения карты животного.

Для того чтобы отследить события перемещения карты на игровое поле был написан класс BoardDropZone, включающий в себя реализацию следующих интерфейсов: IPointerEnterHandler, IPointerExitHandler, IDropHandler (см. рис. 3.8.).

Рис. 3.8. Интерфейсы класса BoardDropZone.

Данные интерфейсы содержат обработку следующих событий:

· OnPointerEnter - срабатывает при наведении курсора на игровое поле. Служит для перехвата перемещения карты на игровое поля и отображения выделенной области, необходимой для размещения карты в виде животного.

· OnPointerExit - срабатывает при выводе курсора за игровое поле. Служит для перехвата перемещения карты за игровое поля и скрытия выделенной области.

· OnDrop - срабатывает при отпускании карты над игровым полем, но не над выделенной областью - выделенная область пропадает.

Данные события присутствуют в Unity по умолчанию. И принимают на вход объект класса PointerEventData хранящий информацию о положении курсора мыши на экране, области наведения и перемещаемом объекте. При инициализации событий OnPointerEnter, OnPointerExit и OnDrop проверяется условие, что объект инициализирующий данные события является картой и имеет имя Card2Prop - карта с двумя свойствами или Card1Prop - карта с одним свойством. Подробная реализация данных обработчиков представлена на рисунке 3.9.

Рис. 3.9. Реализация обработчиков событий OnPointerEnter, OnPointerExit и OnDrop.

Метод ShowNewAnimalPlaceholder добавляет одну (если нет животных на столе) или две (если есть животные на столе то с левого и правого края игрового поля) выделенные области на игровое поле и приписывает их на событие OnDrop, в случаи отпускания карты над одной из этих областей произойдет добавление нового животного. Класс добавления нового животного представлен на рисунке 3.10.

Рис. 3.10. Реализация метода AddAnimalToBoard класса BoardDropZone.

Также данный класс содержит метод GetAnimalById который позволяет получить игровой животное, находящиеся на столе, в виде игрового объекта по указанному ID. Функционал данного метода представлен на рисунке 3.11.

Рис. 3.11. Реализация метода GetAnimalById класса BoardDropZone.

3.3 Реализация алгоритма поведения компьютера

Для реализации логики компьютера был создан класс PlayerBot. Данный класс содержит метод MakeTurn, в который передается текущая фаза игры и при помощи датчика случайных чисел определяется действие, которое будет сделано компьютерным игроком. Данный метод подробно представлен на рисунке 3.12.

Рис. 3.12. Реализация метода MakeTurn класса PlayerBot.

Данный метод содержит в себе вызовы следующих методов:

· AddAnimal() - добавление нового животного на игровое поле.

· AddTrait() - добавление свойства животному на игровом поле.

· PassTurn() - пропуск хода.

· TakeFoodChip() - взять фишку еды из кормовой базы и накормить животное.

· UseTrait() - использовать доступные свойства животного.

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

3.4 Выводы по главе

Исходя из спроектированных моделей и графического интерфейса, игровая логика, полученная во второй главе, была реализована в виде программного кода. В данной главе приводится подробное описание механизма перемещения карт в пределах игрового поля. А также реализация класса игры отвечающего за размещения карт на игровом поле. Разработанные классы охватывают основную часть функционала игры. Кроме этого, в виде программного кода, был представлен алгоритм поведения игрока, управляемого компьютером.

3.5

Заключение

В результате выполнения работы цель - разработка компьютерной версии игры «Эволюция» была достигнута. Проведен анализ правил настольной игры «Эволюция» и на его основе построена диаграмма классов, описывающая игровую логику, спроектирован и разработан графический интерфейс пользователя. Используя, Visual Studio и игровой движок Unity, был написан программный код и реализована компьютерная версия игры.

Разработанная компьютерная игра «Эволюция» в значительной степени скрывает недостатки настольного аналога игры, тем самым дополняя её и сохраняя интерес аудитории.

Во-первых компьютерная игра гораздо удобней в использовании, она не требует дополнительного места и обязательной компании состоящей из 2х и более человек. Во-вторых - одиночный режим, дает возможность игрокам развивать свои навыки, играя против компьютера. В-третьих компьютерная игра более проста в хранении и занимает всего несколько мегабайт памяти на жестком диске. Таким образом эти преимущества позволяют сохранить популярность игры.

В дальнейшем предполагается разработать сетевой режим игры, а также дополнить её новыми элементами.

Библиографический список

1. Аналитический центр Юрия Левады [Электронный ресурс] Режим доступа http://www.levada.ru/ (дата обращения: 12.02.2016).

2. Введение в JSON [Электронный ресурс] Режим доступа http://www.json.org/json-ru.html (дата обращения: 15.05.2016).

3. Настольная игра «Эволюция» [Электронный ресурс] //URL:http://rightgames.ru/games/evolyuciya (дата обращения: 23.02.2016).

4. Официальная документация по Unity3D [Электронный ресурс] //URL:http://unity3d.com/support/documentation (дата обращения: 06.04.2016).

5. Официальное сообщество разработчиков на Unity3D [Электронный ресурс] //URL:http://unity3d.com/support/community (дата обращения: 26.04.2016).

6. Русское сообщество разработчиков на Unity3D [Электронный ресурс] //URL:http://forum.unity3d.com (дата обращения: 06.04.2016).

7. Создание проектов и схем моделирования UML [Электронный ресурс] //URL:https://msdn.microsoft.com/ru-ru/library/dd409445.aspx?f=255&MSPPError=-2147217396 (дата обращения: 16.03.2016).

8. Типовые примеры и решения при разработке приложений на Unity3D [Электронный ресурс] //URL:http://blogs.unity3d.ru (дата обращения: 01.05.2016).

9. Jeff Craighead, Jenny Burke, Robin Murphy. “Using the Unity Game Engine to Develop SARGE: A Case Study”. Proceedings of the 2008 Simulation Workshop at the International Conference on Intelligent Robots and Systems (IROS 2008). September 2008

10. “Introduction to the C# Language and the .NET Framework,” https://msdn.microsoft.com/en-us/library/z1zx9t92.aspx [Online]. Available: https://msdn.microsoft.com/en-us/library/z1zx9t92.aspx (дата обращения: 2.04.2016).

11. Joseph Hocking, Unity in Action: Multiplatform Game Development in C# with Unity 5 / Joseph Hocking. - M.: Manning, 2015. - 352 p.

12. S. Pasupathy, Dr. R. Bhavani, “An Efficient Methodology for Developing and Maintaining Consistent Software Using OOAD Tools,” in International Journal of Innovative Research in Science, Engineering and Technology, Vol. 4, Issue 2, February 2015.

Приложение A. Свойства базовой версии игры «Эволюция».

Таблица А.1. Название и описание свойств базового набора карт.

Название

Описание

ВОДОПЛАВАЮЩЕЕ

Животное может быть атаковано только хищником, имеющим свойство ВОДОПЛАВАЮЩЕЕ. Хищник со свойством ВОДОПЛАВАЮЩЕЕ не может атаковать животное без этого свойства.

БЫСТРОЕ

Когда ваше животное с этим свойством атаковано хищником, есть 50% вероятность, что оно не будет съедено хищником. Атаковавший хищник в этом раунде больше не может атаковать другое животное.

МИМИКРИЯ

Когда это животное атаковано хищником, владелец животного должен перенаправить атаку хищника на другое своё животное, которое этот хищник способен атаковать.

ПАДАЛЬЩИК

Когда съедено другое животное, животное с этим свойством получает дополнительную синюю фишку еды. Фишку может получить только одно животное на столе, начиная с животного игрока, которому принадлежит хищник и далее по часовой стрелке. Это свойство нельзя сыграть на животное со свойством хищник и наоборот.

СИМБИОЗ

Можно сыграть одновременно на пару животных. Одно из животных указывается в как “симбионт”. Другое животное не может быть атаковано хищником пока жив “симбионт”, но может получать фишки еды только если “симбионт” уже накормлен.

ПИРАТСТВО

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

ОТБРАСЫВАНИЕ ХВОСТА

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

ВЗАИМОДЕЙСТВИЕ

Сыграть одновременно на пару животных. Когда одно животное получает фишку еды из кормовой базы, другое получает также фишку еды из кормовой базы вне очереди.

ТОПОТУН

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

БОЛЬШОЙ

Данное животное может быть атаковано только хищником, имеющим свойство БОЛЬШОЙ.

СПЯЧКА

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

ЯДОВИТОЕ

Хищник, съевший это животное, в фазу вымирания текущего раунда погибает.

СОТРУДНИЧЕСТВО

Сыграть одновременно на пару животных. Когда одно животное получает любую фишку еды, второе сразу же получает дополнительную фишку еды.

НОРНОЕ

Когда животное накормлено, оно не может быть атаковано хищником.

КАМУФЛЯЖ

Животное может быть атаковано только хищником имеющим свойство ОСТРОЕ ЗРЕНИЕ

ОСТРОЕ ЗРЕНИЕ

Хищник, имеющий это свойство, может атаковать животное со свойством КАМУФЛЯЖ.

ХИЩНИК

Может быть использовано только один раз за раунд, в свою фазу питания. Хищник может атаковать одно любое незащищенное животное на столе и съев его получит две фишки дополнительной еды. Съеденное животное, все его свойства и относящиеся к нему парные свойства помещаются в сброс. ХИЩНИК не может атаковать других животных, если уже полностью накормлен и не имеет незаполненных свойств «Жиро- вой запас». Свойство ХИЩНИК может использоваться, даже если в кормовой базе уже не осталось фишек.

ЖИРОВОЙ ЗАПАС

На одно животное может быть сыграно несколько свойств ЖИРОВОЙ ЗАПАС. В любой момент игры, когда животное с таким свойством, будучи уже накормленным, может получить фишку еды, оно использует ее для заполнения «Жирового запаса». На каждую карту со свойством ЖИРОВОЙ ЗАПАС можно положить только одну желтую фишку еды. ЖИРОВОЙ ЗАПАС используется в свою фазу питания. Вместо получения красной фишки из кормовой базы игрок может преобразовать на одном из своих животных любое количество желтых фишек со свойством ЖИРОВОЙ ЗАПАС в синие фишки еды. Такое преобразование не является получением фишек еды и не связано с действием других свойств животного.

ПАРАЗИТ

Животному с этим свойством необходимо дополнительно две фишки еды, чтобы оно считалось накормленным.

Приложение Б. Алгоритмическое описание правил игры

Рис. Б.1. Подпроцесс «Инциализация».

Рис. Б.2. Подпроцесс «Фаза развития».

Рис. Б.3. Подпроцесс «Определение кормовой базы».

Рис. Б.4. Подпроцесс «Фаза питания». Часть 1.

Рис. Б.5. Подпроцесс «Фаза питания». Часть 2.

Рис. Б.6. Подпроцесс «Фаза вымирания».

Рис. Б.7. Подпроцесс «Положить карту».

Рис. Б.8. Подпроцесс «Взять фишку еды».

Рис. Б.9. Подпроцесс «Применить свойство».

Рис. Б.10. Подпроцесс «Завершение игры».

Приложение В. Исходный код алгоритма поведения компьютера

using UnityEngine;

using UnityEngine.UI;

using System.Collections.Generic;

public class PlayerBot : MonoBehaviour {

public delegate void AnimalAddedEvent();

public delegate void TraitAddedEvent();

public delegate void PassTurnEvent();

public delegate void AnimalFeedEvent();

public static event AnimalAddedEvent OnAnimalAdded;

public static event TraitAddedEvent OnTraitAdded;

public static event PassTurnEvent OnPassTurn;

public static event AnimalFeedEvent OnAnimalFeed;

Transform boardHolder;

Player player;

FoodHolder foodBase;

public GameObject animalPrefab;

public GameObject traitPrefab;

public GameObject linkPrefab;

public ColorsStack colors;

// Use this for initialization

void Start()

{

player = this.transform.GetComponent<Player>();

boardHolder = GameObject.Find("Player"+player.ID+"Board/Viewport/EnemyBoardHolder").transform;

foodBase = GameObject.Find("FoodBank").GetComponent<FoodHolder>();

colors = new ColorsStack();

}

public GameObject GetAnimalById(int ID)

{

foreach (Transform animalObj in boardHolder)

{

int AnimalID = System.Convert.ToInt32(animalObj.FindChild("AnimalID").GetComponent<Text>().text);

if (AnimalID == ID)

{

return animalObj.gameObject;

}

}

return null;

}

public void AddAnimal()

{

Card card = player.hand.GetRandomCard();

Animal anim = new Animal();

player.board.AddAnimal(anim);

GameObject animal = (GameObject)Instantiate(animalPrefab,boardHolder.position,boardHolder.rotation);

animal.transform.SetParent(boardHolder);

animal.transform.FindChild("AnimalID").GetComponent<Text>().text = anim.ID.ToString();

GameLog.AddGameLog("Добавил животное", player.playerName);

if (OnAnimalAdded != null) OnAnimalAdded();

}

public List<Animal> GetPossibleOptionsToFeedAnimal()

{

List<Animal> options = new List<Animal>();

List<Animal> animals = player.board.GetAllAnimals();

if (animals != null) // It will never be null

{

foreach (Animal animal in animals)

{

if (!animal.IsFed())

{

options.Add(animal);

}

}

}

return options;

}

public List<Animal> GetPossibleOptionsToAddPairTrait(Trait linkedTrait, Animal linkedAnimal)

{

List<Animal> options = new List<Animal>();

List<Animal> animals = player.board.GetAllAnimals();

if (animals != null) // It will never be null

{

foreach (Animal animal in animals)

{

if (animal.ID != linkedAnimal.ID)

{

bool CanBeLinked = true;

List<Trait> traits = animal.GetTraitList();

if(traits != null)

{

foreach (Trait tt in traits)

{

if (tt.Id == linkedTrait.Id)

{

if (tt.pairAnimal.ID == linkedAnimal.ID)

{

CanBeLinked = false;

}

}

}

}

if (CanBeLinked)

{

options.Add(animal);

}

}

}

}

return options;

}

public List<object[]> GetPossibleOptionsToAddTrait()

{

object[] parameters = new object[3];

List<object[]> options = new List<object[]>();

List<Animal> animals = player.board.GetAllAnimals();

List<Card> cards = player.hand.GetAllCards();

Trait trait = null;

bool canBeAdded;

foreach (Animal animal in animals)

{

foreach (Card card in cards)

{

if (card.PropertyB != null)

{

trait = new Trait(card.PropertyB,false);

canBeAdded = animal.CanGetTrait(trait);

if (canBeAdded)

{

parameters[0] = animal;

parameters[1] = card;

parameters[2] = trait;

options.Add(parameters);

}

trait = new Trait(card.PropertyA, false);

canBeAdded = animal.CanGetTrait(trait);

if (canBeAdded)

{

parameters[0] = animal;

parameters[1] = card;

parameters[2] = trait;

options.Add(parameters);

}

}

else

{

trait = new Trait(card.PropertyA, false);

canBeAdded = animal.CanGetTrait(trait);

if (canBeAdded)

{

parameters[0] = animal;

parameters[1] = card;

parameters[2] = trait;

options.Add(parameters);

}

}

}

}

return options;

}

public void AddTrait()

{

List<object[]> options = GetPossibleOptionsToAddTrait();

if (options.Count > 0)

{

int rndOption = Random.Range(0,options.Count);

Animal animal = (Animal)options[rndOption][0];

Card card = (Card)options[rndOption][1];

Trait trait = (Trait)options[rndOption][2];

if (trait.IsPair())

{

List<Animal> linkedAnimalOptions = GetPossibleOptionsToAddPairTrait(trait, animal);

if(linkedAnimalOptions.Count > 0)

{

Trait newtrait = new Trait(trait); // Create to get ID

int rndLinkedAnimalOption = Random.Range(0, linkedAnimalOptions.Count);

Animal linkedAnimal = linkedAnimalOptions[rndLinkedAnimalOption];

Trait linkedTrait = new Trait(trait);

GameObject animalOnBoard = null;

GameObject linkedAnimalOnBoard = null;

foreach (Transform animalObj in boardHolder)

{

int AnimalID = System.Convert.ToInt32(animalObj.FindChild("AnimalID").GetComponent<Text>().text);

if (AnimalID == animal.ID)

{

animalOnBoard = animalObj.gameObject;

}

if(AnimalID == linkedAnimal.ID)

{

linkedAnimalOnBoard = animalObj.gameObject;

}

}

Transform pairTrait = animalOnBoard.GetComponent<AnimalDropZone>().AddTraitToAnimal(newtrait);

Color32 color = colors.GetColor();

linkedAnimalOnBoard.GetComponent<AnimalDropZone>().AddTraitToAnimal(linkedTrait, pairTrait, color);

linkedTrait.pairAnimal = animal;

newtrait.pairAnimal = linkedAnimal;

if (newtrait.Id == "Symbiosis")

{

newtrait.isSymbiont = false;

linkedTrait.isSymbiont = true;

}

player.hand.RemoveCard(card);

player.board.RemoveAnimal(animal);

player.board.RemoveAnimal(linkedAnimal);

animal.AddTrait(newtrait);

linkedAnimal.AddTrait(linkedTrait);

player.board.AddAnimal(animal);

player.board.AddAnimal(linkedAnimal);

if (OnTraitAdded != null) OnTraitAdded();

}

else

{

AddAnimal();

}

}

else

{

Trait newtrait = new Trait(trait); // Create to get ID

player.hand.RemoveCard(card);

player.board.RemoveAnimal(animal);

animal.AddTrait(newtrait);

if (trait.IsFatReserve())

animal.countFatReserveCell++;

if (trait.Food > 0)

{

animal.countFoodCell += trait.Food;

animal.neededFood += trait.Food;

}

player.board.AddAnimal(animal);

GameObject animalOnBoard = null;

foreach (Transform animalObj in boardHolder)

{

int AnimalID = System.Convert.ToInt32(animalObj.FindChild("AnimalID").GetComponent<Text>().text);

if(AnimalID == animal.ID)

{

animalOnBoard = animalObj.gameObject;

break;

}

}

animalOnBoard.GetComponent<AnimalDropZone>().AddTraitToAnimal(newtrait);

if (OnTraitAdded != null) OnTraitAdded();

}

}

else

{

AddAnimal();

}

}

public void UseTrait()

{

TakeFoodChip();

}

public void TakeFoodChip()

{

if (foodBase.foodBankHoler.childCount > 0)

{

List<Animal> options = GetPossibleOptionsToFeedAnimal();

if (options.Count > 0)

{

int rndAnimalOption = Random.Range(0, options.Count);

Animal animal = options[rndAnimalOption];

FoodChip chip = new FoodChip(FoodColor.RED);

animal.Feed(chip, 1);

foodBase.GetFoodChip();

GameObject animalOnBoard = null;

foreach (Transform animalObj in boardHolder)

{

int AnimalID = System.Convert.ToInt32(animalObj.FindChild("AnimalID").GetComponent<Text>().text);

if (AnimalID == animal.ID)

{

animalOnBoard = animalObj.gameObject;

break;

}

}

animalOnBoard.GetComponent<AnimalDropZone>().CheckPairTrait(player, animal, null, null);

animalOnBoard.GetComponent<AnimalDropZone>().FeedAnimal();

if (OnAnimalFeed != null) OnAnimalFeed();

}

else

{

// Все животные накормлены

PassTurn();

}

}

else

{

// Нет фишек в кормовой базе

PassTurn();

}

}

public void PassTurn()

{

if (OnPassTurn != null) OnPassTurn();

}

public void MakeTurn(PhaseType phaseType)

{

switch(phaseType)

{

case PhaseType.DEVELOPMENT:

if(player.hand.GetCount != 0) // Если нет карт на руках

{

if(player.board.GetCount == 0) // Если нет животных на столе

{

AddAnimal();

}

else

{

/* Вероятность: 5% - пропустить ход, 30% - добавить животное, 65% - добавить свойство */

int rndAction = Random.Range(1, 101);

if(rndAction <= 65)

{

AddTrait();

}

else if(rndAction > 95)

{

PassTurn();

}

else

{

AddAnimal();

}

}

}

else

{

PassTurn();

}

break;

case PhaseType.FEEDING:

if (player.board.GetCount == 0) // Если нет животных на столе

{

PassTurn();

}

else

{

/* Вероятность: 5% - пропустить ход, 35% - использовать свойство, 60% - взять фишку еды */

int rndAction = Random.Range(1, 101);

if (rndAction <= 65)

{

TakeFoodChip();

}

else if (rndAction > 95)

{

if(foodBase.Size > 0 && !player.board.AllAnimalIsFed())

TakeFoodChip();

else

PassTurn();

}

else

{

UseTrait();

}

}

break;

}

}

}

Размещено на Allbest.ru


Подобные документы

  • Разработка компьютерной игры "Эволюция" с помощью игрового движка Unit. Сравнение критериев игры-аналога и разрабатываемой игры. Разработка графического интерфейса пользователя. Настройки камеры в редакторе Unity. Структура файла сохранения игры.

    дипломная работа [3,6 M], добавлен 11.02.2017

  • Исследование базовых концепций программирования приложений под операционную систему Windows. Изучение истории создания универсального языка программирования Си. Разработка графического пользовательского интерфейса. Обзор правил игры и алгоритма работы.

    курсовая работа [58,2 K], добавлен 09.11.2012

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

    дипломная работа [2,7 M], добавлен 27.10.2017

  • История развития языка программирования Java. История тетриса - культовой компьютерной игры, изобретённой в СССР. Правила проведения игры, особенности начисления очков. Создание интерфейса программы, ее реализация в среде Java, кодирование, тестирование.

    курсовая работа [168,1 K], добавлен 27.09.2013

  • Особенности создания ряда игровых приложений, логической игры. Программное обеспечение простейшего калькулятора, генератора функций. Разработка элементов интерфейса простейшего графического редактора, электронной записной книжки, текстового редактора.

    методичка [788,7 K], добавлен 24.10.2012

  • Описание алгоритма хода ЭВМ в режиме "пользователь-компьютер" в игре "Морской бой". Описание совокупности классов, их полей и методов. Разработка интерфейса и руководства пользователя по проведению игры. Листинг программы, написанной на языке Java.

    курсовая работа [645,0 K], добавлен 26.03.2014

  • Исследование общих правил игры в шашки, инструкции пользователя и программиста. Характеристика основных алгоритмов, исполняющих задачи класса Life Widget. Оценка ходов компьютера и человека. Построение дерева поиска лучшего хода исходя из оценки функций.

    контрольная работа [1,3 M], добавлен 20.12.2012

  • Обоснование необходимости разработки программы для игры "Тетрис". Математическая и графическая части алгоритма. Выбор языка и среды программирования. Отладка текста программы, разработка интерфейса пользователя. Тестирование, руководство пользователя.

    курсовая работа [1,5 M], добавлен 17.01.2011

  • Особенности программирования аркадных игр в среде Python. Краткая характеристика языка программирования Python, его особенности и синтаксис. Описание компьютерной игры "Танчики" - правила игры, пояснение ключевых строк кода. Демонстрация работы программы.

    курсовая работа [160,3 K], добавлен 03.12.2014

  • Исследование спецификации логической игры "Сапёр". Системное и функциональное проектирование приложения. Разработка программных модулей. Обзор классов, необходимых для создания интерфейса данного приложения. Инструменты для реализации логической игры.

    курсовая работа [1,2 M], добавлен 13.01.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.