Главная страница

сапер. Создание игры сапер


Скачать 230 Kb.
НазваниеСоздание игры сапер
Дата17.05.2022
Размер230 Kb.
Формат файлаdoc
Имя файласапер.doc
ТипКурсовой проект
#533951


КУРСОВОЙ ПРОЕКТ


ТЕМА: Создание игры САПЕР

Выполнил:

Проверил:

2022 г.

ВВЕДЕНИЕ



Данная работа является реализацией логической игры Сапёр. Данное приложение было названо Mines (в переводе с англ. - мины). Программа выполнена на объектно-ориентированном языке программирования C++ в среде разработки Microsoft Visual C++ 2008, является высокоэффективной, компактной и быстрой.

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

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

Игра Сапёр очень популярна и в данный момент существует много версий этой игры, написанных на разных языках программирования начиная от ассемблера и заканчивая Java. Есть также версии для разных операционных систем, а также для Internet и мобильных телефонов.

В данной работе реализованы многие технологии и решены проблемы, с которыми придётся столкнуться программистам при разработке программ в реальной жизни, такие как создание окна и его элементов, обработка сообщений Windows, рисование изображений, работа с системным реестром, использование ресурсов. Применено большое количество возможностей, которые предоставляет такой богатый язык как C++.
1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
При проектировании данной работы стал вопрос о методе реализации программы. Необходимо было выбрать, гибкий язык программирования, который бы предоставлял необходимые возможности для быстрого создания игры Сапёр, и в то же время достаточно эффективный, чтобы писать быстрые программы. Так как C++ полностью удовлетворяет этим требованиям, и был мною изучен более полно, чем Pascal и ассемблер, я выбрал именно его. Теперь рассмотрим чем же привлекателен C++.

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

Ключевым понятием C++ является класс. Класс – это тип, определяемый пользователем. Классы обеспечивают скрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций. C++ предоставляет гораздо лучшие, чем в C, средства выражения модульности программы и проверки типов. В языке есть также усовершенствования, не связанные непосредственно с классами, включающие в себя символические константы, inline-подстановку функций, параметры функции по умолчанию, перегруженные имена функций, операции управления свободной памятью и ссылочный тип.

В C++ сохранены возможности языка C по работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем.

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

После выбора языка программирования необходимо было выбрать среду разработки, в которой он был бы наиболее полно и эффективно реализован и предоставляющую необходимые средства для быстрого написания программного кода, эффективной компиляции и компоновки и удобного программирования приложений под Windows. В наибольшей степени этим требованиям удовлетворяют Microsoft Visual C++ и Borland C++ Builder. Рассмотрим некоторые особенности этих компиляторов.

C++ Builder – продукт компании Borland, представляющий собой так называемое средство RAD (средство быстрой разработки приложений), позволяющее в короткие сроки создавать программы для Windows на языке C++. В основе программирования на C++ Builder лежит библиотека VCL (библиотека визуальных компонентов), написанная на Object Pascal. Она содержит большое количество классов разного назначения, которые инкапсулируют работу программного интерфейса и поднимают программирование приложений на более высокий уровень абстракции.

Borland C++ Builder обеспечивает быстрое создание интерфейса программы и возможность легко вносить в него изменения даже на заключительных этапах проектирования приложений. Всё это создаёт благоприятные условия для создания Windows-приложений.

Реализация языка C++ в Borland C++ Builder отличается от принятых стандартов и включает в себя некоторые модификации и дополнения. Это в основном связано с компонентно-ориентированным принципом создания приложений (“перетаскивание” элементов управления прямо на форму).

Как видно, фундаментальные основы, заложенные в Microsoft Visual C++ и Borland C++ Builder, несколько отличаются, что даёт повод для размышлений над эффективностью данных компиляторов и того, насколько каждый из них подходит для реализации именно такой игры, как Сапёр. После некоторых размышлений и опытов я пришла к выводу, что Visual C++ 2008 - наиболее подходящая среда разработки для создания данной программы. Вот те причины, которые определили мой выбор.

  • Microsoft Visual C++ не использует те расширения языка C++, которые введены в C++ Builder и максимально соответствует стандартам, принятым для языка C++.

  • Алгоритм компиляции в Microsoft Visual C++ эффективнее чем в Borland C++ Builder о чём можно судить по размеру и работе программ (при соответствии программного кода, настроек компилятора и других условий), во всяком случае при создании небольших приложений для Windows.

  • Алгоритм анализа программного кода также более совершенен в Microsoft Visual C++ и компиляция программ происходит намного быстрее.

  • Большинство профессиональных программистов используют Visual C++ и, безусловно, опыт, полученный при написании программ в этой среде разработки, благоприятно скажется на моём дальнейшем изучении программирования.

Я хочу подчеркнуть, что не говорю о полном превосходстве Microsoft Visual C++ или о том, что всегда стоит использовать только его. Просто для реализации именно этой программы он, по моему мнению, наиболее подходит.

2. Создание программы



Правила и цель игры

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

Работа программы

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

Интерфейс программы

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

Программа Сапер имеет графический интерфейс, основанный на окнах. Окно имеет заголовок, системное меню, кнопки для закрытия и минимизирования окна.


Рис. 3.1 Интерфейс программы Сапер
На форме расположены меню программы, игровое поле, разбитое на клетки, находится в центре, сверху в центре кнопка, для запуска новой игры. Размер формы изменяется в соответствии с размером игрового поля.

Меню программы состоит из пунктов «Игра» и «Уровень» – выпадающее меню. При выборе пункта «Игра» появляется меню, содержащее пункты:

  1. Новая игра

  2. Выход

При выборе пункта «Уровень» появляется меню:

1.Новичок

2. Любитель

3. Профессионал

4. Особые

Выбор пункта «Новая игра» означает создание нового поля мин. Выбор пунктов меню «Уровень» означает выбор сложности игры. «Новичок» - поле 8x9, 5 мин, «Любитель» - 15x18x30, «Профессионал» - 20x25x50, «Особые» позволяет настроить другую сложность игры. Появляются три textbox для ввода параметров пользователя (поле от 3x3 до 20x25). Вид программы при выборе пункта «Особые» изображен на рисунке 3.2. При выборе «Выход» программа завершает работу.


Рис. 3.1 Интерфейс программы Сапер при выборе меню «Особые»
Нажатие на кнопку «New Game» равносильно выбора пункта меню «Новая игра». Если начата новая игра, то нажатие на одну из ячеек левой кнопкой мыши приводит к открытию клетки.
Ход создания проекта

Данная работа была выполнена на компиляторе Visual C++.

Для создания этой программы был начат новый проект CLR, в него был добавлен файл Form1.h, в которых находятся объявление и реализация класса и другие функции, связанные с созданием и использованием оконного интерфейса. После тщательной разработки и отладки проект приобрёл тот вид, в котором он находится сейчас.

Структура программы

Структуры и классы

В основе программы Сапер лежит классы Form1. Ниже приводится краткое описание его свойств и методов, кроме самых очевидных.

void Create(int n,int m, int kolmin)

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

void Poi(System::Object^ sender, System::EventArgs^ e)

Вызывается при нажатии на кнопку игрового поля. Получает кооринаты кнопки и смотрит на состояние ячейки с такими координатами в математическом массиве.

void Poisk(int i,int j)

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

pBut

Массив указателей на ячейки.

intm

Количество ячеек на поле по горизонтали.

intn

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

intkolmin

Количество мин на поле.

intcount

Количество открытых ячеек. Увеличивается при открытии очередной ячейки.int a^[n][m]

Массив значений ячеек.

Работа функций

Ниже описываются важные моменты работы методов класса.

Void Form1_Load(System::Object^ sender, System::EventArgs^ e)

Когда открывается прорамма, полям класса присваиваются парамметры по умолчанию и начинается игра. При этом вызывается функция Create(), которая создает в аналоге динамического массива кнопок (математическом массиве a типа int) мины и расставляет цифры в этом же массиве в соответсятвии с располажением мин.

Void button1_Click(System::Object^ sender, System::EventArgs^ e)

Запуск новой игры. Этот метод аналогичен методу Form1_Load. Уровень сложности остается таким же, каким был на предыдущем этапе игры.

V

oid новаяИграToolStripMenuItem_Click(System::Object^sender, System::EventArgs^ e)

Функция полностью одинакова с предыдущей.

Void новичокToolStripMenuItem_Click(System::Object^sender, System::EventArgs^ e)

Void сложнаяToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)

Void любительToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)

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

Void особыеToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)

Вызов новой игры с заданием параметров игроком. Расширяется окно программы и три textBox с label и кнопкой «ОК» становятся видимыми. Пользователь может занести свои парамметры и при нажатии на кнопку «ОК», будет запущена новая игра с параметрами поля, заданными пользователем. Метод освобождает динамическую память выделенную на предыдущей игре, и создает массивы с полями класса Form1 заданными пользователем. При этом размаер игрового окна изменяется в соответствии с изменением размера игрового поля.

Void button2_Click(System::Object^ sender, System::EventArgs^ e)

Вызывается при нажатии на кнопку «ОК». Создает новое игровое поле в соответствии с параметрами указанными пользователем в textBox.

Void выходToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)

Метод класса Form1 обеспечивае выход из игры.

Инструкция по использованию

Программа не требует установки, достаточно скопировать её на жесткий диск компьютера. Запустить с помощью любой файловой оболочки.

Выводы

При выполнении курсовой роботы была написана программа Сапер, удовлетворяющая необходимым требованиям эффективности. При выполнении были приобретены и закреплены знания, полученные при изучении курса "Основы программирования и алгоритмические языки", навыки работы с интегрированной средой программирования Microsoft Visual C++, был получен опыт программирование Windows-приложений.

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

программа сапер логический
ПРИЛОЖЕНИЕ
Исходный текст программы
// dynamicExample.cpp : main project file.

#include "stdafx.h"

#include "Form1.h"

using namespace dynamicExample;

[STAThreadAttribute]

int main(array ^args)

{

// Enabling Windows XP visual effects before any controls are created

Application::EnableVisualStyles();

Application::SetCompatibleTextRenderingDefault(false);

// Create the main window and run it

Application::Run(gcnew Form1());

return 0;

#pragma once

#include

#include

namespace dynamicExample {

using namespace System;

using namespace System::ComponentModel;

using namespace System::Collections;

using namespace System::Windows::Forms;

using namespace System::Data;

using namespace System::Drawing;

///

/// Summary for Form1

///

/// WARNING: If you change the name of this class, you will need to change the

/// 'Resource File Name' property for the managed resource compiler tool

/// associated with all .resx files this class depends on. Otherwise,

/// the designers will not be able to interact properly with localized

/// resources associated with this form.

///


public ref class Form1 : public System::Windows::Forms::Form

{

public:

Form1(void)

{

InitializeComponent();

//

//TODO: Add the constructor code here

//

}

public:

int **a;//[200][200];

int n;

int m;

int kolmin;

int count;

private: System::Windows::Forms::MenuStrip^ menuStrip1;

private: System::Windows::Forms::ToolStripMenuItem^ играToolStripMenuItem;

private: System::Windows::Forms::ToolStripMenuItem^ новаяИграToolStripMenuItem;

private: System::Windows::Forms::ToolStripMenuItem^ выходToolStripMenuItem;

private: System::Windows::Forms::TextBox^ textBox1;

private: System::Windows::Forms::TextBox^ textBox2;

private: System::Windows::Forms::TextBox^ textBox3;

private: System::Windows::Forms::Label^ label1;

private: System::Windows::Forms::Button^ button1;

private: System::Windows::Forms::Label^ label2;

private: System::Windows::Forms::Label^ label3;

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::Button^ button2;

public:

array^ pBut;

protected:

///

/// Clean up any resources being used.

///


Form1()

{

if (components)

{

delete components;

}

}

protected:

private:

///

/// Required designer variable.

///


System::ComponentModel::Container ^components;

#pragma region Windows Form+ Designer generated code

///

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

///


void InitializeComponent(void)

{

System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::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->особыеToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());

this->textBox1 = (gcnew System::Windows::Forms::TextBox());

this->textBox2 = (gcnew System::Windows::Forms::TextBox());

this->textBox3 = (gcnew System::Windows::Forms::TextBox());

this->label1 = (gcnew System::Windows::Forms::Label());

this->button1 = (gcnew System::Windows::Forms::Button());

this->label2 = (gcnew System::Windows::Forms::Label());

this->label3 = (gcnew System::Windows::Forms::Label());

this->button2 = (gcnew System::Windows::Forms::Button());

this->menuStrip1->SuspendLayout();

this->SuspendLayout();

//

// menuStrip1

//

this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(2) {this->играToolStripMenuItem,

this->уровеньToolStripMenuItem});

this->menuStrip1->Location = System::Drawing::Point(0, 0);

this->menuStrip1->Name = L"menuStrip1";

this->menuStrip1->Padding = System::Windows::Forms::Padding(8, 2, 0, 2);

this->menuStrip1->Size = System::Drawing::Size(617, 26);

this->menuStrip1->TabIndex = 4;

this->menuStrip1->Text = L"menuStrip1";

//

// играToolStripMenuItem

//

this->играToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(2) {this->новаяИграToolStripMenuItem,

this->выходToolStripMenuItem});

this->играToolStripMenuItem->Name = L"играToolStripMenuItem";

this->играToolStripMenuItem->Size = System::Drawing::Size(52, 22);

this->играToolStripMenuItem->Text = L"Игра";

//

// новаяИграToolStripMenuItem

//

this->новаяИграToolStripMenuItem->Name = L"новаяИграToolStripMenuItem";

this->новаяИграToolStripMenuItem->Size = System::Drawing::Size(168, 22);

this->новаяИграToolStripMenuItem->Text = L"Новая игра";

this->новаяИграToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::новаяИграToolStripMenuItem_Click);

//

// выходToolStripMenuItem

//

this->выходToolStripMenuItem->Name = L"выходToolStripMenuItem";

this->выходToolStripMenuItem->Size = System::Drawing::Size(168, 22);

this->выходToolStripMenuItem->Text = L"Выход";

this->выходToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::выходToolStripMenuItem_Click);

//

// уровеньToolStripMenuItem

//

this->уровеньToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(4) {this->новичокToolStripMenuItem,

this->лбительToolStripMenuItem, this->профессионалToolStripMenuItem, this->особыеToolStripMenuItem});

this->уровеньToolStripMenuItem->Name = L"уровеньToolStripMenuItem";

this->уровеньToolStripMenuItem->Size = System::Drawing::Size(77, 22);

this->уровеньToolStripMenuItem->Text = L"Уровень";

//

// новичокToolStripMenuItem

//

this->новичокToolStripMenuItem->Name = L"новичокToolStripMenuItem";

this->новичокToolStripMenuItem->Size = System::Drawing::Size(191, 22);

this->новичокToolStripMenuItem->Text = L"Новичок";

this->новичокToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::новичокToolStripMenuItem_Click);

//

// лбительToolStripMenuItem

//

this->лбительToolStripMenuItem->Name = L"лбительToolStripMenuItem";

this->лбительToolStripMenuItem->Size = System::Drawing::Size(191, 22);

this->лбительToolStripMenuItem->Text = L"Лбитель";

this->лбительToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::лбительToolStripMenuItem_Click);

//

// профессионалToolStripMenuItem

//

this->профессионалToolStripMenuItem->Name = L"профессионалToolStripMenuItem";

this->профессионалToolStripMenuItem->Size = System::Drawing::Size(191, 22);

this->профессионалToolStripMenuItem->Text = L"Профессионал";

this->профессионалToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::профессионалToolStripMenuItem_Click);

//

// особыеToolStripMenuItem

//

this->особыеToolStripMenuItem->Name = L"особыеToolStripMenuItem";

this->особыеToolStripMenuItem->Size = System::Drawing::Size(191, 22);

this->особыеToolStripMenuItem->Text = L"Особые";

this->особыеToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::особыеToolStripMenuItem_Click);

//

// textBox1

//

this->textBox1->Location = System::Drawing::Point(6, 492);

this->textBox1->Margin = System::Windows::Forms::Padding(4);

this->textBox1->Name = L"textBox1";

this->textBox1->Size = System::Drawing::Size(54, 22);

this->textBox1->TabIndex = 5;

//

// textBox2

//

this->textBox2->Location = System::Drawing::Point(135, 492);

this->textBox2->Margin = System::Windows::Forms::Padding(4);

this->textBox2->Name = L"textBox2";

this->textBox2->Size = System::Drawing::Size(56, 22);

this->textBox2->TabIndex = 6;

//

// textBox3

//

this->textBox3->Location = System::Drawing::Point(255, 491);

this->textBox3->Margin = System::Windows::Forms::Padding(4);

this->textBox3->Name = L"textBox3";

this->textBox3->Size = System::Drawing::Size(60, 22);

this->textBox3->TabIndex = 7;

//

// label1

//

this->label1->AutoSize = true;

this->label1->Location = System::Drawing::Point(3, 471);

this->label1->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);

this->label1->Name = L"label1";

this->label1->Size = System::Drawing::Size(57, 17);

this->label1->TabIndex = 8;

this->label1->Text = L"Высота";

//

// button1

//

this->button1->Location = System::Drawing::Point(6, 29);

this->button1->Name = L"button1";

this->button1->Size = System::Drawing::Size(117, 38);

this->button1->TabIndex = 9;

this->button1->Text = L"New Game";

this->button1->UseVisualStyleBackColor = true;

this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click_1);

//

// label2

//

this->label2->AutoSize = true;

this->label2->Location = System::Drawing::Point(132, 470);

this->label2->Name = L"label2";

this->label2->Size = System::Drawing::Size(59, 17);

this->label2->TabIndex = 10;

this->label2->Text = L"Ширина";

//

// label3

//

this->label3->AutoSize = true;

this->label3->Location = System::Drawing::Point(252, 471);

this->label3->Name = L"label3";

this->label3->Size = System::Drawing::Size(78, 17);

this->label3->TabIndex = 11;

this->label3->Text = L"Число мин";

//

// button2

//

this->button2->Location = System::Drawing::Point(355, 471);

this->button2->Name = L"button2";

this->button2->Size = System::Drawing::Size(46, 43);

this->button2->TabIndex = 12;

this->button2->Text = L"ОК";

this->button2->UseVisualStyleBackColor = true;

this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);

//

// Form1

//

this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);

this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

this->AutoSizeMode = System::Windows::Forms::AutoSizeMode::GrowAndShrink;

this->BackColor = System::Drawing::SystemColors::ActiveCaptionText;

this->BackgroundImage = (cli::safe_cast(resources->GetObject(L"$this.BackgroundImage")));

this->ClientSize = System::Drawing::Size(617, 526);

this->Controls->Add(this->button2);

this->Controls->Add(this->label3);

this->Controls->Add(this->label2);

this->Controls->Add(this->button1);

this->Controls->Add(this->label1);

this->Controls->Add(this->textBox3);

this->Controls->Add(this->textBox2);

this->Controls->Add(this->textBox1);

this->Controls->Add(this->menuStrip1);

this->MainMenuStrip = this->menuStrip1;

this->Margin = System::Windows::Forms::Padding(4);

this->Name = L"Form1";

this->Text = L"Сапер";

this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);

this->menuStrip1->ResumeLayout(false);

this->menuStrip1->PerformLayout();

this->ResumeLayout(false);

this->PerformLayout();

}

#pragma endregion

//private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

//

// }

public:void Create(int n,int m,int k1)

{

int i,j;

for( i=0;i
{

for( j=0;j
{

a[i][j]=0;

}

}

int k=0;

srand(time(NULL));

do {

int i=rand()%n;

int j=rand()%m;

if(a[i][j]!=9)

{ a[i][j]=9; k++;

for(int i1=i-1;i1<=i+1; i1++)

for(int j1=j-1;j1<=j+1; j1++)

if( (i1>=0) && (j1>=0) && (i1
&& (a[i1][j1]!=9)) a[i1][j1]++;

}

} while (k!=k1 );

}

public: void Poisk(int i,int j)

{

if (a[i][j]<10)

{

if(a[i][j]==0)

{

a[i][j]+=10;

if ((i+1)
if ((j+1)
if ((i-1)>=0) Poisk(i-1,j);

if ((j-1)>=0) Poisk(i,j-1);

if ((i+1)=0) Poisk(i+1,j-1);

if ((i+1)
if ((i-1)>=0 && (j+1)
if ((i-1)>=0 &&(j-1)>=0) Poisk(i-1,j-1);

}else a[i][j]+=10;

}

}

public: void Poi(System::Object^ sender, System::EventArgs^ e)

{ System::Windows::Forms::Button^ butt = gcnew System::Windows::Forms::Button();

butt=((Button^)sender);

String^ s=((Button^)sender)->Tag->ToString() ;

int k = Convert::ToInt32(s);

int i=k/m;

int j=k%m;

if(a[i][j]==9)

{

butt->Image=System::Drawing::Image::FromFile(L"4.bmp");

for(int i=0;i
for (int j=0; j
{ int k1=i*m+j;

if(a[i][j]==9)

{

this->pBut[k1]->Image=System::Drawing::Image::FromFile(L"4.bmp");

}

if( (a[i][j]>0) && (a[i][j]<9))

this->pBut[k1]->Text=a[i][j].ToString();

if(a[i][j]==0) //this->pBut[k1]->Visible=false;

this->pBut[k1]->Image=System::Drawing::Image::FromFile(L"0.bmp");

}

MessageBox::Show( "Вы проиграли", "Проигрыш",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation );

}

else

if((a[i][j]>0)&& (a[i][j]<9))

{

butt->Text=a[i][j].ToString();

count++;

if(count==(n*m-kolmin))

{

MessageBox::Show( "Вы выиграли", "WIN",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation );

}

}

else

{

Poisk(i,j);

for(int i=0;i
for (int j=0; j
{

int k1=i*m+j;

if(a[i][j]>10)

{

a[i][j]-=10;

this->pBut[k1]->Text=a[i][j].ToString();

count++;

}

if(a[i][j]==10) //this->pBut[k1]->Visible=false;

{

this->pBut[k1]->Image=System::Drawing::Image::FromFile(L"0.bmp");

count++;

}

}

if(count==(n*m-kolmin))

{

MessageBox::Show( "Вы выиграли", "WIN",

MessageBoxButtons::OK, MessageBoxIcon::Exclamation );

}

}

}

//private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {

// }

//private: System::Void dynam_button_Click(System::Object^ sender, System::EventArgs^ e) {

// MessageBox::Show( "Вы нажали кнопку.", "Ура",

// MessageBoxButtons::OK, MessageBoxIcon::Exclamation );

///

// }

//private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {

//

// }

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {

n=8;

m=9;

label1->Visible=false;

label2->Visible=false;

label3->Visible=false;

textBox1->Visible=false;

textBox2->Visible=false;

textBox3->Visible=false;

button2->Visible=false;

this->Width=m*25+40;

this->Height=n*25+150;

kolmin=5;

count=0;

a=new int*[200];

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

a[i]=new int[200];

pBut = gcnew array(n*m);//создали динамический массив кнопок. Скобки круглые!

int k;

for(int i=0;i
{

for (int j=0; j
{k=i*m+j;

pBut[k] = gcnew System::Windows::Forms::Button();

pBut[k]->Visible = true;

pBut[k]->Location = System::Drawing::Point(1+(j*25),80+(i*25));

pBut[k]->Size = System::Drawing::Size(25, 25);

//int^ number = gcnew int(i*m + j);

int number=(i*m + j);

pBut[k]->Tag = number;

pBut[k]->Text=number.ToString();

pBut[k]->Click += gcnew System::EventHandler(this, &Form1::Poi);

//pBut[i,j]->Text=(i*m + j)->ToString();

this->Controls->Add(pBut[k]);//этот класс отвечает за вид формы. Ели туда не добавим-кнопок не увидим

}

}

Create(n,m,kolmin);

}

private: System::Void новаяИграToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)

{

label1->Visible=false;

label2->Visible=false;

label3->Visible=false;

textBox1->Visible=false;

textBox2->Visible=false;

textBox3->Visible=false;

button2->Visible=false;

int n1,m1;

n1=n;

m1=m;

count=0;

this->Width=m*25+40;

this->Height=n*25+150;

for(int i=0;i
this->Controls->Remove(pBut[i]);

delete[]pBut;

//this->Controls->Remove;

pBut = gcnew array(n*m);//создали динамический массив кнопок. Скобки круглые!

int k;

for(int i=0;i
{

for (int j=0; j
{

k=i*m+j;

pBut[k] = gcnew System::Windows::Forms::Button();

pBut[k]->Visible = true;

pBut[k]->Location = System::Drawing::Point(1+(j*25),80+(i*25));

pBut[k]->Size = System::Drawing::Size(25, 25);

int number=(i*m + j);

pBut[k]->Tag = number;

pBut[k]->Click += gcnew System::EventHandler(this, &Form1::Poi);

this->Controls->Add(pBut[k]);//этот класс отвечает за вид формы. Ели туда не добавим-кнопок не увидим

}

}

Create(n,m,kolmin);

}
//

private: System::Void выходToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {

Close();

}

private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) {
label1->Visible=false;

label2->Visible=false;

label3->Visible=false;

textBox1->Visible=false;

textBox2->Visible=false;

textBox3->Visible=false;

button2->Visible=false;

count=0;

this->Width=m*25+40;

this->Height=n*25+150;

for(int i=0;i
this->Controls->Remove(pBut[i]);

delete[]pBut;

//this->Controls->Remove;

pBut = gcnew array(n*m);//создали динамический массив кнопок. Скобки круглые!

int k;

for(int i=0;i
{

for (int j=0; j
{

k=i*m+j;

pBut[k] = gcnew System::Windows::Forms::Button();

pBut[k]->Visible = true;

pBut[k]->Location = System::Drawing::Point(1+(j*25),80+(i*25));

pBut[k]->Size = System::Drawing::Size(25, 25);

int number=(i*m + j);

pBut[k]->Tag = number;

pBut[k]->Click += gcnew System::EventHandler(this, &Form1::Poi);

this->Controls->Add(pBut[k]);//этот класс отвечает за вид формы. Ели туда не добавим-кнопок не увидим

}

}

Create(n,m,kolmin);

}


написать администратору сайта