Разработка приложения, представляющего собой компьютерную игру "Змейка"

ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ

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

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

«Нижегородский государственный университет им. Н.И. Лобачевского»

(ННГУ)



ЭКОНОМИЧЕСКИЙ ФАКУЛЬТЕТ

Кафедра «Экономическая информатика»

КУРСОВАЯ РАБОТА

по дисциплине: ВМиП

(вычислительные методы информатики и программирования)

на тему:

Разработка приложения, представляющего собой

компьютерную игру «Змейка»



Выполнил( ла ) студент(ка) курс

  группы, очного отделения 

      	

    (ф.и.о.)

    подпись

Научный руководитель:

							      	

   (ф.и.о.)







Н.Новгород 2008




СОДЕРЖАНИЕ

	

	1. Введение

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

3.Опиание алгоритма решения в псевдокоде(команды в виде текста на русском языке

	4.Исходный текст программы на С

	5.Тестирование программы

	6.Заключение

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

	8.Приложения


1.Введение.



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

Основная идея ООП: программа состоит из группы объектов, часто связанных между собой. В С++ объекты описываются при помощи нового типа данных class. Класс включает в себя набор переменных (данных) и операций (методов или функций-членов), которые действуют на эти переменные. Полученными объектами можно управлять при помощи сообщений. В ООП объекты включают в себя не только данные (данные-члены), но и методы (функции-члены) воздействия на эти данные. Эти две части в сочетании образуют функциональную единицу программы. Другими словами, объекты содержат данные и методы работы с этими данными. Ниже приведены три основных преимущества объектно-ориентированных программ по сравнению с эквивалентными программами, разработанными сверху вниз.

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

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

Основные термины и положения ООП. Инкапсуляция данных. Этот термин включает в себя логическое связывание данных с конкретной операцией. Она так же означает, что они являются не -глобальными доступными всей программе, а локальными – доступными только малой ее части. Инкапсуляция также автоматически подразумевает защиту данных. Именно для этого предназначена структура class в С++. В классе управление функциональными деталями объекта осуществляется при помощи спецификаторов private, public, protected.

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

Наследование.

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

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

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


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



ООП полностью принадлежит к миру С++, поскольку в С нет основного ядра– абстрактного типа данных class . Поэтому переписать процедурно-ориентированную программу как объектно-ориентированную гораздо сложнее, чем просто подставить вместо одного ключевого слова другое.

ООП представляет собой технику программирования, которая позволяет рассматривать основные идеи как множество объектов. Используя объекты, можно представить задачи, которые необходимо выполнить, их взаимодействие и любые заданные условия, которые должны быть соблюдены. Структура данных часто образует основы объектов; таким образом в С или С++ тип struct может образовывать элементарный объект. Связь с объектом можно организовать при помощи сообщений. Использование сообщений похоже на вызов функций в процедурно-ориентированной программе. Когда объект получает сообщение, вступают в действие методы, содержащиеся в объекте. Методы (их иногда называют функциями - членами) аналогичны функциям процедурно-ориентированного программирования. Тем не менее метод является частью объекта, а не чем-то отдельным, как было бы в процедурном аналоге.

С++ -язык предметно-ориентированного программирования. Язык С++ поддерживает процедурную и объектно-ориентированную парадигмы программирования. 

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

Наиболее важное понятие языков объектно-ориентированного программирования –это понятие объекта (object). Объект – это логическая единица, которая содержит данные и правила (методы) обработки этих данных. В языке С++ в качестве таких правил обработки выступают функции, т. е. объект в Borland C++ объединяет в себе данные и функции, обрабатывающие эти данные. Одним из самых главных понятий языка С++ является понятие класса. В языке С++ для того, чтобы определить объект, надо сначала определить его форму с помощью ключевого слова Ближайшей аналогией класса является структура. Память выделяется объекту только тогда, когда класс используется для его создания. Любой объект языка С++ имеет одинаковые атрибуты и функциональность с другими объектами того же класса. За создание своих классов и поведение объектов этих классов полную ответственность несет сам программист. Работая в некоторой среде, программист получает доступ к обширным библиотекам

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

Структуры.

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

struct Zmeja // структура змейка 

{

	COORD *t; //точки

	int PCount; //количество яблок

};

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

Поскольку в объектах также можно хранить группы разнотипных данных, то они тоже содержат структуры. Отличие структуры от класса в том, что в структуре нет закрытых и защищенных членов. Все члены структуры открыты.

Объявление структуры аналогично объявлению класса но вместо ключевого слова class ставится ключевое слово Struct :

struct идентификатор

{

Объявление данных или объектов

};



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

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

Графический интерфейс.

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



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



Цель: Создать игру на ловкость “Змейка”



Законченный вариант игры змейка должен содержать:

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

“Яблоко” или другой объект, при столкновении с которым “Змейка” “съедает” его(увеличивается в длину в зависимости от условий заданных программистом.

“стена” объект при столкновении с которым змейка погибает.

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


4.Опиание алгоритма решения в псевдокоде (команды в виде текста на русском языке).

Алгоритм.

 

1) Описываются переменные и константы

2) Выбор начальных координат случайным образом

3) Прорисовка начального положения

4) Генерация на поле яблок случайным образом

5) Проверка: не появилось ли яблоко на черве.

6) Управление “Змейкой” с клавиатуры.

7) Проверка: “не укусила” ли “змейка сама себя”, если укусила выводится информационное окно (Информационная форма), в противном случае переходим к следующему пункту.

8) Проверка: “не съела” ли “змейка” “яблоко” если съела, то наращиваем ей хвост и переходим к пункту 3), в противном случае см. Следующий пункт.

9) Перерисовка “Змейки”



Игра на ловкость “Змейка”



Законченный вариант игры змейка должен содержать:

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

“Яблоко” или другой объект, при столкновении с которым “Змейка” “съедает” его(увеличивается в длину в зависимости от условий заданных программистом.

“стена” объект при столкновении с которым змейка погибает.



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



Функции управления экранными объектами.



сообщение

назначение

аргументы

GotoXY( )

Размещение объекта

Координаты х,у

Level()

Вы никогда не выиграете, если не будете бдительны

Координаты х,у

Move(Game &g)

Функция которая двигает и рисует

Game &g

PlusJabloko(Game &g)

Функция разброски яблок



Game &g

skorostGame(Game &g)



Функция старта змейки ее координат и скорости





Game &g

SetColor(ConsoleColor text, ConsoleColor background)

Изменение цвета

ConsoleColor text, ConsoleColor background

	STENA_2()	

Функция рисования стены

Координаты х,у

стены

ZmejaStart()

Старт игры

GotoXY(10,15)

Main()

Главная функция





Описание функций.

//Функция разброски яблок

void PlusJabloko(Game &g){}

1.Процесс….int x,y,i;

Int n=g.gaduka.pCount;

2.Заводим цикл do while ,в котором задаем координаты объекта- яблоко

x = rand() % 56+3; //

y = rand() % 19+3; //кординаты яблока

3.проверяем объект-яблоко,попало ли оно на объект-змейку.

4. Если попало->break;

5.Если все нормально,запоминаем позицию объекта-яблоко

6.переносим курсор в эту позицию

7.присваиваем цвет объкту-яблоко

8.рисуем объект-яблоко-> символом 4(5,6)

printf("%c", 6); //рисуем яблоко каким хотим символом



// Функция старта змейки ее координат и скорости

void skorostGame(Game &g){}

1.задаем точки-размер объека-змейка

2.когда создали-запоминам позицию

3.задаем скорость передвижения объекта-змейки

4.рисуем объект-яблоко



//Функция которая двигает и рисует



int Move(Game &g){}



1.вводим координаты головы объекта- змейка

2. вводим координаты хвоста объекта- змейка

3.проверяем следующую точку по направлению.

4.проверяем объект-змейка и объект- стенка, не наехал ли объект-змейка на объект-стенка

	-если да-то выход

	-если нет, то продолжаем

5.проверяем объект-змейка саму на себя ,не наехали на себя

	-если да – то конец

	-если нет – то продолжаем

6.при создании объекта- змейка перекомпилируем змейку путем увеличения ее длины на одну точку

7.появляется новый массив, больший на 1-цу

8.при съедании объекта-яблока -закрашиваем его в цвет змейки

9.закрашиваем хвостик змеи в зеленый цвет

10.закрашиваем курсор в белый цвет(голова змейки)

Цвета.

Экранные объекты можно закрашивать разными цветами .В объекте могут присутствовать два цвета- внутренний и цвет контура.

Цвета кодируются цифрами:

enum ConsoleColor

{

	  Pink  = 0,

		Blue  = 1,

		Green  = 2,

		Cyan  = 3,

		Red   = 4,

		Magenta  = 5,

		Brown  = 6,

		LightGray = 7,

		DarkGray  = 8,

		LightBlue = 9,

		LightGreen = 10,

		LightCyan = 11,

		LightRed  = 12,

		LightMagenta = 13,

		Yellow = 14,

		White  = 15



Если значение кода задать большим 7,будет использован остаток от его деления на 7.

При создании экранных объектов по умолчанию происходит следующее:

-информационные рамки располагаются вертикально друг под другом в правой части экрана, остальные объекты размещаются в точке с координатами(0,0)

-все объекты создаются белыми с черным контуром. 



Структуры:

struct Zmeja // структура змейка 

{	COORD *t; //точки

	int PCount; //количество яблок

};

enum uprawlenie{LEFT,UP,RIGHT,DOWN}; //направление змейки



struct Game //даные-точности: змейки, яблок, передвижение по X и Y, задержка, направление

{

	Zmeja gaduka; //змейка

	COORD jabloko; //яблоко

	int dx,dy, //передвижение

		pause; //задержка

	int nap; //направление

};



Сообщения.



функция

координаты

сообщения

Void Level()

GotoXY(10,10)



GotoXY(10,11)



<<"Wu nikogda ne wuigraete "<<endl;

<<"eslu ne bydete bdutelnu!!!"<<endl;



Void ZmejaStart()

GotoXY(10,15)



<<"Soberite 75 Jablok "<<endl;



Void STENA_2()

GotoXY(20,0)

GotoXY(64,2)

GotoXY(64,3)

GotoXY(64,4)

GotoXY(64,5)

GotoXY(64,7)

GotoXY(64,8)

GotoXY(64,9)

GotoXY(64,10)

GotoXY(64,11)

GotoXY(64,13)

GotoXY(64,14)

GotoXY(64,15)

GotoXY(64,16)

GotoXY(2,2)-(2,23)

GotoXY(61,3)-(61,23)

<< "Igra \"Zmejka\" Maiko Ekaterini" <<endl; 

<< "Danue:" << endl ;

<< "Jablok:0" << endl ;

<< "Dlina:3"<< endl;

<< "Speed:0" << endl;

<< "Uprawlenie:" << endl;

<< "Esc:Wuxod" << endl;

<< "P:Pause" << endl;

<<"S:Start" << endl;

<<"L:Level" << endl;

<<":Wwerx"<<endl;

<<":Wniz"<<endl;

<<":Wlewo"<<endl;

<<":Wprawo"<<endl;

printf("*");

				

printf("*");



Void main()

GotoXY(15,1)

GotoXY(15,6)

GotoXY(15,7)

GotoXY(23,1)

<< "Wu wuigrali(maladec!!!)" << endl;

printf( "\n\t\t\t" );

printf( "\n\t\t\t" );

printf("Wu proigrali(xa-xa-xa!!!)\n\n\t\t\t");





Входные параметры:

1.установка позиции курсора х,у;

void GotoXY(int X, int Y)

{

	COORD coord = { X, Y };

	SetConsoleCursorPosition(hStdOut, coord);

} 



2. Структура объекта – змейка

 

struct Zmeja // структура змейка 

{

	COORD *t; //точки

	int PCount; //количество яблок

};



3. даные-точности: змейки, яблок, передвижение по X и Y



struct Game задержка, направление

{

	Zmeja gaduka; //змейка

	COORD jabloko; //яблоко

	int dx,dy, //передвижение

	pause; //задержка

	int nap; //направление



};



Выходные параметры:



1.Если выиграл



GotoXY(15,1); cout << "Wu wuigrali(maladec!!!)" << endl;

					GotoXY(15,6);printf( "\n\t\t\t" );

					GotoXY(15,7);printf( "\n\t\t\t" );

					getch();

					getch();

					getch();

					getch();

					getch();

					return;



2.Если проиграл

case KONEC:

GotoXY(23,1); printf("Wu proigrali(xa-xa-xa!!!)\n\n\t\t\t");

				getch();

				return;

				break;


5.Исходный текст программы С++

Разработка приложения, представляющего собой компьютерную игру «Змейка».



#include <iostream> //стандартная библиотека

#include <time.h> //случайные числа

#include <stdio.h> //для printf

#include <windows.h> // для HANDLE, курсора, цвета

#include <conio.h> //для kbhit

#include <math.h>

#include <io.h>

#include <iostream>

#include <fcntl.h>

#include <string.h>

#include "stdafx.h"

#include <math.h>  // Описания математических функций

#include <stdlib.h> // Описания функций malloc и free

using namespace std;

HANDLE hConsole;

//HANDLE hStdout, hStdin;

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);



void GotoXY(int X, int Y)

{

	COORD coord = { X, Y };

	SetConsoleCursorPosition(hStdOut, coord);

} 

//Цвет

enum ConsoleColor

{

	 Pink  = 0,

	Blue  = 1,

	Green  = 2,

	Cyan  = 3,

	Red   = 4,

		Magenta  = 5,

		Brown  = 6,

		LightGray = 7,

		DarkGray  = 8,

		LightBlue = 9,

		LightGreen = 10,

		LightCyan = 11,

		LightRed  = 12,

		LightMagenta = 13,

		Yellow = 14,

		White  = 15

};



void SetColor(ConsoleColor text, ConsoleColor background)

{

 SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));

}

struct Zmeja // структура змейка 

{

COORD *t; //точки

int PCount; //количество яблок

};

enum uprawlenie{LEFT,UP,RIGHT,DOWN}; //направление змейки



struct Game //даные-точности: змейки, яблок, передвижение по X и Y, задержка, направление

{

Zmeja gaduka; //змейка

COORD jabloko; //яблоко

int dx,dy, //передвижение

pause; //задержка

int nap; //направление

};



//Функция разброски яблок

void PlusJabloko(Game &g)

{

	int i,x,y;

	int n = g.gaduka.PCount;

	do

	{

		x = rand() % 56+3; //

		y = rand() % 19+3; //кординаты яблока

		for(i = 0; i < n; i++)

		{

			if(x == g.gaduka.t[i].X && y == g.gaduka.t[i].Y) // проверка чтоб яблоко не бросить на змею

				break;

		}

	}

	while(i < n);

	g.jabloko.X = x; //

	g.jabloko.Y = y; //запоминаем позицию яблока

	SetConsoleCursorPosition(hConsole, g.jabloko); //переносим курсор в эту позицию

	SetConsoleTextAttribute(hConsole,0x0c); //цвет яблока 

	printf("%c", 6); //рисуем яблоко каким хотим символом

	

}

// Функцыя старта змейки ее координат и скорости

void skorostGame(Game &g)

{

	system("cls");

	g.gaduka.PCount = 3; //сколько точек в змейки

	g.gaduka.t = new COORD [3];//создали точки

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

	{

		g.gaduka.t[i].X = 20 + i;

		g.gaduka.t[i].Y = 20;

		

	}

	g.dx = 1;

	g.dy = 0;

	g.pause = 100;//скорость передвижение змеи

	PlusJabloko(g);//рисуем яблока

}



void Level()

{

	GotoXY(10,10);cout <<"Wu nikogda ne wuigraete "<<endl;

	GotoXY(10,11);cout <<"eslu ne bydete bdutelnu!!!"<<endl;

}

void ZmejaStart()

{

	GotoXY(10,15);cout <<"Soberite 75 Jablok "<<endl;

}

void STENA_2()

{

	SetColor(LightBlue , Pink);GotoXY(20,0);cout << "Igra \"Zmejka\" Maiko Ekaterini" <<endl; 

	GotoXY(64,2);cout << "Danue:" << endl ;

	GotoXY(64,3);cout << "Jablok:0" << endl ;

	GotoXY(64,4); cout << "Dlina:3"<< endl;

	GotoXY(64,5); cout << "Speed:0" << endl;

	GotoXY(64,7); cout << "Uprawlenie:" << endl;

	GotoXY(64,8); cout << "Esc:Wuxod" << endl;

	GotoXY(64,9); cout << "P:Pause" << endl;

	GotoXY(64,10); cout <<"S:Start" << endl;

	GotoXY(64,11); cout <<"L:Level" << endl;

	GotoXY(64,13);printf("%c",24);cout <<":Wwerx"<<endl;

	GotoXY(64,14);printf("%c",25);cout<<":Wniz"<<endl;

	GotoXY(64,15);printf("%c",27);cout<<":Wlewo"<<endl;

	GotoXY(64,16);printf("%c",26);cout<<":Wprawo"<<endl;

				{

				SetColor(LightMagenta , Pink);

				GotoXY(2,2);

				int m = 0;

				for(m = 0; m < 60; m++)

				{

					printf("*");

				}

				}

				

				{

					GotoXY(2,24);

					int m = 0;

					for(m = 0; m < 60;m++)

					{

						printf("*");

					}

				}

				{	

					GotoXY(2,3); cout << "*"<<endl;

					GotoXY(2,4); cout << "*"<<endl;

					GotoXY(2,5); cout << "*"<<endl;

					GotoXY(2,6); cout << "*"<<endl;

					GotoXY(2,7); cout << "*"<<endl;

					GotoXY(2,8); cout << "*"<<endl;

					GotoXY(2,9); cout << "*"<<endl;

					GotoXY(2,10); cout << "*"<<endl;

					GotoXY(2,11); cout << "*"<<endl;

					GotoXY(2,12); cout << "*"<<endl;

					GotoXY(2,13); cout << "*"<<endl;

					GotoXY(2,14); cout << "*"<<endl;

					GotoXY(2,15); cout << "*"<<endl;

					GotoXY(2,16); cout << "*"<<endl;

					GotoXY(2,17); cout << "*"<<endl;

					GotoXY(2,18); cout << "*"<<endl;

					GotoXY(2,19); cout << "*"<<endl;

					GotoXY(2,20); cout << "*"<<endl;

					GotoXY(2,21); cout << "*"<<endl;

					GotoXY(2,22); cout << "*"<<endl;

					GotoXY(2,23); cout << "*"<<endl;

				}

				{

					GotoXY(61,3); cout << "*"<<endl;

					GotoXY(61,4); cout << "*"<<endl;

					GotoXY(61,5); cout << "*"<<endl;

					GotoXY(61,6); cout << "*"<<endl;

					GotoXY(61,7); cout << "*"<<endl;

					GotoXY(61,8); cout << "*"<<endl;

					GotoXY(61,9); cout << "*"<<endl;

					GotoXY(61,10); cout << "*"<<endl;

					GotoXY(61,11); cout << "*"<<endl;

					GotoXY(61,12); cout << "*"<<endl;

					GotoXY(61,13); cout << "*"<<endl;

					GotoXY(61,14); cout << "*"<<endl;

					GotoXY(61,15); cout << "*"<<endl;

					GotoXY(61,16); cout << "*"<<endl;

					GotoXY(61,17); cout << "*"<<endl;

					GotoXY(61,18); cout << "*"<<endl;

					GotoXY(61,19); cout << "*"<<endl;

					GotoXY(61,20); cout << "*"<<endl;

					GotoXY(61,21); cout << "*"<<endl;

					GotoXY(61,22); cout << "*"<<endl;

					GotoXY(61,23); cout << "*"<<endl;

				}

}





//Функция которая двигает и рисует

enum {KONEC, STENA, PLUS, MOVE};





int Move(Game &g)

{

	int & n = g.gaduka.PCount;

	COORD head = g.gaduka.t[n - 1]; //голова

	COORD tail = g.gaduka.t[0]; //хвост

	COORD next;

	next.X = head.X + g.dx;

	next.Y = head.Y + g.dy; //проверка следующей точки по направлению

	if(next.X < 3 || next.Y < 3 || next.X > 60 || next.Y > 23)//не уперлась ли в стену?

		

		

		return STENA;

	if(n > 4)

	{

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

			if(next.X == g.gaduka.t[i].X && next.Y == g.gaduka.t[i].Y) //не наехали ли на себя?

				return KONEC;

	}

	

	if(next.X == g.jabloko.X && next.Y == g.jabloko.Y)

	{

		COORD*temp = new COORD[ ++n ]; //новый масив больший на 1

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

			temp[i] = g.gaduka.t[i]; //перекопируем

		temp[n - 1] = next; //добавляем одну

		delete [] g.gaduka.t;

		g.gaduka.t = temp;

		

		SetConsoleCursorPosition(hConsole,head);

		SetConsoleTextAttribute(hConsole, 0x0a); //закрашываем яблоко которое сели 

		printf("*");

		SetConsoleCursorPosition(hConsole,next);

		SetConsoleTextAttribute(hConsole,0x0a);

		printf("%c",1);

		PlusJabloko(g);

		return PLUS;

	}

	

	for(int i = 0; i < n - 1; i++)

		g.gaduka.t[i] = g.gaduka.t[i + 1];

	g.gaduka.t[n - 1] = next;

	SetConsoleCursorPosition(hConsole,tail);//закрашиваем хвостик

	printf(" ");

	

	SetConsoleCursorPosition(hConsole,head);

	SetConsoleTextAttribute(hConsole, 0x0a);//красим хвост змеи в зелений цвет

	printf("*");

	SetConsoleCursorPosition(hConsole,next);

	SetConsoleTextAttribute(hConsole,0x0f); //красим курсор в белый цвет (голову змеи) 

	printf("%c",1);

	

	return MOVE;

}







void main()

{



	hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //получаем дескриптор консоли

	int key = 0, count = 0;

	bool Pause=false;

	Game g;

	skorostGame(g);

	STENA_2();

	srand(time(0));

	bool pause = false;

	while(key != 27)

	{

		while(!kbhit()) //ждет пока нажмем

		{

			if(Pause==true)

			{

				Sleep(1); 

				continue;

			}

			

			switch (Move(g))//движение

			{

				

			case PLUS:

				++count;

				g.pause-=1;

				GotoXY(64,2);cout << "Danue:" << endl ;

				GotoXY(64,3); cout << "Jablok:" <<count << endl;

				GotoXY(64,4); cout << "Dlina:" <<g.gaduka.PCount << endl;

				GotoXY(64,5); cout << "Speed:" <<g.pause<< endl;

				GotoXY(64,7); cout << "Uprawlenie:" << endl;

				GotoXY(64,8); cout << "Esc:Wuxod" << endl;

				GotoXY(64,9); cout << "P:Pause" << endl;

				GotoXY(64,10); cout <<"S:Start" << endl;

				GotoXY(64,11); cout <<"L:Level" << endl;

				GotoXY(64,13);printf("%c",24);cout <<":Wwerx"<<endl;

				GotoXY(64,14);printf("%c",25);cout<<":Wniz"<<endl;

				GotoXY(64,15);printf("%c",27);cout<<":Wlewo"<<endl;

				GotoXY(64,16);printf("%c",26);cout<<":Wprawo"<<endl;

				if (count == 75) 

				{

					GotoXY(15,1); cout << "Wu wuigrali(maladec!!!)" << endl;

					GotoXY(15,6);printf( "\n\t\t\t" );

					GotoXY(15,7);printf( "\n\t\t\t" );

					getch();

					getch();

					getch();

					getch();

					getch();

					return;

				}

				break;

				

			case STENA:

				

			case KONEC:

				GotoXY(23,1); printf("Wu proigrali(xa-xa-xa!!!)\n\n\t\t\t");

				getch();

				return;

				break;

			}

			

			Sleep(g.pause); //Задержка

		}

		key = getch();

		

		if(key=='P'||key=='p')

			Pause=!Pause;

		else if(key=='S'||key=='s')

			ZmejaStart();

		else if(key=='L'||key=='l')

			Level();

		else if(key==0||key==224)

		{

			key=getch();

			

			if(key == 72 && g.nap != DOWN)

			{

				g.nap = UP;

				g.dx = 0;

				g.dy = -1;

			}

			else if(key == 80 && g.nap != UP)

			{

				g.nap = DOWN;

				g.dx = 0;

				g.dy = 1;

			}

			else if(key == 75 && g.nap != RIGHT)

			{

				g.nap = LEFT;

				g.dx = -1;

				g.dy = 0;

			}

			else if(key == 77 && g.nap != LEFT)

			{

				g.nap = RIGHT;

				g.dx = 1;

				g.dy = 0;

			}

		}

	}







}


































5.Тестирование программы.



Первоначальный вид игры при запуске





Змейка ударилась об объект стенку





Объект ударился об объект





Окончание игры змейка




7.Заключение.



В коде задачи указано максимально допустимое количество яблок, поэтому в игре предусмотрено данное ограничение. Ограничено количество игроков, ограничено количество яблок.

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

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

	указывается в меню справа. 

В целом приложение представляет собой почти самый простой вариант игры «Змейка » с набором самых необходимых функций.


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



						1. Начальный курс С и С++.: Учебник. /Б. И. Березин. Москва:"ДИАЛОГ-МИФИ",1999г.
2. Язык программирования С++. : Учебник. /. Страуструп. Киев:"ДиаСофт", 1993 г.

						3. Введение в язык С++: Учебник. / Бьярн Страустрап.

						– СПб.: 1995.

						4. Структуры и алгоритмы обработки данных: Учебник. / Матьяш В.А., Путилов В.А., Фильчаков В.В. , Щёкин С.В. - Апатиты, КФ Петр ГУ, 2000

						5. С++ /Дэвис Стефан Р.,4-е издание : Пер. с англ.:- М.: Издательский дом «Вильямс»,2003

						6. Основы программирования: Учеб. Для сред. проф. образования /И.Г.Семакин, А.П.Шестаков. – М., 2006.

						7. С++ экспресс курс: Учебник. /Лаптев В.В. – СПб.: БХВ- Петербург 2004.

						8. С++ учебный курс: Учебник. /Франка П. – СПб.: Питер 2005.

						9. МОДЕЛИ И CТРУКТУРЫ ДАННЫХ:/ Учебное пособие/
Д.Далека, А.С. Деревянко, О.Г.Кравец, Л.Е. Тимановская -Харьков: ХГПУ, 2000 

						10.Высшая математика для экономистов: учебник для студентов вузов/Н.Ш.Кремер,3-е издание.-М.:ЮНИТИ-ДАНА,2006






9.Приложения.

Приложение 1

Изменение объекта яблоко

 





Изменение объекта змейка





Меню на русском языке




Приложение 2



К курсовой работе прилагается диск 1.44 Мб.











1