Игра «Змейка»
Ш 50 MB свободного места на жестком диске Ш DirectX-совместимая видео карта с 32MB памяти Ш DirectX 9.0c или выше Ш Пакет .NET Framework версии 2.0 или выше Заключение В ходе выполнения данной работы на основе различных источников были повышены знания в области ООП. И навыки программирования на языке C#. Label2. Text = «Игра змейка. nЦель игры: управляя змейкой собирать яблоки которые появляются… Читать ещё >
Игра «Змейка» (реферат, курсовая, диплом, контрольная)
Содержание Введение Теоретические основы ООП Обоснование выбора языка программирования и среды разработки Описание целей и задач Немного из истории игры Описание игрового процесса Краткое описание классов Основные алгоритмы Требования к ПО и к ТО Заключение Список литературы Исходный код
С развитием технологий компьютеры все больше и больше вливаются в повседневную жизнь человека. Персональные компьютеры — это уже не просто машины для математических вычислений, их общедоступность значительно расширила область рименения. И, конечно же, здесь не обошлось без игр. Индустрия игр быстро набирала обороты, стремительно развивалась, завоевываю все большую и большую популярность у подрастающего поколения. И если первые игры отличались простотой дизайна и логики, то современная компьютерная игра — очень сложная программа, дело рук большого коллектива разработчиков. Так или иначе, компьютерные игры занимают не последнее место в жизни многих современных детей.
Теоретические основы ООП
История становления программирования богата какими-либо нововведениями, которые коренным образом меняют всю предшествующую систему. Одним из первых и наиболее ярких таких открытий можно считать выход в свет книги «Программирование без GOTO». Следующим наиболее важным шагом по праву считают переход к процедурно-функциональному программированию, когда программы разбивались на ряд независимых блоков, и в итоге просто грамотно соединялись в единое целое. Ну и третьим, наверное, самым большим открытием можно считать появление объектно-ориентированного программирования. ООП объединило в себе одновременно процедурные методы, для чего создавались самостоятельные модули, структурное проектирование и стимулировало творческий подход к созданию программ.
Сегодня ни одна программа не представляется без наличия в ней объектов. Объектно-ориентированное программирование вышло на новую ступень своего развития, когда внедрить объект в программу не составляет большого труда, а порой, это за вас сделает визуальная среда. Таким образом, такой мощный инструмент, как объект стал доступным даже для начинающего программиста. Теперь любой программист может использовать всю мощь и эффективность объектно-ориентированного программирования.
Неформально можно сказать, что объектно-ориентированное программирование стоит на трёх китах, таких как инкапсуляция, полиморфизм и наследование. Что же это такое?
Инкапсуляция — это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать обязательства абстракции от их реализации.
Наследование означает такое отношение между классами (отношение родитель — потомок), когда один класс заимствует структурную или функциональную часть одного или нескольких других классов (соответственно, одиночное и множественное наследование).
Полиморфизм: одно и то же имя может означать объекты разных типов, но, имея общего предка, все они имеют и общее подмножество операций, которые можно над ними выполнять.
Главным звеном программы в ООП является объект (например класс).Главным в понятии объекта является объединение идей абстракции данных и алгоритмов. Объекты обладают целостностью, которая не может быть нарушена. Свойства, которые характеризуют объект и его поведение, остаются неизменными.
Объектно-ориентированное проектирование — это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
Для ООП важную роль играет такое понятие, как абстрагирование.
Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко определяет его концептуальные границы с точки зрения наблюдателя.
Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от несущественных.
Класс делится на две части: интерфейс и реализацию.
Интерфейс отражает внешнее поведение объекта, описывая абстракцию поведения всех объектов данного класса.
Внутренняя реализация описывает представление этой абстракции и механизмы достижения желаемого поведения объекта.
Для удобного представления программы используются модульность и иерархия.
Модульность — это разделение программы на фрагменты, которые компилируются по отдельности, но могут устанавливать связи с другими модулями.
Иерархия — это упорядочение абстракций, разложение их по уровням.
Сохраняемость — способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства.
Программы в ООП должны быть написаны на соответствующем объектно-ориентированном языке программирования. По каким же критериям определяется такой язык?
1) все объекты имеют свой специализированный тип — класс;
2) каждый класс должен иметь различные виды полей данных, в зависимости от степени доступа: закрытые, открытые, наследованные;
3) классы могут наследовать часть полей данных и методов у других классов;
4) методы представляются в виде именованных операций, что придает программе читабельность.
Обоснование выбора языка программирования и среды разработки
Для реализации курсового проекта выбрана интегрированная среда разработки Microsoft Visual Studio. В целом среда имеет много достоинств:
— обеспечение интуитивно понятной, расширяемой, унифицированной среды для языка, конструкторов и инструментальных средств.
— предоставление разработчикам набора модернизированных взаимодействующих элементов, соответствующих имеющимся у разработчиков навыкам.
— предоставление высокопроизводительных инструментальных средств для всех этапов жизненного цикла разработки — от определения требований и планирования до последующего сопровождения продукта.
В качестве языка программирования был выбран C#.
Преимущества языка программирования C#:
1. Подлинная объектная ориентированность (всякая языковая сущность претендует на то, чтобы быть объектом)
2. Компонентно-ориентированное программирование
3. Безопасный (по сравнению с языками C и C++) код
4. Унифицированная система типизации
5. Поддержка событийно-ориентированного программирования
6. «Родной» язык для создания приложений в среде .NET
7. Объединение лучших идей современных языков программирования: 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 очков.
Краткое описание классов
Program — начальный класс который имеет метод Main (), с этого метода начианается работа программы. В нем выхывается метод Run, для класса UserBox.
UserBox — предоставляет пользователю окно ввода имени. И выводит начальную информацию о игре.
проектирование игра абстракция инкапсуляция алгоритм
SnakeCSharpWindow — главный класс в моем проекте. В нем реализована логика игры.
Person — класс описания игрока.
Table — класс описывает таблицу рекордов.
Dir — класс описывает одну часть змейки.
Apple — класс описывает яблоко которое должна съесть змея.
AboutBox1 — класс описывает окно «О программе»
Основные алгоритмы Одним из основных методов является метод 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
3. Сайт www.gamedev.ru
4. Джеффри Рихтер «Программирование на языке C# - мастер-класс» — М.: Издательство «Питер», 2008
Исходный код Класс Program.
static class Program
{
[STAThread]
static void Main ()
{
Application.EnableVisualStyles ();
Application.SetCompatibleTextRenderingDefault (false);
Application.Run (new UserBox ());
}
}
Класс UserBox — предоставляет начальное окно программы. В нем содержится небольшое описание процесса игры и поле для ввода имени пользователя.
public partial class UserBox: Form
{
public UserBox ()
{
InitializeComponent ();
label2.Text = «Игра змейка. nЦель игры: управляя змейкой собирать яблоки которые появляются на игровом поле. nДля управления змейкой используйте клавиши вниз, вверх, влево, вправо nДля начала игры нажмите любую клавишу управления и змейка начнет движение. nДля продалжения нажмите «Enter» «;
}
private void textBox1_KeyDown (object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys. Enter)
{
this.Hide ();
var x = new SnakeCSharpWindow (textBox1.Text);
x.Show ();
}
}
}
Класс SnakeCSharpWindow — основной класс в котором описана логика игры.
public partial class SnakeCSharpWindow: Form
{
int points = 0;
int count_apple = 0;
int bonus = 1;
bool m = false;
private Timer t = new Timer ();
private Dir dir = new Dir (0, 0);
static private LinkedList
- snake = new LinkedList
- (); //LinkedList doesn’t have add…
public Table table = new Table ();
private Person person = new Person ();
private Apple apple = new Apple (false, snake);
public SnakeCSharpWindow (string player)
{
MainMenu menu = new MainMenu ();
MenuItem item = new MenuItem («&Файл»);
menu.MenuItems.Add (item);
// Add the menu entries to the «File» menu
item.MenuItems.Add (new MenuItem («&Выход», new EventHandler (Exit)));
item = new MenuItem («&Уровень»);
menu.MenuItems.Add (item);
// Add the menu entries to the «File» menu
item.MenuItems.Add (new MenuItem («Быстрее», new EventHandler (LevelUp)));
item.MenuItems.Add (new MenuItem («Медленне», new EventHandler (LevelDown)));
// Create a new Menu
item = new MenuItem («&Помощь»);
menu.MenuItems.Add (item);
// Add the menu entries to the «Help» menu
item.MenuItems.Add (new MenuItem («&О проекте», new EventHandler (OnAbout)));
// Attach the menu to the window
Menu = menu;
this.ClientSize = new System.Drawing.Size (640, 480);
this.FormBorderStyle = FormBorderStyle. FixedSingle;
this.Name = «SnakeCSharpWindow» ;
this.Text = «SnakeCSharp» ;
this.Paint += new PaintEventHandler (SnakeCSharpWindow_Paint);
this.KeyDown += new KeyEventHandler (SnakeCSharpWindow_KeyDown);
t.Tick += new EventHandler (t_Tick);
t.Start ();
snake.AddFirst (new Dir (10, 10));
person.Player = player;
}
private void LevelUp (object sender, EventArgs ev)
{
if (bonus < 5)
{
t.Interval -= 20;
bonus += 1;
}
}
private void LevelDown (object sender, EventArgs ev)
{
if (bonus > 1)
{
t.Interval += 20;
bonus -= 1;
}
}
private void OnAbout (object sender, EventArgs ev)
{
AboutBox1 about = new AboutBox1();
about.ShowDialog ();
about = null;
}
void SnakeCSharpWindow_KeyDown (object sender, KeyEventArgs e) //Change direction
{
if (e.KeyCode == Keys. Left) { dir = new Dir (-10, 0); }
if (e.KeyCode == Keys. Right) { dir = new Dir (10, 0); }
if (e.KeyCode == Keys. Up) { dir = new Dir (0, -10); }
if (e.KeyCode == Keys. Down) { dir = new Dir (0, 10); }
if (e.KeyCode == Keys. Escape) { this. Close (); }
}
void SnakeCSharpWindow_Paint (object sender, PaintEventArgs e)
{
e.Graphics.DrawRectangle (new Pen (Color.Red, 3), 0, 0, 640, 480);
e.Graphics.FillRectangle (apple.Color, apple.Coordinates.X, apple.Coordinates.Y, 10, 10);
e.Graphics.DrawString (points.ToString (), new Font («Arial», 30), new SolidBrush (Color.Orange), new PointF (540, 10));
e.Graphics.DrawString («Уровень: «+ bonus. ToString (), new Font («Arial», 20), new SolidBrush (Color.DarkBlue), new PointF (10, 10));
if (points >= (bonus *200)) { LevelUp (sender, e); }
int i = 0;
int point = 1;
if (m) { point = 3; }
foreach (Dir cur in snake) //Draw snake and check self collision
{
e.Graphics.FillRectangle (Brushes.Black, cur.point.X, cur.point.Y, 10, 10);
if (i ≠ 0 && snake.First.Value.point.X == cur.point.X && snake.First.Value.point.Y == cur.point.Y) { TheEnd (e); }
i++;
}
if (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); }
if (snake.First.Value.point.X == apple.Coordinates.X && snake.First.Value.point.Y == apple.Coordinates.Y) //Collision apple
{
if (count_apple % 5 == 0) { apple = new Apple (true, snake); m = true; }
else { apple = new Apple (false, snake); m = false; }
count_apple++;
points += (point * bonus);
snake.AddLast (snake.Last.Value);
if (points >= 1000) { Triumph (e); }
}
}
void t_Tick (object sender, EventArgs e) //Move Snake
{
snake.AddFirst (new Dir (snake.First.Value.point.X + dir.point.X, snake.First.Value.point.Y + dir.point.Y));
snake.RemoveLast ();
this.Refresh ();
}
void TheEnd (PaintEventArgs e)
{
String drawString = «The End» ;
Font drawFont = new Font («Arial», 15);
SolidBrush drawBrush = new SolidBrush (Color.Red);
PointF drawPoint = new PointF (270, 10);
e.Graphics.DrawString (drawString, drawFont, drawBrush, drawPoint);
t.Dispose ();
person.Points = points;
table.Add (person);
e.Graphics.DrawString («Ваш результат: «, drawFont, new SolidBrush (Color.Green), new PointF (200, 30));
e.Graphics.DrawString (person.Player + ": «+ Convert. ToString (person.Points), drawFont, new SolidBrush (Color.Green), new PointF (200, 50));
e.Graphics.DrawString («Рекорды», new Font («Arial», 15), new SolidBrush (Color.Black), new PointF (250, 70));
List temp = table. GetAllPersons ();
int w = 90;
drawFont = new Font («Tahoma», 15);
drawBrush = new SolidBrush (Color.Orange);
int n = temp. Count;
if (n > 10) { n = 10; }
for (int i = 0; i < n; i++)
{
e.Graphics.DrawString (temp[i]. Player + ": «+ Convert. ToString (temp[i]. Points), drawFont, drawBrush, new PointF (200, w));
w += 20;
}
table.Close ();
}
void Triumph (PaintEventArgs e)
{
t.Dispose ();
String drawString = «Победа» ;
Font drawFont = new Font («Arial», 100);
SolidBrush drawBrush = new SolidBrush (Color.Red);
PointF drawPoint = new PointF (100, 10);
e.Graphics.DrawString (drawString, drawFont, drawBrush, drawPoint);
drawFont = new Font («Arial», 15);
t.Stop ();
person.Points = points;
table.Add (person);
e.Graphics.DrawString («Ваш результат: «, drawFont, new SolidBrush (Color.Green), new PointF (200, 130));
e.Graphics.DrawString (person.Player + ": «+ Convert. ToString (person.Points), drawFont, new SolidBrush (Color.Green), new PointF (200, 150));
e.Graphics.DrawString («Рекорды», new Font («Arial», 15), new SolidBrush (Color.Black), new PointF (250, 170));
List temp = table. GetAllPersons ();
temp.OrderByDescending (y => y. Points);
int w = 190;
drawFont = new Font («Tahoma», 15);
drawBrush = new SolidBrush (Color.Orange);
int n = temp. Count;
if (n > 10) { n = 10; }
for (int i = 0; i < n; i++)
{
e.Graphics.DrawString (temp[i]. Player + ": «+ Convert. ToString (temp[i]. Points), drawFont, drawBrush, new PointF (200, w));
w += 20;
}
table.Close ();
}
public void Exit (object sender, EventArgs e)
{
this.Close ();
}
}
Класс AboutBox1 — предоставляет нам окно «О программе»
public AboutBox1()
{
InitializeComponent ();
this.Text = String. Format («О проекте»);
this.labelProductName.Text = «Курсовой проект «Змейка» «;
this.labelVersion.Text = String. Format («Студента группы 52 001»);
this.labelCopyright.Text = «Горбача Андрея» ;
this.labelCompanyName.Text = null;
this.textBoxDescription.Text = «Программа создана как курсовой проект. n» + «Для повышения знаний и умений создателя. n» +
" Программа предназначена для любых возрастов. n" ;
}
Класс Dir — описывает квадрат, из которого состоит змейка.
public class Dir
{
public Point point { get; set; }
public Dir (int x, int y)
{
point = new Point (x, y);
}
}
Класс Apple — описывает яблоко.
public class Apple
{
public Apple (bool b, LinkedList
- snake)
{
int x = myRnd. Next (64 — 1) * 10;
int tx = myRnd. Next (2, 64 — 2) * 10;
int ty = myRnd. Next (2, 48 — 2) * 10;
foreach (Dir cur in snake) //Draw snake and check self collision
{
if (snake.First.Value.point.X == tx && snake.First.Value.point.Y == ty)
{
tx += 1;
ty += 1;
}
}
if (tx >= ((64 — 1) * 10)) { tx -= 1; }
if (ty >= ((64 — 1) * 10)) { ty -= 1; }
Coordinates = new Point (myRnd.Next (2, 64 — 2) * 10, myRnd. Next (2, 48 — 2) * 10);
if (b) { Color = Brushes. Red; }
else Color = Brushes. Green;
}
private static Random myRnd = new Random ();
public Point Coordinates
public Brush Color { get; set; }
}
Класс Person — описывает игрока.
public class Person
{
public string Player { get; set; }
public int Points { get; set; }
}
Класс Table — описывает таблицу рекордов.
public partial class Table: Person
{
public StreamWriter FW;
public StreamReader FR;
public FileStream fileStream;
public List table = new List ();
public Table ()
{
fileStream = new FileStream («Catalog.txt», FileMode. OpenOrCreate);
FW = new StreamWriter (fileStream);
FR = new StreamReader (fileStream);
RedToListRecord ();
}
public void Add (Person x)
{
table.Add (x);
WritePerson (x);
}
public void WritePerson (Person x)
{
FW.WriteLine (x.Player);
FW.WriteLine (x.Points);
}
public List GetAllPersons ()
{ return table; }
public void RedToListRecord ()
{
while (FR.EndOfStream == false)
{
Person p = new Person ();
p.Player = FR. ReadLine ();
p.Points = Convert. ToInt32(FR.ReadLine ());
table.Add (p);
}
Sort ();
}
public void Sort ()
{
table = table. OrderByDescending (y => y. Points).ToList ();
}
public void Close ()
{
FW.Close ();
FR.Close ();
fileStream.Close ();
}
}