44447

Разработка компьютерной игры «ПАКМАН»

Курсовая

Информатика, кибернетика и программирование

Задачей этого курсового проекта является написание компьютерной игры «пакман». Основой задачей в игре является создание колобка, который будет поедать жёлтые шарики на игровом поле. Управление в игре производится с помощью клавиатуры, это позволяет изменять направление движения колобка

Русский

2013-11-12

1.08 MB

250 чел.

Государственное образовательное учреждение

высшего профессионального образования

«Московский государственный технический университет

имени Н.Э. Баумана»

Калужский филиал

кафедра

«Систем автоматизированного проектирования»

Пояснительная записка

к курсовому проекту

по дисциплине:

«Программирование на языке высокого уровня»

Разработка игры «ПАКМАН»

Выполнил:

Сейдумеров Р.Э.

САПР-31

Проверил:

Музыка П.А.

Калуга 2011


Оглавление

[1]
Оглавление

[2] ВВЕДЕНИЕ

[3]
Исследовательская часть

[4] 1.1 Постановка задачи

[5] 1.2  Выбор языка программирования

[6]
ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ

[7] 2.1 Системные требования.

[8] 2.2 Инструкция пользования

[9]
Заключение

[10] СПИСОК ЛИТЕРАТУРЫ

ВВЕДЕНИЕ

Темой данного курсового проекта является разработка компьютерной игры «ПАКМАН». При написании данной программы будет использован такой язык программирования как C# и платформы Microsoft .NET.  Данное приложение является компьютерной игрой, в которую можно поиграть на досуге.

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

  1.  
    Исследовательская часть

1.1 Постановка задачи

Задачей этого курсового проекта является написание  компьютерной игры «пакман». Основой задачей в игре является создание колобка, который будет поедать жёлтые шарики на игровом поле. Управление в игре производится с помощью клавиатуры, это позволяет изменять направление движения колобка.

Кроме этого, в данной игре надо было реализовать вражеских сущностей, которые мешают пакману «спокойно жить».

1.2  Выбор языка программирования

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

1.  Характера самой задачи и технических требований;

2. Наработанного инструментария и имеющихся для данной среды библиотек;

3.  Имеющихся в языке и среде программирования инструментальных средств.

По набору понятий языки прежде всего подразделяются на высоко- и низкоуровневые. Первые предоставляют высокий уровень абстракции от оборудования, вторые - низкий, приближенный к машинному.

С точки зрения того, внесены ли в набор понятий особые, специфичные для предметной области объекты, языки делятся на универсальные (процедурные) и специализированные. К последним можно отнести Prolog, Lisp. Универсальные языки позволяют реализовать любой алгоритм, пользуясь стандартным набором конструкций. Благодаря этому, код на таком языке может быть достаточно легко перенесен из одного процедурного языка в другой при помощи консервативных изменений.

Ниже приведены основные концепции, внесенные в те или иные общеупотребительные языки и связанные с ними понятия: - Типизация/структуры данных.  Любой язык характеризуется набором «базовых типов», возможностями по пополнению этого набора при помощи ряда «конструкторов»: массив, запись (структура), объединение. В некоторых языках имеется универсальный тип (Variant в Delphi и Visual Basic), свободно используемый как любой из базовых типов. Степень контроля типов может быть очень разной - от полного отсутствия до крайне жесткого. Важно наличие (возможно, в виде библиотеки) структур данных переменной длины, например, динамических массивов.  Подпрограммы и вызовы. Различия в языках сводятся к способам определения процедур и функций, вариантам передачи параметров, возможностям определения рекурсивных процедур и наличию процедурного типа данных.  Типы памяти Наличие и широкая классификация типов памяти дает возможность эффективно управлять ее распределением, но и вносит сложность, требующую от программиста более внимательного отношения. Обычно выделяют (максимальный спектр): регистры, глобальные, локальные и динамические переменные.  Модули Наличие средств логического объединения группы процедур/функций/переменных позволяет работать с большими проектами, упрощая их структуру. Важное свойство - возможность описания процедур инициации и завершения модуля. - Объектный подход Объединение структур и методов их обработки («инкапсуляция») создает значительные удобства при программировании. Возможность «наследования» позволяет привести в систему набор структур. Автоматически вызываемые конструкторы и деструкторы упрощают отслеживание взаимосвязей. Все это составляет удобный инструмент для описания понятий и действий прикладной программы. - Переносимость - независимость от аппаратуры, реализуемая при помощи семантики, не зависящей от конкретной машины и внесением в язык ряда специфичных понятий - таких как базовый тип с нефиксированным размером (int в C).

С точки зрения эффективности, важно как исполняется программа - последовательной интерпретацией исходного текста (интерпретатор) либо непосредственным исполнением готового кода (компилятор). Интерпретатор целесообразно использовать лишь в случае когда скорость интерпретации не сильно сказывается на эффективности программы. Кроме интерпретации и компиляции возможны промежуточные варианты с генерацией псевдокода, который отличается от исходного текста высокой скоростью интерпретации либо другими полезными свойствами (например, возможностью исполнения на машинах различной архитектуры - как Java).

Ниже рассмотрены популярные языки и программные среды с точки зрения приспособленности под различные классы задач.

BASIC (Beginner's All-purpose Symbolic Instruction Code) Рожденный в 60-е годы в Америке (столь любящей простые решения), Бейсик был задуман как простой язык для быстрого освоения. Бейсик стал фактическим стандартом для МикроЭВМ именно благодаря своей простоте как в освоении так и в реализации. Однако для достижения этого качества был принят ряд решений (отсутствие типизации, нумерация строк и неструктурное GOTO, и др.), негативно сказывающихся на стиле изучающих программирование. Кроме того, недостаток выразительных средств привел к появлению огромного количества диалектов языка, не совместимых между собой. Современные, специализированные версии Бейсика (такие как Visual Basic) несмотря на приобретенную "структурность" обладают все теми же недостатками, прежде всего - небрежностью по отношению к типам и описаниям. Пригоден для использования на начальном этапе обучения, как средство автоматизации (в случаях когда он встроен в соответствующие системы) либо как средство для быстрого создания приложений.

Pascal Разработанный известным теоретиком Н.Виртом на основе идей Алгола-68, Паскаль предназначался прежде всего для обучения программированию. Построенный по принципу "необходимо и достаточно", он располагает строгим контролем типов, конструкциями для описания произвольных структур данных, небольшим, но достаточным набором операторов структурного программирования. К сожалению, обратной стороной простоты и строгости является громоздкость описаний конструкций языка. Наиболее известная реализация - Turbo/Borland Pascal - несмотря на отличия от стандарта Паскаля, представляет из себя среду и набор библиотек, сделавшие из учебного языка промышленную систему для разработки программ в среде MS-DOS.

Assembler Это ярчайший представитель языков «низкого уровня», набор понятий которого основан на аппаратной реализации. Это средство автоматизации для программирования непосредственно в кодах процессора. Машинные команды описываются в виде мнемонических операций, что позволяет добиться достаточно высокой модифицируемости кода. Поскольку набор команд на разных процессорах различен, то и о совместимости говорить не приходится. Использование ассемблера целесообразно в случаях, когда необходимо напрямую взаимодействовать с оборудованием, либо получить большую эффективность для некоторой части программы за счет более высокого контроля над генерацией кода.

C и C++ В основе языка C - требования системного программиста: полный и эффективный доступ ко всем ресурсам компьютера, средства программирования высокого уровня, переносимость программ между различными платформами и операционными системами. С++, сохраняя совместимость с C, вносит возможности объектно-ориентированного программирования, выражая идею класса (объекта) как определяемого пользователем типа. Благодаря перечисленным качествам, C/C++ занял позицию универсального языка для любых задач. Но его применение может стать неэффективным там, где требуется получить готовый к употреблению результат в кратчайшие сроки, либо там, где невыгодным становится сам процедурный подход.

C# —объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как основной язык разработки приложений для платформы Microsoft .NET. C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к С++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML. Переняв многое от своих предшественников — языков С++, Java, Delphi, Модула и Smalltalk — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем: так, C# не поддерживает множественное наследование классов (в отличие от C++).

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

  1.  Конструкторская часть

Для создания данного приложения понадобилось использовать шаблон MVC.  В приложении придется отображать и изменять данные то, то для этого нужно, создать несколько классов, в которых будет реализована модель MVC. Были созданы три основных класса, которые отвечают за контроль, отображение и логику игры. За контроль отвечает класс – Controller_MainForm. За отображение отвечает класс –View. Логика приложения реализована в классе GameLogic.

За изменение направление движения пакмана будет отвечать, такое событие как KeyDown. Событие будет отслеживать нажатие пользователем клавишей A, D, W, S, которое будет изменять направление движения колобка. Для этого был создан специальный класс, в котором происходит смена статуса движения.

Листинг 1. Класс где перечислены направления движения

enum MoveDirections //Направления движения

   {

       Right = 1,

       Left = 2,

       Up = 3,

       Down = 4,

   }

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

Листинг 2. Класс Pacman

class Pacman

   {

       public Bitmap img = Properties.Resources.Pacman_Rgh;

       public Bitmap[] img_mass_Right = { Properties.Resources.Pacman_Rgh,

                                        Properties.Resources.Pacman_Rgh1,

                                        Properties.Resources.Pacman_Rgh2,

                                        Properties.Resources.Pacman_Rgh3,

                                        Properties.Resources.Pacman_Rgh4,

                                        Properties.Resources.Pacman_Rgh5,

                                        Properties.Resources.Pacman_Rgh6,

                                        Properties.Resources.Pacman_Rgh7

                                        };

     

       public Point Location = new Point(200, 150);

   }

Создано перечисление, которое отвечает за статусы игры. Это позволяет переключать статус в логике игры.

Листинг 3. Класс GameStatus

enum GameStatus

   {

       playing,

       stoping,

       loozer,

       winner

   }

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

Листинг 4. Класс Enemy

class Enemy

   {

       public Bitmap Enemy1 = Properties.Resources.Enemy;

       public Bitmap Enemy2 = Properties.Resources.Enemy_2;

       public Bitmap Enemy3 = Properties.Resources.Enemy_3;

       

       public Point LocationEnemy1 = new Point(200, 25);

       public Point LocationEnemy2 = new Point(50, 250);

       public Point LocationEnemy3 = new Point(350, 250);

       public MoveDirections CurrentDirection_enemy = MoveDirections.Right;

       public MoveDirections NextDirection_enemy = MoveDirections.Right;

   }

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

Листинг 5. Класc View

partial class View : UserControl

   {

       GameLogic gameLogic;

public View(GameLogic gameLogic)

        {

           InitializeComponent();

           this.gameLogic = gameLogic;

           

           gameLogic.RedrawNeeded += new GameLogic.RedrawNeededEventHandler(model_RedrawNeeded);

           gameLogic.SharikRemoved += new GameLogic.SharikRemovedEventHandler(model_SharikRemoved);

           gameLogic.New_game += new GameLogic.New_Game(NewGame_Shariki);

           InitializeLabels();

       }

}

 Самым важным классом приложения, является класс, где реализована вся логика игры – это класс GameLogic. Исходный код данного класса приведен в приложении 1.

Созданы методы, которые отвечают за движение колобка, вражеских сущностей.

Листинг 7. Метод Run

private void Run()

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

Листинг 8. Метод NewGame

internal void NewGame()

       {

           pacman = new Pacman();

           sound_Start = new SoundPlayer(Properties.Resources.start_song);

           if (status_sound)

           {

               sound_Start.Load();

               sound_Start.Play();

           }

           

           gameStatus = GameStatus.stoping;

           Shariki = new List<Point>();

           for (int i = 0; i < 13; i++)

           {

               for (int j = 0; j < 17; j++)

               {

                   if (pole_mass[i, j] == 0)

                   {

                       Shariki.Add(new Point(j * 25, i * 25));

                   }

               }

           }

           OnNew_game();

           timer.Interval = 1;

           timer.Elapsed -= new System.Timers.ElapsedEventHandler(timer_Elapsed);

           timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);

           enemy = new Enemy();

           enemy_2 = new Enemy();

           enemy_3 = new Enemy();

           rnd = new Random(DateTime.Now.Millisecond);

            Walls = new List<Point>();

           for (int i = 0; i < 13; i++)

           {

               for (int j = 0; j < 17; j++)

               {

                   if (pole_mass[i, j] == 1)

                   {

                       Walls.Add(new Point(j * 25, i * 25));

                   }

               }

           }

           Shariki_New = new List<Point>();

       }

   }

  1.  
    ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ

2.1 Системные требования.

       Данное приложение разработано в среде выполнения .NET Framework 3.5. Поэтому на компьютере пользователя должна быть установлена такая же среда выполнения. По умолчанию она идет в таких Windows как Windows 7, Windows Server 2008 R2.

Системные требования для установки Microsoft .NET Framework 3.5

  •  Поддерживаемые операционные системы: Windows Server 2003; Windows Server 2008; Windows Vista; Windows XP

  •  Процессор: Pentium с тактовой частотой 400 MГц или аналогичный процессор (рекомендуется Pentium с тактовой частотой 1ГГц или аналогичный процессор)

  •  ОЗУ: не менее 96 МБ (рекомендуется 256 МБ)

  •  Жесткий диск: может потребоваться до 500 МБ доступного дискового пространства

  •  Дисковод для компакт-дисков или DVD-дисков: не требуется

  •  Экран: разрешение 800x600, 256 цветов (рекомендуется разрешение 1024x768, 32-разрядный)

 2.2 Инструкция пользования

Приложение открывается двойным щелчком по иконке программы. После запуска программы загружается основное окно программы (Рисунок – 1)

Рисунок  1 – Стартовая картинка

Далее нажав кнопку «Начать игру» происходит смена картинки, где визуализировано игровое поле:

Рисунок 2 – Игровое поле приложения

Теперь пользователь может поиграть в игру нажав кнопку «Play». После этого происходит запуск игры, начинается движение вражеских сущностей. Движение колобка, происходит с помощью кнопок на клавиатуре пользователем.  Основная задача пользователя, играя игру, собрать все шарики на игровом поле, при этом не пересекаясь с врагами, которые двигаются произвольно, мешая пакману победить.

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

                         

        Рисунок 3 – Меню «игра»                     Рисунок 4 – Меню «Настройки»


Заключение

        При разработке игрового приложения были  реализованы следующие задачи:

  •  Удобный интерфейс
  •  Возможность осуществлять управление движения колобка с помощью клавиатуры
  •  Осуществление анимации колобка
  •  Создание вражеских сущностей, которые двигаются произвольно
  •  Добавление звуковых эффектов в игре
  •  Поедание пакманом шариков на игровом поле
  •  «Прозрачные стены» для игрового поля – т.е. когда сущность подходит к границе поля, она не отходит в сторону, а выходит с противоположной стороны поля.
  •  Объекты при движении смещаются на пиксель для создания эффекта

плавного перемещения.

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

СПИСОК ЛИТЕРАТУРЫ

1. Фролов А. В., Фролов Г. В. Язык C#. Самоучитель – M.: ДИАЛОГ-МИФИ, 2003. – 560 с.

 2. Лабор В.В. Си Шарп: создание приложений для Windows – Мн.: Харвест, 2003. – 384 с.

3. Разработка Windows-приложений на Microsoft Visual Basic и Microsoft Visual C# 2003 /Пер. с англ. – M.: Издательско-торговый дом <Русская Редакция>, 2003. – 512 с.

4. Коннолли Томас, Бегг Карелин. Базы данных. Проектирование, реализация и сопровождение. Теория и практика. 3-е издание. : Пер. с англ. — М. : Издательский дом "Вильяме", 2003. — 1440 с. : ил. — Парал. тит. англ.


Приложение 1. Исходный код класса
GameLogic

class GameLogic

   {

       int sizeField;

       int kol_vo_vragov;

       int kol_vo_aple;

       public int gameSpeed;

       public bool status_sound = true;

       SoundPlayer sound_Start;

       SoundPlayer sound_eate;

       SoundPlayer sound_Loozer;

       SoundPlayer sound_Winner;

       public bool newgame = false;

       public bool Win = false;

       Random rnd = null;

       int value_Animation = 0;

       

       public GameStatus gameStatus;

       public Pacman pacman;

       public Enemy enemy;

       public Enemy enemy_2;

       public Enemy enemy_3;

       public double GameSpeed = 1;

       public System.Timers.Timer timer = new System.Timers.Timer();

       public List<Point> Walls = null;

       public int[,] pole_mass = {

                                 {1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1},

                                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

                                 {-1,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,-1},

                                 {1,0,1,1,0,0,0,0,1,0,0,0,0,1,1,0,1},

                                 {1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},

                                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

                                 {1,0,1,1,1,0,0,0,-1,0,0,0,1,1,1,0,1},

                                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

                                 {1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},

                                 {1,0,1,1,0,0,0,0,1,0,0,0,0,1,1,0,1},

                                 {-1,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,-1},

                                 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

                                 {1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1}

                                 };

       public List<Point> Shariki = null;

       public List<Point> Shariki_New = null;

       public GameLogic(int sizeField, int kol_vo_vragov, int kol_vo_aple, int gamespeed)

       {

           this.sizeField = sizeField;

           this.kol_vo_vragov = kol_vo_vragov;

           this.kol_vo_aple = kol_vo_aple;

           this.gameSpeed = gamespeed;

           Shariki_New = new List<Point>();

           NewGame();

       }

       public void Play() // Запуск игры

       {

           timer.Start();

       }

       void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

       {

           timer.Stop();

           sound_eate = new SoundPlayer(Properties.Resources.Eat);

           sound_Loozer = new SoundPlayer(Properties.Resources.Loozer_sound);

           sound_Winner = new SoundPlayer(Properties.Resources.Winner_sound);

           switch (gameStatus)

           {

               case GameStatus.playing:

                   Run();

                   rnd_RunEmemy();

                   rnd_RunEnemy_2();

                   rnd_RunEnemy_3();

                   

                   OnRedrawNeeded();

                   timer.Start();

                   break;

               case GameStatus.stoping:

                   break;

               case GameStatus.loozer:

                   if (status_sound)

                   {

                       sound_Loozer.Load();

                       sound_Loozer.Play();

                   }

                   System.Windows.Forms.MessageBox.Show("Вы проиграли!!!");

                   stop_all_run();

                   

                   break;

               case GameStatus.winner:

                   if (status_sound)

                   {

                       sound_Winner.Load();

                       sound_Winner.Play();

                   }

                   System.Windows.Forms.MessageBox.Show("Вы выиграли!!!");

                   stop_all_run();

                   break;

               

               default:

                   break;

           }

          

       }

       private void rnd_RunEmemy()

       {

           rnd_Direction(enemy);

           enemy.LocationEnemy1 = RunEnemy(enemy, enemy.LocationEnemy1);

       }

       private void rnd_RunEnemy_2()

       {

           rnd_Direction(enemy_2);

           enemy_2.LocationEnemy2 = RunEnemy(enemy_2, enemy_2.LocationEnemy2);

       }

       private void rnd_RunEnemy_3()

       {

           rnd_Direction(enemy_3);

           enemy_3.LocationEnemy3 = RunEnemy(enemy_3, enemy_3.LocationEnemy3);

       }

       public delegate void RedrawNeededEventHandler();

       public event RedrawNeededEventHandler RedrawNeeded;

       private void OnRedrawNeeded()

       {

           if (RedrawNeeded != null)

           {

               RedrawNeeded();

           }

       }

       private Point zerkl_otbr(Point Location)

       {

           if (Location.X >= 400)

           {

               Location.X = 0;

           }

           if (Location.Y >= 300)

           {

               Location.Y = 0;

           }

           if (Location.X < 0)

           {

               Location.X = 400;

           }

           if (Location.Y < 0)

           {

               Location.Y = 300;

           }

           return new Point(Location.X, Location.Y);

       }

       private void Run()

       {

           #region проверем надо ли повернуть

           switch (pacman.NextDirection)

           {

               case MoveDirections.Right:

                   {

                       if (pacman.Location.Y % 25 == 0)

                       {

                           if (Walls.Contains(new Point(pacman.Location.X + 25, pacman.Location.Y)))

                           {

                               pacman.CurrentDirection = MoveDirections.Stop_X_plus;

                           }

                           else

                           {

                               pacman.CurrentDirection = pacman.NextDirection;

                           }

                       }

                       break;

                   }

               case MoveDirections.Left:

                   {

                       if (pacman.Location.Y % 25 == 0)

                       {

                           if (Walls.Contains(new Point(pacman.Location.X - 25, pacman.Location.Y)))

                           {

                               pacman.CurrentDirection = MoveDirections.Stop_X_minus;

                           }

                           else

                           {

                               pacman.CurrentDirection = pacman.NextDirection;

                           }

                       }

                       break;

                   }

               case MoveDirections.Up:

                   {

                       if (pacman.Location.X % 25 == 0)

                       {

                           if (Walls.Contains(new Point(pacman.Location.X, pacman.Location.Y - 25)))

                           {

                               pacman.CurrentDirection = MoveDirections.Stop_Y_minus;

                           }

                           else

                           {

                               pacman.CurrentDirection = pacman.NextDirection;

                           }

                       }

                       break;

                   }

               case MoveDirections.Down:

                   {

                       if (pacman.Location.X % 25 == 0)

                       {

                           if (Walls.Contains(new Point(pacman.Location.X, pacman.Location.Y + 25)))

                           {

                               pacman.CurrentDirection = MoveDirections.Stop_Y_plus;

                           }

                           else

                           {

                               pacman.CurrentDirection = pacman.NextDirection;

                           }

                       }

                       break;

                   }

               default:

                   break;

           }

           #endregion

           #region делаем шаг

           switch (pacman.CurrentDirection)

           {

               case MoveDirections.Right:

                   {

                       if (pacman.CurrentDirection != MoveDirections.Stop_X_plus)

                       {

                           pacman.Location.X++;

                           if (value_Animation == 8)

                           {

                               value_Animation = 0;

                           }

                           if(pacman.Location.X % 5 == 0)

                           {

                               pacman.img = pacman.img_mass_Right[value_Animation];

                               value_Animation++;

                           }

                       }

                       break;

                   }

               case MoveDirections.Left:

                   {

                       if (pacman.CurrentDirection != MoveDirections.Stop_X_minus)

                       {

                           pacman.Location.X--;

                           if (value_Animation == 8)

                           {

                               value_Animation = 0;

                           }

                           if (pacman.Location.X % 5 == 0)

                           {

                               pacman.img = pacman.img_mass_Left[value_Animation];

                               value_Animation++;

                           }

                       }

                       break;

                   }

               case MoveDirections.Up:

                   {

                       if (pacman.CurrentDirection != MoveDirections.Stop_Y_minus)

                       {

                           pacman.Location.Y--;

                           if (value_Animation == 8)

                           {

                               value_Animation = 0;

                           }

                           if (pacman.Location.Y % 5 == 0)

                           {

                               pacman.img = pacman.img_mass_Up[value_Animation];

                               value_Animation++;

                           }

                       }

                       break;

                   }

               case MoveDirections.Down:

                   {

                       if (pacman.CurrentDirection != MoveDirections.Stop_Y_plus)

                       {

                           pacman.Location.Y++;

                           if (value_Animation == 8)

                           {

                               value_Animation = 0;

                           }

                           if (pacman.Location.Y % 5 == 0)

                           {

                               pacman.img = pacman.img_mass_Down[value_Animation];

                               value_Animation++;

                           }

                           

                       }

                       break;

                   }

               default:

                   break;

           }

           #endregion

           pacman_loozer(enemy.LocationEnemy1);

           pacman_loozer(enemy_2.LocationEnemy2);

           pacman_loozer(enemy_3.LocationEnemy3);

           CheckAppleEate();

           pacman.Location = zerkl_otbr(pacman.Location);

       }

       private void pacman_loozer(Point Location) //Пересечение координаты пакмэна и врага

       {

           if (

                   (Math.Abs(Location.X - pacman.Location.X) <= 20 && (Location.Y == pacman.Location.Y))

                       ||

                           (Math.Abs(Location.Y - pacman.Location.Y) <= 20 && (Location.X == pacman.Location.X))

                       ||

                           (Math.Abs(Location.X - pacman.Location.X) <= 20 && Math.Abs(Location.Y - pacman.Location.Y) <= 20)

                   )

           {

               gameStatus = GameStatus.loozer;

           }

       }

       private Point RunEnemy(Enemy enemy_1, Point Location)

       {

           #region// Проверяем, можно ли повернуть врагу

           switch (enemy_1.NextDirection_enemy)

           {

               case MoveDirections.Right:

                   {

                       if (Location.Y % 25 == 0 && Location.X % 25 == 0)

                       {

                           if (Walls.Contains(new Point(Location.X + 25, Location.Y)))

                           {

                               enemy_1.CurrentDirection_enemy = MoveDirections.Stop_X_plus;

                           }

                           else

                           {

                               enemy_1.CurrentDirection_enemy = enemy_1.NextDirection_enemy;

                           }

                       }

                       break;

                   }

               case MoveDirections.Left:

                   {

                       if (Location.Y % 25 == 0 && Location.X % 25 == 0)

                       {

                           if (Walls.Contains(new Point(Location.X - 25, Location.Y)))

                           {

                               enemy_1.CurrentDirection_enemy = MoveDirections.Stop_X_minus;

                           }

                           else

                           {

                               enemy_1.CurrentDirection_enemy = enemy_1.NextDirection_enemy;

                           }

                       }

                       break;

                   }

               case MoveDirections.Up:

                   {

                       if (Location.X % 25 == 0 && Location.Y % 25 == 0)

                       {

                           if (Walls.Contains(new Point(Location.X, Location.Y - 25)))

                           {

                               enemy_1.CurrentDirection_enemy = MoveDirections.Stop_Y_minus;

                           }

                           else

                           {

                               enemy_1.CurrentDirection_enemy = enemy_1.NextDirection_enemy;

                           }

                       }

                       break;

                   }

               case MoveDirections.Down:

                   {

                       if (Location.X % 25 == 0 && Location.Y % 25 == 0)

                       {

                           if (Walls.Contains(new Point(Location.X, Location.Y + 25)))

                           {

                               enemy_1.CurrentDirection_enemy = MoveDirections.Stop_Y_plus;

                           }

                           else

                           {

                               enemy_1.CurrentDirection_enemy = enemy_1.NextDirection_enemy;

                           }

                       }

                       break;

                   }

           }

           #endregion

           if ((int)enemy_1.CurrentDirection_enemy > 4)

           {

               ChangeDirection(enemy_1);

           }

           #region делаем шаг врагом

           switch (enemy_1.CurrentDirection_enemy)

           {

               case MoveDirections.Right:

                   {

                       if (enemy_1.CurrentDirection_enemy != MoveDirections.Stop_X_plus)

                       {

                           Location.X++;

                           

                       }

                       break;

                   }

               case MoveDirections.Left:

                   {

                       if (enemy_1.CurrentDirection_enemy != MoveDirections.Stop_X_minus)

                       {

                           Location.X--;

                           

                       }

                       break;

                   }

               case MoveDirections.Up:

                   {

                       if (enemy_1.CurrentDirection_enemy != MoveDirections.Stop_Y_minus)

                       {

                           Location.Y--;

                           

                       }

                       break;

                   }

               case MoveDirections.Down:

                   {

                       if (enemy_1.CurrentDirection_enemy != MoveDirections.Stop_Y_plus)

                       {

                           Location.Y++;

                           

                       }

                       break;

                   }

               default:

                   break;

           }

           #endregion

           Location = zerkl_otbr(Location);

           return Location;

       }

       private void rnd_Direction(Enemy enemy)

       {

           if (rnd.Next(100) < 5)

           {

               ChangeDirection(enemy);

           }

          

       }

       private void ChangeDirection(Enemy enemy)

       {

           int direction = rnd.Next(1, 5);

           enemy.NextDirection_enemy = (MoveDirections)direction;

       }

       private void CheckAppleEate()

       {

           //проверка того что в данной ячейке поля есть яблоко

           bool isSharik = false;

           Point sharik = new Point(-1, -1);

           foreach (Point item in Shariki)

           {

               if (pacman.Location.X == item.X && pacman.Location.Y == item.Y)

               {

                   isSharik = true;

                   sharik = item;

                   break;

               }

           }

           //если есть, то увеличить количество очков и стереть яблоко

           if (isSharik)

           {

               Shariki.Remove(sharik);

               OnSharikRemoved(sharik);

               Shariki_New.Add(sharik);

               OnScore();

               if (status_sound)

               {

                   sound_eate.Load();

                   sound_eate.Play();

               }

              

           }

           //если стерли последнее яблоко то уровень закончен

           if (Shariki.Count == 0)

           {

               gameStatus = GameStatus.winner;

           }

       }

       public delegate void SharikRemovedEventHandler(Point sharik);

       public event SharikRemovedEventHandler SharikRemoved;

       private void OnSharikRemoved(Point sharik)

       {

           if (SharikRemoved != null)

           {

               SharikRemoved(sharik);

           }

       }

       public delegate void New_Game();

       public event New_Game New_game;

       private void OnNew_game()

       {

           if (New_game != null)

           {

               New_game();

           }

       }

       public delegate void Score();

       public event Score Score_och;

       private void OnScore()

       {

           if (Score_och != null)

           {

               Score_och();

           }

       }

       void stop_all_run()

       {

           pacman.NextDirection = MoveDirections.Stop_X_plus;

           pacman.CurrentDirection = MoveDirections.Stop_X_plus;

           enemy.CurrentDirection_enemy = MoveDirections.Stop_X_plus;

           enemy.NextDirection_enemy = MoveDirections.Stop_X_plus;

           enemy_2.CurrentDirection_enemy = MoveDirections.Stop_X_plus;

           enemy_2.NextDirection_enemy = MoveDirections.Stop_X_plus;

           enemy_3.CurrentDirection_enemy = MoveDirections.Stop_X_plus;

           enemy_3.NextDirection_enemy = MoveDirections.Stop_X_plus;

           

       }

       internal void NewGame()

       {

           pacman = new Pacman();

           sound_Start = new SoundPlayer(Properties.Resources.start_song);

           if (status_sound)

           {

               sound_Start.Load();

               sound_Start.Play();

           }

           

           gameStatus = GameStatus.stoping;

           Shariki = new List<Point>();

           //Размещение всех шариков на поле

           for (int i = 0; i < 13; i++)

           {

               for (int j = 0; j < 17; j++)

               {

                   if (pole_mass[i, j] == 0)

                   {

                       Shariki.Add(new Point(j * 25, i * 25));

                   }

               }

           }

           

//Размещение всех шариков на поле

           OnNew_game();

           timer.Interval = 1;

           timer.Elapsed -= new System.Timers.ElapsedEventHandler(timer_Elapsed);

           timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);

           enemy = new Enemy();

           enemy_2 = new Enemy();

           enemy_3 = new Enemy();

           rnd = new Random(DateTime.Now.Millisecond);

           Walls = new List<Point>();

           //разместить координаты стенок

           for (int i = 0; i < 13; i++)

           {

               for (int j = 0; j < 17; j++)

               {

                   if (pole_mass[i, j] == 1)

                   {

                       Walls.Add(new Point(j * 25, i * 25));

                   }

               }

           }

           Shariki_New = new List<Point>();

           //вызов события новой игры

       }

   }

}


 

А также другие работы, которые могут Вас заинтересовать

71262. Вексель и вексельные правоотношения 159 KB
  Сложившаяся в стране экономическая ситуация дает толчок развитию вексельного оборота в банковско-финансовой и промышленной областях, в сфере торговли и обслуживания. Долгое время векселя использовались лишь в сфере международной торговой деятельности.
71263. ГРАЖДАНСКО-ПРАВОВОЙ ДОГОВОР И ЕГО МЕСТО В СИСТЕМЕ ГРАЖДАНСКОГО ПРАВА 315.27 KB
  Договор — это наиболее распространенный вид сделок. Только немногочисленные односторонние сделки не относятся к числу договоров. Основная же масса встречающихся в гражданском праве сделок — договоры. Как и любая сделка, договор представляет собой волевой акт.
71265. ПРОЕКТИРОВАНИЕ ЭЛЕКТРОСНАБЖЕНИЯ КВАРТИРЫ В МНОГОКВАРТИРНОМ ЖИЛОМ ДОМЕ 128.54 KB
  При проектировании электроустановок жилых и общественных зданий необходимо руководствоваться требованиями действующих строительных норм и правил, других нормативных документов, утвержденных в установленном порядке.
71266. Товарищество собственников жилья 291 KB
  В изменившейся ситуации, когда жилищный фонд переходит в основном в собственность отдельных граждан, становится частным, требуются новые подходы к его управлению. По сообщениям некоторых средств массовой информации доля частной собственности в жилом секторе России уже превышает 75% от всего жилого фонда.
71267. ВНЕШНИЙ ГОСУДАРСТВЕННЫЙ ДОЛГ РФ 224.57 KB
  В любой стране существуют проблемы и трудности, которые необходимо решить и преодолеть, чтобы занять достойное место в мире. Это проблемы экономического, социального, политического, духовного характеров, которые очень важны, взаимосвязаны и требуют решения.
71268. Работа в СУБД Microsoft Access и электронных таблицах Microsoft Excel 798.07 KB
  Практически все области деятельности современного общества развиваются на базе все более широкого применения информационных технологий. Электронные таблицы Microsoft Excel – это очень мощное средство создания и ведения различных электронных документов.
71269. Анализ выполнения плана отгрузки изделий за третий месяц периода 361 KB
  В предметной области комплекса задач, к которой относится и задача проверки выполнения плана отгрузки продукции заказчикам, рассматриваются процессы планирования и учета выпуска изделий на предприятии, сдача готовых изделий на склады и отгрузка готовой продукции заказчикам в соответствии...
71270. Проблемы сохранения культурного наследия. Социально-экономические и правовые аспекты сохранения историко-культурного наследия Санкт-Петербурга 236.86 KB
  Безусловно, данная проблема является очень актуальной, и мы решили провести исследование, как люди относятся к тому, что архитектурные постройки Петровских времен меняют на современные стеклянные бизнесс-центры, которые по стилю совершенно не вписываются в «историческое» окружение.