44447

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

Курсовая

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

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

Русский

2013-11-12

1.08 MB

332 чел.

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

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

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

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

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

кафедра

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

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

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

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

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

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

Выполнил:

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

САПР-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>();

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

       }

   }

}


 

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

29755. Стандарт освіти та його структура 77.91 KB
  Забезпечення мотивації і прийняття учнями мети навчальнопізнавальної діяльності актуалізація опорних знань і умінь. Готовність учнів до активної навчальнопізнавальної діяльності на основі опорних знань. Засвоєння нових знань і способів дій. Забезпечення сприйняття осмислення і первинного запам'ятовування знань і способів дій зв'язків і стосунків в об'єкті вивчення.
29756. Алгоритм підготовки викладача до уроку теоретичного навчання 18.07 KB
  Попередня підготовка до уроку: вивчення навчальної програми;змісту самої програми усвідомлення мети і завдань навчальної дисципліни в цілому та мети і завдань які вирішує кожна тема. Послідовність безпосередньої підготовки до уроку: 1.Формулювання мети і завдань уроку.
29757. Методика вивчення навчальних досягнень учнів 17.77 KB
  Запровадження 12бальної системи оцінювання навчальних досягнень учнів потребують розробки різнорівневих завдань. Основним видом оцінювання навчальних досягнень учнів є тематичне тому що тільки у межах відповідної мети в учнів формується цілісне сприйняття обєкта вивчення забезпечується ситність та наступність у засвоєнні знань можливість поступового їхнього опанування від нижчого до вищого рівня. Оцінюючи навчальні досягнення учнів враховують: характер відповіді учня: елементарна фрагментарна неповна повна логічна доказова...
29758. Методи створення і використання навчальних матеріалів 19.26 KB
  Засоби навчання: Технічні засоби навчання обладнання й апаратура що застосовуються в навчальному процесі з метою підвищення його ефективності. При підготовці і проведенні уроку з використанням технічних засобів навчання необхідно: детально проаналізувати зміст і мету уроку зміст і логіку навчального матеріалу; визначити обсяг та особливості знань які повинні засвоїти учні уявлення факти закони гіпотези необхідність демонстрування предмета явища або їх зображення. Якщо умовно представити коло де розташовані різні предмети в...
29759. Засоби педагогічної діяльності 18.48 KB
  Засоби навчання це різноманітні матеріали і знаряддя навчального процесу завдяки яким більш успішно і за коротший час досягаються визначені цілі навчання. До засобів навчання належать: підручники навчальні посібники дидактичні матеріали технічні засоби ТЗН обладнання станки навчальні кабінети лабораторії ЕОМ ТБ та інші засоби масової комунікації. Засобами навчання можуть також слугувати реальні об'єкти виробництво споруди. Вибір засобів навчання залежить від дидактичної концепції мети змісту методів і умов навчального...
29760. Цільова підготовка педагога до уроку 20.07 KB
  Безпосередня підготовка педагога до уроку передбачає, насамперед, створення поурочного плану-конспекту, який допомагає цілеспрямовано провести урок. Системний підхід до планування уроку вимагає дотримуватися такої послідовності дій
29761. Основные понятия химической термодинамики. Первый закон термодинамики. Закон Гесса. Теплоёмкость 26.25 KB
  Часть системы с присущей ей химическим составом и макроскопическими свойствами называется фазой. В каждый момент времени состояние системы характеризуется параметрами состояния которые разделяются на экстенсивные и интенсивные параметры. Интенсивные определяются лишь специфической природой системы: давление температура химический потенциал и т. Термодинамическими параметрами состояния называются параметры которые измеряются непосредственно и выражают интенсивные свойства системы.
29762. Второй и третий закон термодинамики. Энтропия. Термодинамический потенциал 21.3 KB
  Второй закон термодинамики Все процесс в которых один вид энергии превращается в другой строго подчиняются первому закону термодинамики. Критерий осуществимости процесса в том или ином направлении и устанавливаются вторым законом термодинамики. Математическое выражение второго закона термодинамики Следствием второго закона термодинамики является существование особой функции состояния.
29763. Химический потенциал. Химическое равновесие. Закон действующих масс. Константы равновесия 21.55 KB
  Химическое равновесие Эксперименты показывают что химические реакции одновременно протекают в двух направлениях. Таким образом химическое равновесие помимо равенства скоростей прямой и обратной реакции и постоянства концентраций при неизменных внешних условиях обладают ещё следующими свойствами: Подвижностью т. Возможностью достижения равновесия как со стороны исходных веществ так и со стороны продуктов реакции. С термодинамической точки зрения они необратимы и работа их не является максимальной однако можно мысленно представить...