Стивен Прата. Язык программирования C++. Лекции и упражнения. (1990 -2004) / А. Г. Мау. – М.: 2004. – 530 с. Кузьменко В.Г. Программирование на C++ 2002. – М.: ООО "Бином-Пресс", 2003 г. – 880 Евсеева О.Н. Объектно-ориентированный подход в программировании. Программирование и реализация приложений в среде Microsoft Visual Studio. Учебное пособие. Ульяновск. 2000 Харт-Девис Гай. Руководство разработчика К.: Издательская группа BHV, 2000. - 944 с., ил. ISBN 966-552-052-0, 5-7315-0081-9 Программирование в пакетах MS Visual Studio: учебное пособие C.В. Назаров, П.П. Мельников, Л.П. Смольников и др.; под редакцией С. В. Назарова – М.: Финансы и статистика, 2007. – 656 с.: ил. Роберт Лафоре. Объектно-ориентированное программирование в C++. Москва: НАРБ, 2010. – 254 с. Алгоритмы на C++. Анализ структуры данных. Сортировка.: учеб.-метод. комплекс для магистратуры /Р. Седжвик [и др.]; под ред. Р. Седжвика. – Минск: Изд-во БГУ, 2004. – 108 с. Корнеева, И.Л. Принципы и практика с использованием C++: учеб. пособие: в 2 ч. / И.Л. Корнеева. – М.: РИОР, 2004. – Ч. 2. – 182 с. Эффективный и современный C++ / М-во образования Республики Беларусь, редкол.: М. Скотт [и др.]. – М.: Большая бел. энцикл.: РИПОЛ классик, 2002. – 1663 с. Параллельное программирование на С++ в действии. Практика разработки многопоточных программ / Э. Уильямс [и др.]; под общ. ред. Г.А. Василевича. – Минск: Амалфея, 2000. – 1071 с. Павловская, Т. А. С/С++. Программирование на языке высокого уровня: учеб. для вузов / Т. А. Павловская. ‒ Санкт-Петербург : Питер, 2013. ‒ 432 с. Павловская, Т. А. С/С++. Структурное и объектно-ориентированное программирование : практикум / Т. А. Павловская. ‒ Санкт-Петербург : Питер, 2011, 352 с. Системное и прикладное программирование С и С ++ [Электронный ресурс]: [раздел сайта]. // Клуб программистов Devoloping.ru : веб-сайт. – Режим доступа: http://forum.developing.ru/archive/index.php/f-25.html. – Дата доступа: 24.03.2022. Шмидский, Я. К. Программирование на языке С++ : самоучитель / Я. К. Шмидский. – Москва : Диалектика, 2004. – 368 с.
ПРИЛОЖЕНИЕ 1
Текст программы
#include
#include
#include
#include
namespace MyGameSnake {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::IO;
[System::Runtime::InteropServices::DllImport("winmm.dll")] extern bool PlaySound(String^ lpszName, int hModule, int dwFlags);
// Компоненты для чтения vaw файлов
struct Vector2
{int X, Y;};
Vector2 direction;//направление змейки
Vector2 positionFruit;//позиция фрукта
Vector2 gameArea;//игровая зона
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyGameSnake::MyForm::MyForm(void)
{InitializeComponent();//Задаем размеры игровой зоны
gameArea.X = 400;
gameArea.Y = 400;
firstStart = true;//первый запуск
NewGame();//новая игра
}
protected:
MyForm()
{if (components){delete components;}}
private: System::Windows::Forms::MenuStrip^ menuStrip1;
protected:
private: System::Windows::Forms::ToolStripMenuItem^ менюToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ новаяИграToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ паузаСтартToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ настройкиToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ информацияОИгреToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ выходToolStripMenuItem;
private: System::Windows::Forms::GroupBox^ groupBox1;
private: System::Windows::Forms::Label^ Skore;
private: System::Windows::Forms::GroupBox^ Nastroyki;
private: System::Windows::Forms::Button^ button1;
private: System::Windows::Forms::NumericUpDown^ SpeedSnake;
private: System::Windows::Forms::Label^ label2;
private: System::Windows::Forms::PictureBox^ GranitsUp;
private: System::Windows::Forms::PictureBox^ GranitsDown;
private: System::Windows::Forms::PictureBox^ GranitsLeft;
private: System::Windows::Forms::PictureBox^ GranitsRight;
private: System::Windows::Forms::Timer^ timer;
private: System::Windows::Forms::Label^ Gameover;
private: System::Windows::Forms::ToolStripMenuItem^ выбратьДругуюИгруToolStripMenuItem;
private: System::Windows::Forms::TextBox^ textBox1;
private: System::Windows::Forms::PictureBox^ pictureBox1;
private: System::ComponentModel::IContainer^ components;
private:
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
this->components = (gcnew System::ComponentModel::Container());
System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(MyForm::typeid));
this->menuStrip1 = (gcnew System::Windows::Forms::MenuStrip());
this->менюToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->новаяИграToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->паузаСтартToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->настройкиToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->информацияОИгреToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->выходToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->выбратьДругуюИгруToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
this->Skore = (gcnew System::Windows::Forms::Label());
this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());
this->textBox1 = (gcnew System::Windows::Forms::TextBox());
this->Nastroyki = (gcnew System::Windows::Forms::GroupBox());
this->button1 = (gcnew System::Windows::Forms::Button());
this->SpeedSnake = (gcnew System::Windows::Forms::NumericUpDown());
this->label2 = (gcnew System::Windows::Forms::Label());
this->GranitsUp = (gcnew System::Windows::Forms::PictureBox());
this->GranitsDown = (gcnew System::Windows::Forms::PictureBox());
this->GranitsLeft = (gcnew System::Windows::Forms::PictureBox());
this->GranitsRight = (gcnew System::Windows::Forms::PictureBox());
this->timer = (gcnew System::Windows::Forms::Timer(this->components));
this->Gameover = (gcnew System::Windows::Forms::Label());
this->menuStrip1->SuspendLayout();
this->groupBox1->SuspendLayout();
(cli::safe_cast(this->pictureBox1))->BeginInit();
this->Nastroyki->SuspendLayout();
(cli::safe_cast(this->SpeedSnake))->BeginInit();
(cli::safe_cast(this->GranitsUp))->BeginInit();
(cli::safe_cast(this->GranitsDown))->BeginInit();
(cli::safe_cast(this->GranitsLeft))->BeginInit();
(cli::safe_cast(this->GranitsRight))->BeginInit();
this->SuspendLayout();
this->menuStrip1->ImageScalingSize = System::Drawing::Size(20, 20);
this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(4) {
this->менюToolStripMenuItem,
this->информацияОИгреToolStripMenuItem, this->выходToolStripMenuItem, this->выбратьДругуюИгруToolStripMenuItem
});
this->menuStrip1->Location = System::Drawing::Point(0, 0);
this->menuStrip1->Name = L"menuStrip1";
this->menuStrip1->Size = System::Drawing::Size(559, 28);
this->menuStrip1->TabIndex = 0;
this->menuStrip1->Text = L"menuStrip1";
// менюToolStripMenuItem
this->менюToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(3) {
this->новаяИграToolStripMenuItem,
this->паузаСтартToolStripMenuItem, this->настройкиToolStripMenuItem
});
this->менюToolStripMenuItem->Name = L"менюToolStripMenuItem";
this->менюToolStripMenuItem->Size = System::Drawing::Size(65, 24);
this->менюToolStripMenuItem->Text = L"Меню";
this->новаяИграToolStripMenuItem->Name = L"новаяИграToolStripMenuItem";
this->новаяИграToolStripMenuItem->Size = System::Drawing::Size(177, 26);
this->новаяИграToolStripMenuItem->Text = L"Новая игра";
this->новаяИграToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::новаяИграToolStripMenuItem_Click);
this->паузаСтартToolStripMenuItem->Name = L"паузаСтартToolStripMenuItem";
this->паузаСтартToolStripMenuItem->Size = System::Drawing::Size(177, 26);
this->паузаСтартToolStripMenuItem->Text = L"Пауза\\Старт";
this->паузаСтартToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::паузаСтартToolStripMenuItem_Click);
this->настройкиToolStripMenuItem->Name = L"настройкиToolStripMenuItem";
this->настройкиToolStripMenuItem->Size = System::Drawing::Size(177, 26);
this->настройкиToolStripMenuItem->Text = L"Настройки";
this->настройкиToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::настройкиToolStripMenuItem_Click);
this->информацияОИгреToolStripMenuItem->Name = L"информацияОИгреToolStripMenuItem";
this->информацияОИгреToolStripMenuItem->Size = System::Drawing::Size(165, 24);
this->информацияОИгреToolStripMenuItem->Text = L"Информация о игре";
this->информацияОИгреToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::информацияОИгреToolStripMenuItem_Click);
this->выходToolStripMenuItem->Name = L"выходToolStripMenuItem";
this->выходToolStripMenuItem->Size = System::Drawing::Size(67, 24);
this->выходToolStripMenuItem->Text = L"Выход";
this->выходToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::выходToolStripMenuItem_Click);
this->выбратьДругуюИгруToolStripMenuItem->Name = L"выбратьДругуюИгруToolStripMenuItem";
this->выбратьДругуюИгруToolStripMenuItem->Size = System::Drawing::Size(187, 24);
this->выбратьДругуюИгруToolStripMenuItem->Text = L"Просмотр рекорд игры";
this->выбратьДругуюИгруToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::выбратьДругуюИгруToolStripMenuItem_Click);
this->groupBox1->BackColor = System::Drawing::SystemColors::ControlLightLight;
this->groupBox1->BackgroundImage = (cli::safe_cast(resources->GetObject(L"groupBox1.BackgroundImage")));
this->groupBox1->Controls->Add(this->Skore);
this->groupBox1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
static_cast(204)));
this->groupBox1->ForeColor = System::Drawing::SystemColors::ActiveCaptionText;
this->groupBox1->Location = System::Drawing::Point(23, 45);
this->groupBox1->Name = L"groupBox1";
this->groupBox1->Size = System::Drawing::Size(273, 98);
this->groupBox1->TabIndex = 1;
this->groupBox1->TabStop = false;
this->groupBox1->Text = L"Текущие данные:";
this->Skore->AutoSize = true;
this->Skore->Font = (gcnew System::Drawing::Font(L"Microsoft YaHei", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
static_cast(204)));
this->Skore->Location = System::Drawing::Point(24, 46);
this->Skore->Name = L"Skore";
this->Skore->Size = System::Drawing::Size(87, 27);
this->Skore->TabIndex = 0;
this->Skore->Text = L"Очки: 0";
this->pictureBox1->Image = (cli::safe_cast(resources->GetObject(L"pictureBox1.Image")));
this->pictureBox1->Location = System::Drawing::Point(317, 58);
this->pictureBox1->Name = L"pictureBox1";
this->pictureBox1->Size = System::Drawing::Size(72, 60);
this->pictureBox1->TabIndex = 9;
this->pictureBox1->TabStop = false;
this->textBox1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 16.2F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
static_cast(204)));
this->textBox1->Location = System::Drawing::Point(395, 68);
this->textBox1->Multiline = true;
this->textBox1->Name = L"textBox1";
this->textBox1->ReadOnly = true;
this->textBox1->Size = System::Drawing::Size(51, 42);
this->textBox1->TabIndex = 8;
this->Nastroyki->Controls->Add(this->button1);
this->Nastroyki->Controls->Add(this->SpeedSnake);
this->Nastroyki->Controls->Add(this->label2);
this->Nastroyki->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
static_cast(204)));
this->Nastroyki->Location = System::Drawing::Point(52, 403);
this->Nastroyki->Name = L"Nastroyki";
this->Nastroyki->Size = System::Drawing::Size(458, 176);
this->Nastroyki->TabIndex = 2;
this->Nastroyki->TabStop = false;
this->Nastroyki->Text = L"Настройки";
this->button1->Location = System::Drawing::Point(167, 122);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(146, 36);
this->button1->TabIndex = 2;
this->button1->Text = L"Применить";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
this->SpeedSnake->Location = System::Drawing::Point(276, 63);
this->SpeedSnake->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1000, 0, 0, 0 });
this->SpeedSnake->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 0 });
this->SpeedSnake->Name = L"SpeedSnake";
this->SpeedSnake->Size = System::Drawing::Size(120, 30);
this->SpeedSnake->TabIndex = 1;
this->SpeedSnake->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 0 });
this->label2->AutoSize = true;
this->label2->Location = System::Drawing::Point(6, 63);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(264, 25);
this->label2->TabIndex = 0;
this->label2->Text = L"Текущая скорость змейки:";
this->GranitsUp->BackColor = System::Drawing::SystemColors::ActiveCaptionText;
this->GranitsUp->Location = System::Drawing::Point(3, 149);
this->GranitsUp->Name = L"GranitsUp";
this->GranitsUp->Size = System::Drawing::Size(550, 10);
this->GranitsUp->TabIndex = 3;
this->GranitsUp->TabStop = false;
this->GranitsDown->BackColor = System::Drawing::SystemColors::ActiveCaptionText;
this->GranitsDown->Location = System::Drawing::Point(3, 689);
this->GranitsDown->Name = L"GranitsDown";
this->GranitsDown->Size = System::Drawing::Size(550, 10);
this->GranitsDown->TabIndex = 4;
this->GranitsDown->TabStop = false;
this->GranitsLeft->BackColor = System::Drawing::SystemColors::ActiveCaptionText;
this->GranitsLeft->Location = System::Drawing::Point(3, 149);
this->GranitsLeft->Name = L"GranitsLeft";
this->GranitsLeft->Size = System::Drawing::Size(10, 550);
this->GranitsLeft->TabIndex = 5;
this->GranitsLeft->TabStop = false;
this->GranitsRight->BackColor = System::Drawing::SystemColors::ActiveCaptionText;
this->GranitsRight->Location = System::Drawing::Point(543, 149);
this->GranitsRight->Name = L"GranitsRight";
this->GranitsRight->Size = System::Drawing::Size(10, 550);
this->GranitsRight->TabIndex = 6;
this->GranitsRight->TabStop = false;
this->timer->Tick += gcnew System::EventHandler(this, &MyForm::MyForm_Update);
this->Gameover->AutoSize = true;
this->Gameover->Font = (gcnew System::Drawing::Font(L"MV Boli", 19.8F, static_cast((System::Drawing::FontStyle::Bold | System::Drawing::FontStyle::Italic)),
System::Drawing::GraphicsUnit::Point, static_cast(0)));
this->Gameover->Location = System::Drawing::Point(93, 270);
this->Gameover->Name = L"Gameover";
this->Gameover->Size = System::Drawing::Size(394, 88);
this->Gameover->TabIndex = 7;
this->Gameover->Text = L"Game over! \r\nПерезапустите игру";
this->Gameover->TextAlign = System::Drawing::ContentAlignment::TopCenter;
this->Gameover->Visible = false;
this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->BackgroundImage = (cli::safe_cast(resources->GetObject(L"$this.BackgroundImage")));
this->ClientSize = System::Drawing::Size(559, 703);
this->Controls->Add(this->pictureBox1);
this->Controls->Add(this->Gameover);
this->Controls->Add(this->textBox1);
this->Controls->Add(this->GranitsRight);
this->Controls->Add(this->GranitsLeft);
this->Controls->Add(this->GranitsDown);
this->Controls->Add(this->GranitsUp);
this->Controls->Add(this->Nastroyki);
this->Controls->Add(this->groupBox1);
this->Controls->Add(this->menuStrip1);
this->ForeColor = System::Drawing::SystemColors::ControlText;
this->Icon = (cli::safe_cast(resources->GetObject(L"$this.Icon")));
this->MainMenuStrip = this->menuStrip1;
this->MaximizeBox = false;
this->Name = L"MyForm";
this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
this->Text = L"Game \"Snake\"";
this->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &MyForm::MyForm_KeyDown);
this->menuStrip1->ResumeLayout(false);
this->menuStrip1->PerformLayout();
this->groupBox1->ResumeLayout(false);
this->groupBox1->PerformLayout();
(cli::safe_cast(this->pictureBox1))->EndInit();
this->Nastroyki->ResumeLayout(false);
this->Nastroyki->PerformLayout();
(cli::safe_cast(this->SpeedSnake))->EndInit();
(cli::safe_cast(this->GranitsUp))->EndInit();
(cli::safe_cast(this->GranitsDown))->EndInit();
(cli::safe_cast(this->GranitsLeft))->EndInit();
(cli::safe_cast(this->GranitsRight))->EndInit();
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
// Данные игры
private: PictureBox^ fruit; // Фрукт который будет есть змейка
private: array ^ Snake;// Сама змейка
private: bool play; //Играть
private: bool die; // Смерть
private: bool firstStart; // Первый запуск
private: int step = 10; // Шаг
private: float Interval = 100;// Интервал обновления
private: int skore = 0; // Счёт
// Действия игры
private: void Frukt()//Генерируем случайную позицию фрукту
{Random^ rand = gcnew Random();//подключаем рандом для случайной точки полявления фрукта
positionFruit.X = rand->Next(20, gameArea.X);//10 - смещение относительно боков формы
positionFruit.Y = rand->Next(160, gameArea.Y);//90 - смещение верхней граници относительно верха формы
//Проверка, чтобы фрукт не создался на змейке
for (int i = 0; i < skore; i++)// ждя каждого элемента змейки проверяем генерацию фрукта
{if (positionFruit.X == Snake[i]->Location.X && positionFruit.Y == Snake[i]->Location.Y)// если фрукт есть на теле то...Frukt();// гинерируем новый фрукт}
//Преобразуем значение, чтобы было кратно шагу
int tempX = positionFruit.X % step; positionFruit.X -= tempX;
int tempY = positionFruit.Y % step; positionFruit.Y -= tempY;
//Присваеваем пизицию фрукту
fruit->Location = Point(positionFruit.X, positionFruit.Y);
//Добавляем объект на форму
this->Controls->Add(fruit);
}
private: void Eating()//прописываем события когда змейка ест
{
//Проверим позицию головы змеи и позицию фрукта
if (Snake[0]->Location.X == positionFruit.X && Snake[0]->Location.Y == positionFruit.Y)
{
Skore->Text = "Счет: " + ++skore;// каждый съеденный фрукт увеличивает тело змейки
//Добавляем новый элемент змейке
Snake[skore] = gcnew PictureBox();// помещаем новый элемент на область игры
// каждый новый элемент будет становится в конце змейке поэтому Snake[skore - 1]
Snake[skore]->Location = Point(Snake[skore - 1]->Location.X + step * direction.X, Snake[skore - 1]->Location.Y - step * direction.Y);
Snake[skore]->BackColor = Color::Blue;//цвет тела будет синий
Snake[skore]->Width = step;//высота равна шагу
Snake[skore]->Height = step;//ширина также кратно шагу
this->Controls->Add(Snake[skore]);//собираем пазл из того что написали
Frukt();// после съеденного фрукта гинерируем новый
}
}
private: void Movement()//события происходящие в игровом поле
{
//Двигаем каждый компонет змейки
for (int i = skore; i >= 1; i--)
{
Snake[i]->Location = Snake[i - 1]->Location;//каждый элемент змейки будет идти за последний относительно головы
}
Snake[0]->Location = Point(Snake[0]->Location.X + direction.X * step, Snake[0]->Location.Y + direction.Y * step);//каждый элемент по движению змейки будет становится на место предыдущего
}
private: void SelfEating()//событие если змейка сьела сама себя
{
//Проверяем позицию каждой части змейки
for (int i = 1; i < skore; i++)
{
if (Snake[0]->Location == Snake[i]->Location)
{
GameOver();
}
} }
private: void GameOver()//теперь прописываем события сомого конца игры
{
play = true;
die = true;
Gameover->Visible = true;
}
private: void NewGame()//событие начала новой игры
{
//Если новой игры был тот очищаем элементы
if (!firstStart)
{
this->Controls->Remove(fruit);//кдаляем фрукт for (int i = 0; i <= skore; i++)//для каждого элемента змейкии...
{
this->Controls->Remove(Snake[i]);//удаляем змейку
} skore = 0;//обнуляем счёт
}
else
firstStart = false;//если новои игры не было то ничего не делаем //Инициализируем змейку
Snake = gcnew array (400);//поле игры 400
Snake[0] = gcnew PictureBox();// элементы змейки на PictureBox
Snake[0]->Location = Point(200, 200);
Snake[0]->BackColor = Color::Green;//голова будет зеленой, чтобы отличалась от всех
Snake[0]->Width = step;//высота змейки кратно
Snake[0]->Height = step;//ширина кратно шагу skore = 0;//счёт 0
this->Controls->Add(Snake[0]); //Инициализируем фрукт
fruit = gcnew PictureBox();//фрукт создается в игровом поле
fruit->BackColor = Color::Red;//цвет фрукта красный
fruit->Width = step;//высота кратно шагу
fruit->Height = step;//ширина кратно шагу
Frukt();//гинерируем фрукт
//Задаем интревал обнавления и запускаем таймер для обнавления
timer->Interval = Interval;//обновление таймера в зависимости от настроек
timer->Start();//запуск таймера //Задаем направление на запуске
direction.X = 1;
direction.Y = 0; //Можно грать
play = true;
die = false; Skore->Text = "Счет: 0"; //Скрываем не нужные компоненты на форме
Gameover->Visible = false;
Nastroyki->Visible = false;
textBox1->Visible = false;
pictureBox1->Visible = false;
System::Media::SoundPlayer^ player1 = gcnew System::Media::SoundPlayer("D:\\Ringtongs\\song2.wav");//Подключение переменных для воспроизведение фоновой музыки
player1->Load();//запуск музыки
player1->Play(); }
private: void ChackBorders()//проверка столкновения с границами игрового поля
{
if (Snake[0]->Location.X >= GranitsRight->Location.X || Snake[0]->Location.X <= GranitsLeft->Location.X)
{
GameOver();
} if (Snake[0]->Location.Y <= GranitsUp->Location.Y || Snake[0]->Location.Y >= GranitsDown->Location.Y)
{
GameOver();
}
} private: System::Void выходToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)// кнопка выход закрываем форму
{
Application::Exit();
}
private: System::Void информацияОИгреToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)//кнопка информация для ознакомления правил игры
{
MessageBox::Show("Правила игры:\n1. Для управления использовать стрелки клавиатуры\n2. Ешь как можно больше фруктов для набора счета и увеличения змейки\n3. Нельзя есть себя и врезаться в стенки\n", "Правила игры!"); return System::Void();
}
private: System::Void новаяИграToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)//кнопка новая игра для начала новой игры
{
NewGame(); return System::Void();
}
private: System::Void паузаСтартToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)//кнопка пауза старт
{
if (play)// если игра идёт
{
play = false;//приостанавливаем игру
}
else//иначе
{
play = true;//запускаем игру
timer->Start();//запускаем таймер
} return System::Void();
}
private: System::Void настройкиToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)//кнопка настройки
{
if (Nastroyki->Visible == false) //если настройки не видны то...
{
play = false;//Приостанавливаем игру button1->Enabled = true;//кнопка применить не видеть
SpeedSnake->Enabled = true;//скорость змейки применить в соотвествии с выбраной скоростью
Nastroyki->Visible = true;//настройки не видеть
}
else //иначе
{
play = true;//запускаем игру
timer->Start();//запускаем таймер для движения змейки //лишнее скрываем
button1->Enabled = false;
SpeedSnake->Enabled = false;
Nastroyki->Visible = false;
}
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)//события кнопки "применить" в настройках
{
Interval = Convert::ToSingle(SpeedSnake->Value);//интервал обновления булет соотвествовать числу выбранному в настройках
timer->Interval = Interval;//соотвествено обновление таймера зависит от интервала //скрываем не нужные вещи с формы
button1->Enabled = false;
SpeedSnake->Enabled = false;
Nastroyki->Visible = false; //Запускаем игру
play = true;
timer->Start(); return System::Void();
}
private: System::Void MyForm_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e)//прописываем событие самой формы по нажатию клавишь управления
{
//Считываем нажатую клавишу
if (e->KeyCode.ToString() == "Right")//правая кнопка
{direction.X = 1; direction.Y = 0;}
else if (e->KeyCode.ToString() == "Left")//левая кнопка
{direction.X = -1; direction.Y = 0;}
else if (e->KeyCode.ToString() == "Up") //кнопка вверх
{direction.Y = -1;direction.X = 0;}
else if (e->KeyCode.ToString() == "Down")//кнопка вниз
{
direction.Y = 1;
direction.X = 0;
}
return System::Void();
}
private: void MyForm_Update(Object^ obgect, EventArgs^ e)//обновление формы
{
if (!die && play) ///если змейка не умерла и играет то..
{
//Задает движение змейки
Movement();
Eating();//проверка, что съели фрукт
SelfEating();//проверка, что съел себя
ChackBorders();//проверка на столкновение с стеной
}
else if (die && play)//иначе, если мертва и играет
{timer->Stop();//останавливаем таймер
MessageBox::Show("Игра окончена!", "Внимание!");//выводим сообщение о конце игры}
else if (!play && !die)//иначе, ели не играет но и не умерла то...
{timer->Stop();//останавливаем таймер MessageBox::Show("Игра приостановлена!", "Внимание!");//приостанавливаем игру и выводим соотвествующие сообщение
}}
private: System::Void выбратьДругуюИгруToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
//собитие просмтра рекорда игры
{if (textBox1->Visible == false)
{//Приостанавливаем игру
play = false; SpeedSnake->Enabled = true;
textBox1->Visible = true;
pictureBox1->Visible = true;}
else
{//Запускаем игру
play = true;
timer->Start();
SpeedSnake->Enabled = false;
textBox1->Visible = false;
pictureBox1->Visible = false;}
if (die)//если змейка умерла то...
{System::IO::StreamWriter^ fp = System::IO::File::AppendText("file.txt");//создаём пееменну где хранится файл для записи результатов игры
fp->WriteLine(skore);//каждая запись записывается в конец файла, данные берём из счёта
fp->Close();//закрываем файл для что бы не боло ошибки}
System::IO::StreamReader^ sr = gcnew System::IO::StreamReader("file.txt");// создаём новую переменную через которую будем открывать файл
int String;//переменная для сравнения данных в файле
int max;//переменная сравнения
while (!sr->EndOfStream)//пока идем до конца файла...
{
for (int i = 0; i <= 1000; i++)//для сравнения
{
if (System::Int32::TryParse(sr->ReadLine(), String))//если чтение и преобразование удалось
if (String > max) //если строка меньше max по большей стороне
{
max = String;//то данное число является максимальным
}
} textBox1->Text = Convert::ToString(max) + Environment::NewLine;//создаём новую строку в TextBox и записываем максимальное число
max = 0;//изночально 0
}
return System::Void();
}
};}
П1.1 Программный код программы
ПРИЛОЖЕНИЕ 2.
Блок схема работы программы
Рисунок П2.1 – Блок-схема программы
ПРИЛОЖЕНИЕ 3
Рисунок П3.1. Представлена основная форма, которая появляется при запуске программы. Запуск программы — это автоматический запуск игры так что при игре это нужно учитывать.
Рисунок П3.2. Демонстрация действия игры при проигрыше. При конце игры программы выдаёт соответствующие сообщение о конце игры и останавливает игру. При желании начать игру сначала игрок должен перейти в меню формы и нажать на кнопку «Новая игра».
Рисунок П3.3. Демонстрация кнопки «Настройки» в меню формы. При нажатии данной кнопки приостанавливается игра если она не закончена и выводится соответствующие сообщение. Далее игрок может выбрать скорость змейки в миллисекундах.
Рисунок П3.4. Демонстрация правил игры при нажатии кнопки «Информация о игре»
Рисунок П3.5. При нажатии кнопки «Просмотр рекорда игры» появляется кубок с полем, где написан наибольшей результат игры.
|