Игра "Змейка"

 

Содержание


Введение

Теоретические основы ООП

Обоснование выбора языка программирования и среды разработки

Описание целей и задач

Немного из истории игры

Описание игрового процесса

Краткое описание классов

Основные алгоритмы

Требования к ПО и к ТО

Заключение

Список литературы

Исходный код



Введение


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



Теоретические основы ООП


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

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

Неформально можно сказать, что объектно-ориентированное программирование стоит на трёх китах, таких как инкапсуляция, полиморфизм и наследование. Что же это такое?

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

Наследование означает такое отношение между классами (отношение родитель - потомок), когда один класс заимствует структурную или функциональную часть одного или нескольких других классов (соответственно, одиночное и множественное наследование).

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

Главным звеном программы в ООП является объект (например класс).Главным в понятии объекта является объединение идей абстракции данных и алгоритмов. Объекты обладают целостностью, которая не может быть нарушена. Свойства, которые характеризуют объект и его поведение, остаются неизменными.

Объектно-ориентированное проектирование - это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

Для ООП важную роль играет такое понятие, как абстрагирование.

Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко определяет его концептуальные границы с точки зрения наблюдателя.

Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от несущественных.

Класс делится на две части: интерфейс и реализацию.

Интерфейс отражает внешнее поведение объекта, описывая абстракцию поведения всех объектов данного класса.

Внутренняя реализация описывает представление этой абстракции и механизмы достижения желаемого поведения объекта.

Для удобного представления программы используются модульность и иерархия.

Модульность - это разделение программы на фрагменты, которые компилируются по отдельности, но могут устанавливать связи с другими модулями.

Иерархия - это упорядочение абстракций, разложение их по уровням.

Сохраняемость - способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства.

Программы в ООП должны быть написаны на соответствующем объектно-ориентированном языке программирования. По каким же критериям определяется такой язык?

1)все объекты имеют свой специализированный тип - класс;

2)каждый класс должен иметь различные виды полей данных, в зависимости от степени доступа: закрытые, открытые, наследованные;

)классы могут наследовать часть полей данных и методов у других классов;

)методы представляются в виде именованных операций, что придает программе читабельность.


Обоснование выбора языка программирования и среды разработки


Для реализации курсового проекта выбрана интегрированная среда разработки Microsoft Visual Studio. В целом среда имеет много достоинств:

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

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

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

В качестве языка программирования был выбран C#.

Преимущества языка программирования C#:

. Подлинная объектная ориентированность (всякая языковая сущность претендует на то, чтобы быть объектом)

. Компонентно-ориентированное программирование

. Безопасный (по сравнению с языками C и C++) код

. Унифицированная система типизации

. Поддержка событийно-ориентированного программирования

. «Родной» язык для создания приложений в среде .NET

. Объединение лучших идей современных языков программирования: Java, C++, Visual Basic и др.


Описание целей и задач


Разработать игру «Змейка», используя объектно-ориентированное программирование. Повысить знанияв области ООП. Придерживаться основных понятий: абстракция, инкапсуляция, наследование, полиморфизм.

Целями данного курсового проекта являются:

практика объектно-ориентированный анализ и проектирование

изучение основ проектирования игр

практика работы с графическими библиотеками

обучение созданию дружественного пользовательского интерфейса


Немного из истории игры


Первой игрой этого плана был игровой автомат Hustle, выпущенный фирмой Gremlin в 1977 году.[1] Одна из первых реализаций (возможно, первая) на домашнем компьютере была сделана в 1979 году на компьютере TRS-80, автор F. Seger (Германия). Вскоре после неё вышла версия для Commodore VIC-20, под названием Worms. Микрокомпьютерная версия игры Hustle была выпущена Milton Bradley для компьютера TI-99/4A в 1980 году.[1] Версии игры существовали и на многих советских компьютерах, например - на Радио 86РК[2].

В число известных вариантов Питона входит игра Nibbles, некоторое время входившая в комплект MS-DOS.

Трёхмерная версия Питона существует для телефона Nokia N70 и последующих телефонов Nokia.

Я решил написать еще одну версию этой игры для ОС Windows.


Описание игрового процесса


Игровое поле представляет собой прямоугольное окно размером 640х480 пикселей. На поле появляется «Змейка» - квадрат черного цвета размером 10х10 пикселей.



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

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



Яблоко может быть зеленого цвета(обычное яблоко при съедании которого начисляется очки, количество которых равно номеру уровня), или красное яблоко(бонусное, при съедании этого яблока начисляются очки, количество которых равно номеру уровня умноженному на три).




Когда змейка съедает любое яблоко, независимо от цвета, ее размер увеличивается на один квадрат размером 10х10 пикселей.

Если змейка врезается сама в себя или в одну из четырех стен, она погибает и игра заканчивается.




Цель игры набрать 1000 очков.


Краткое описание классов

- начальный класс который имеет метод Main(), с этого метода начианается работа программы. В нем выхывается метод Run, для класса UserBox.- предоставляет пользователю окно ввода имени. И выводит начальную информацию о игре.

проектирование игра абстракция инкапсуляция алгоритм


- главный класс в моем проекте. В нем реализована логика игры.- класс описания игрока.- класс описывает таблицу рекордов.- класс описывает одну часть змейки.- класс описывает яблоко которое должна съесть змея.- класс описывает окно «О программе»


Основные алгоритмы


Одним из основных методов является метод SnakeCSharpWindow_Paint. В этом методе проверяется столкновения змейки с хвостом, стенкой или яблоком. И вызывается нужный метод. Также проверяется является ли следующее яблоко бонусным.

Метод SnakeCSharpWindow_KeyDown отслеживает нажатие клавиш.

Метод TheEnd вызывается в случае поражения, а метод Triumph в случае победы(когда игрок набирает 1000 очков).


Требования к ПО и к ТО


ØОС Microsoft Windows XP/Vista/7

ØПроцессор Pentium III 800 MHz или выше

Ø256 MB RAM

Ø50 MB свободного места на жестком диске

ØDirectX-совместимая видео карта с 32MB памяти

ØDirectX 9.0c или выше

ØПакет .NET Framework версии 2.0 или выше



Заключение


В ходе выполнения данной работы на основе различных источников были повышены знания в области ООП. И навыки программирования на языке C#.

В результате выполнения проекта была полностью реализована игра «Змейка», используя объектно-ориентированное программирование.

В процессе тестирования приложения ошибок не обнаружено.



Список литературы


1.А. Волосевич. Базовые технологии платформы .NET. Минск, 2011

2.Г. Шилдт. Полный справочник по С# 4.0. изд. Osborne, 2010

.Сайт www.gamedev.ru

.Джеффри Рихтер «Программирование на языке C# - мастер-класс» - М.: Издательство «Питер», 2008



Исходный код


Класс Program.class Program

{


[STAThread]void Main()

{.EnableVisualStyles();.SetCompatibleTextRenderingDefault(false);.Run(new UserBox());

}

}


Класс UserBox - предоставляет начальное окно программы. В нем содержится небольшое описание процесса игры и поле для ввода имени пользователя.partial class UserBox : Form

{UserBox()

{();.Text = "Игра змейка. \nЦель игры: управляя змейкой собирать яблоки которые появляются на игровом поле. \nДля управления змейкой используйте клавиши вниз, вверх, влево, вправо \nДля начала игры нажмите любую клавишу управления и змейка начнет движение. \nДля продалжения нажмите Enter ";

}void textBox1_KeyDown(object sender, KeyEventArgs e)

{(e.KeyCode == Keys.Enter)

{.Hide();x = new SnakeCSharpWindow(textBox1.Text);.Show();

}

}

}


Класс SnakeCSharpWindow - основной класс в котором описана логика игры.partial class SnakeCSharpWindow : Form

{points = 0;count_apple = 0;bonus = 1;m = false;Timer t = new Timer();Dir dir = new Dir(0, 0);private LinkedList<Dir> snake = new LinkedList<Dir>(); //LinkedList doesn't have add...Table table = new Table();Person person = new Person();Apple apple = new Apple(false, snake);

SnakeCSharpWindow(string player)

{

menu = new MainMenu();item = new MenuItem("&Файл");.MenuItems.Add(item);

// Add the menu entries to the "File" menu.MenuItems.Add(new MenuItem("&Выход", new EventHandler(Exit)));= new MenuItem("&Уровень");.MenuItems.Add(item);

// Add the menu entries to the "File" menu.MenuItems.Add(new MenuItem("Быстрее", new EventHandler(LevelUp)));.MenuItems.Add(new MenuItem("Медленне", new EventHandler(LevelDown)));

// Create a new Menu= new MenuItem("&Помощь");.MenuItems.Add(item);

// Add the menu entries to the "Help" menu.MenuItems.Add(new MenuItem("&О проекте", new EventHandler(OnAbout)));

// Attach the menu to the window= menu;.ClientSize = new System.Drawing.Size(640, 480);.FormBorderStyle = FormBorderStyle.FixedSingle;.Name = "SnakeCSharpWindow";.Text = "SnakeCSharp";.Paint += new PaintEventHandler(SnakeCSharpWindow_Paint);.KeyDown += new KeyEventHandler(SnakeCSharpWindow_KeyDown);.Tick += new EventHandler(t_Tick);.Start();.AddFirst(new Dir(10, 10));.Player = player;

}

void LevelUp(object sender, EventArgs ev)

{(bonus < 5)

{.Interval -= 20;+= 1;

}

}

void LevelDown(object sender, EventArgs ev)

{(bonus > 1)

{.Interval += 20;-= 1;

}

}

void OnAbout(object sender, EventArgs ev)

{

about = new AboutBox1();.ShowDialog();= null;

}

SnakeCSharpWindow_KeyDown(object sender, KeyEventArgs e) //Change direction

{(e.KeyCode == Keys.Left) { dir = new Dir(-10, 0); }(e.KeyCode == Keys.Right) { dir = new Dir(10, 0); }(e.KeyCode == Keys.Up) { dir = new Dir(0, -10); }(e.KeyCode == Keys.Down) { dir = new Dir(0, 10); }(e.KeyCode == Keys.Escape) { this.Close(); }

}

SnakeCSharpWindow_Paint(object sender, PaintEventArgs e)

{.Graphics.DrawRectangle(new Pen(Color.Red, 3), 0, 0, 640, 480);.Graphics.FillRectangle(apple.Color, apple.Coordinates.X, apple.Coordinates.Y, 10, 10);.Graphics.DrawString(points.ToString(), new Font("Arial", 30), new SolidBrush(Color.Orange), new PointF(540, 10));.Graphics.DrawString("Уровень: " + bonus.ToString(), new Font("Arial", 20), new SolidBrush(Color.DarkBlue), new PointF(10, 10));(points >= (bonus *200)) { LevelUp(sender, e); }i = 0;point = 1;(m) { point = 3; }(Dir cur in snake) //Draw snake and check self collision

{.Graphics.FillRectangle(Brushes.Black, cur.point.X, cur.point.Y, 10, 10);(i != 0 && snake.First.Value.point.X == cur.point.X && snake.First.Value.point.Y == cur.point.Y) { TheEnd(e); }++;

}(snake.First.Value.point.X == 640 | snake.First.Value.point.Y == 480 | snake.First.Value.point.Y == 0 | snake.First.Value.point.X == 0) { TheEnd(e); }

(snake.First.Value.point.X == apple.Coordinates.X && snake.First.Value.point.Y == apple.Coordinates.Y) //Collision apple

{(count_apple % 5 == 0) { apple = new Apple(true, snake); m = true; }{ apple = new Apple(false, snake); m = false; }_apple++;+= (point * bonus);.AddLast(snake.Last.Value);(points >= 1000) { Triumph(e); }

}

}

t_Tick(object sender, EventArgs e) //Move Snake

{.AddFirst(new Dir(snake.First.Value.point.X + dir.point.X, snake.First.Value.point.Y + dir.point.Y));.RemoveLast();.Refresh();

}

TheEnd(PaintEventArgs e)

{drawString = "The End";drawFont = new Font("Arial", 15);drawBrush = new SolidBrush(Color.Red);drawPoint = new PointF(270, 10);.Graphics.DrawString(drawString, drawFont, drawBrush, drawPoint);.Dispose();.Points = points;.Add(person);.Graphics.DrawString("Ваш результат: ", drawFont, new SolidBrush(Color.Green), new PointF(200, 30));.Graphics.DrawString(person.Player + " : " + Convert.ToString(person.Points), drawFont, new SolidBrush(Color.Green), new PointF(200, 50));.Graphics.DrawString("Рекорды", new Font("Arial", 15), new SolidBrush(Color.Black), new PointF(250, 70));<Person> temp = table.GetAllPersons();w = 90;= new Font("Tahoma", 15);= new SolidBrush(Color.Orange);n = temp.Count;(n > 10) { n = 10; }(int i = 0; i < n; i++)

{.Graphics.DrawString(temp[i].Player + " : " + Convert.ToString(temp[i].Points), drawFont, drawBrush, new PointF(200, w));+= 20;

}.Close();

}

Triumph(PaintEventArgs e)

{.Dispose();drawString = "Победа";drawFont = new Font("Arial", 100);drawBrush = new SolidBrush(Color.Red);drawPoint = new PointF(100, 10);.Graphics.DrawString(drawString, drawFont, drawBrush, drawPoint);= new Font("Arial", 15);.Stop();.Points = points;.Add(person);.Graphics.DrawString("Ваш результат: ", drawFont, new SolidBrush(Color.Green), new PointF(200, 130));.Graphics.DrawString(person.Player + " : " + Convert.ToString(person.Points), drawFont, new SolidBrush(Color.Green), new PointF(200, 150));.Graphics.DrawString("Рекорды", new Font("Arial", 15), new SolidBrush(Color.Black), new PointF(250, 170));<Person> temp = table.GetAllPersons();.OrderByDescending(y => y.Points);w = 190;= new Font("Tahoma", 15);= new SolidBrush(Color.Orange);n = temp.Count;(n > 10) { n = 10; }(int i = 0; i < n; i++)

{.Graphics.DrawString(temp[i].Player + " : " + Convert.ToString(temp[i].Points), drawFont, drawBrush, new PointF(200, w));+= 20;

}.Close();

}

void Exit(object sender, EventArgs e)

{.Close();

}

}


Класс AboutBox1 - предоставляет нам окно «О программе»AboutBox1()

{();.Text = String.Format("О проекте");.labelProductName.Text = "Курсовой проект Змейка";.labelVersion.Text = String.Format("Студента группы 052001");.labelCopyright.Text = "Горбача Андрея";.labelCompanyName.Text = null;.textBoxDescription.Text = "Программа создана как курсовой проект. \n"+ "Для повышения знаний и умений создателя.\n" +

"Программа предназначена для любых возрастов.\n";

}


Класс Dir - описывает квадрат, из которого состоит змейка.class Dir

{Point point { get; set; }Dir(int x, int y)

{= new Point(x, y);

}

}


Класс Apple - описывает яблоко.class Apple

{Apple(bool b, LinkedList<Dir> snake)

{x = myRnd.Next(64 - 1) * 10;tx = myRnd.Next(2, 64 - 2) * 10;ty = myRnd.Next(2, 48 - 2) * 10;

(Dir cur in snake) //Draw snake and check self collision

{(snake.First.Value.point.X == tx && snake.First.Value.point.Y == ty)

{+= 1;+= 1;

}

}(tx >= ((64 - 1) * 10)) { tx -= 1; }(ty >= ((64 - 1) * 10)) { ty -= 1; }= new Point(myRnd.Next(2, 64 - 2) * 10, myRnd.Next(2, 48 - 2) * 10);(b) { Color = Brushes.Red; }Color = Brushes.Green;


}static Random myRnd = new Random();Point CoordinatesBrush Color { get; set; }

}


Класс Person - описывает игрока.class Person

{string Player { get; set; }int Points { get; set; }

}

Класс Table - описывает таблицу рекордов.partial class Table : Person

{StreamWriter FW;StreamReader FR;FileStream fileStream;List<Person> table = new List<Person>();

Table()

{= new FileStream("Catalog.txt", FileMode.OpenOrCreate);= new StreamWriter(fileStream);= new StreamReader(fileStream);();

}void Add(Person x)

{.Add(x);(x);

}

void WritePerson(Person x)

{.WriteLine(x.Player);.WriteLine(x.Points);

}

List<Person> GetAllPersons()

{ return table; }

void RedToListRecord()

{(FR.EndOfStream == false)

{p = new Person();.Player = FR.ReadLine();.Points = Convert.ToInt32(FR.ReadLine());.Add(p);

}();

}

void Sort()

{= table.OrderByDescending(y => y.Points).ToList();

}

void Close()

{.Close();.Close();.Close();

}

}


Содержание Введение Теоретические основы ООП Обоснование выбора языка программирования и среды разработки Описание целей и задач Немного из и

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2019 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ