Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kopatel.docx
Скачиваний:
12
Добавлен:
08.11.2019
Размер:
218.35 Кб
Скачать

Задание руководителя

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

Замечания руководителя Содержание Введение

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

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

В данной пояснительной записке будет идти рассказ о спокойной и довольно интересной игре “Копатель”, какой алгоритм работы она имеет и о том, что означает каждая строчка написанного кода.

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

  1. Алгоритм работы программы

Поле программы состоит из 100 ячеек. Его размеры 10х10 ячеек. Данное поле рисуется прямо в окне программы и у каждой ячейки есть свои координаты. У самого Копателя, который представляет собой круг зелёного цвета, тоже есть свои координаты, которые обозначаются переменными X и Y. При нажатии кнопок управления координаты Копателя изменяются, и он переходит в другую ячейку. При подходе к краю поля, вступает в действие ограничение, которое не дает Копателю выйти за границы этого поля. При нажатии кнопки “Копать” ячейка меняет свой цвет, т.е. открывается. Смена цвета на желтый свидетельствует о наличии клада в данной ячейке, а смена цвета на светло-зеленый – о пустоте ячейки.

  1. Текст программы с комментариями

//--------------------------------------------------------------

#include <vcl.h>

#include <stdlib.h>

#include <time.h>

#pragma hdrstop

#include "Копатель.h"

//--------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

int M [10][10]; // Описание переменных(X,Y,s) и матрицы(M)

int X, Y;

int sum;

intscore;

//--------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

srand ( time(NULL) );

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

for (int j=0;j<10;j++)

{

M[i][j]=0;

}

for (int j = 0; j < 10; j++)

{

int x, y;

do

{

x = rand() % 10;

y = rand() % 10;

} while (M[x][y] == 1);

M[x][y] = 1;

}

// В 10% всех ячеек будет находиться клад

X = 0;

Y = 0;

int max_try_amount = 10;

ProgressBarEnergy->Min = 0;

ProgressBarEnergy->Max = max_try_amount;

ProgressBarEnergy->Position = ProgressBarEnergy->Max;

}

void Draw()

{

TColor sc = Form1->Canvas->Brush->Color;

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

for(int j=0;j<10;j++)

{

switch(M[i][j])

{

case 0:

case 1:

{

Form1->Canvas->Brush->Color = clGray;

// Задан цвет закрытой ячейки

} break;

case 2:

{

Form1->Canvas->Brush->Color = clSilver;

// Задан цвет пустой открытой ячейки

} break;

case 3:

{

Form1->Canvas->Brush->Color = clYellow;

// Задан цвет клада

} break;

}

Form1->Canvas->FillRect(Rect(30+i*46,30+j*46,76+i*46,76+j*46));

// Задаются размеры поля Копателя

}

Form1->Canvas->Brush->Color = clLime;

// Задан цвет "Копателя"

Form1->Canvas->Ellipse(40+X*46,40+Y*46,66+X*46,66+Y*46);

// Задана форма Копателя (Эллипс)

Form1->Canvas->Brush->Color = sc;

}

//--------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

LabelGameScore->Caption = "Количество найденного клада за раунд: " + IntToStr(sum);

LabelFullScore->Caption ="Всего найдено клада: " + IntToStr(score);

// Вывод текста и переменной на экран

Draw();

}

//--------------------------------------------------------------

void __fastcall TForm1::ButtonKopatClick(TObject *Sender)

{

if (M[X][Y] == 1) // Проверка на наличие клада

{

sum = sum + 1;

score = score + 1;

// Увеличение переменных на 1 при нажатии кнопки “Копать”

ProgressBarEnergy->Position+= 3;

// Прибавление энергии при нахождении клада

}

if (M[X][Y]<2)

{

M[X][Y]=M[X][Y]+2;

}

// Открытие ячейки. То есть если M[X][Y]<2, то ячейка закрыта. А после прибавления 2 она открывается

ProgressBarEnergy->Position--;

if (ProgressBarEnergy->Position == ProgressBarEnergy->Min)

// Минимальное значение ProgressBar, при котором блокируются кнопки

{

ButtonKopat->Enabled = false;

ButtonLeft->Enabled = false;

ButtonRight->Enabled = false;

ButtonUp->Enabled = false;

ButtonDown->Enabled = false;

}

// Блокировка кнопок всех кнопок, кроме "Начать заново" и “Сбросить счет”

if (ProgressBarEnergy->Position == ProgressBarEnergy->Min)

{ for(int i=0;i<10;i++)

for(int j=0;j<10;j++)

if (M[i][j]<2)

{

M[i][j]=M[i][j]+2;

}

}

// Открытие всех закрытых ячеек

if (ProgressBarEnergy->Position == ProgressBarEnergy->Min) // Минимальное значение ProgressBar, при котором выводится текст и количество найденного клада

{

LabelGameOver->Caption = "Игра окончена!!! ";

}

// Вывод надписи “Игра окончена!!!” после того, как значение ProgressBar стало минимальным

Draw();

}

//--------------------------------------------------------------

void __fastcall TForm1::ButtonRightClick(TObject *Sender)

{

if (X<9)

{

X=X+1;

}

// При нажатии на кнопку "Вправо" копатель переходит на одну ячейку вправо

Draw();

}

//--------------------------------------------------------------

void __fastcall TForm1::ButtonLeftClick(TObject *Sender)

{

if (X>0)

{

X=X-1;

}

// При нажатии на кнопку "Влево" копатель переходит на одну ячейку влево

Draw();

}

//--------------------------------------------------------------

void __fastcall TForm1::ButtonDownClick(TObject *Sender)

{

if (Y<9)

{

Y=Y+1;

}

// При нажатии на кнопку "Вниз" копатель переходит на одну ячейку вниз

Draw();

}

//--------------------------------------------------------------

void __fastcall TForm1::ButtonUpClick(TObject *Sender)

{

if (Y>0)

{

Y=Y-1;

}

// При нажатии на кнопку "Вверх" копатель переходит на одну ячейку вверх

Draw();

}

//--------------------------------------------------------------

void __fastcall TForm1::ButtonNewGameClick(TObject *Sender)

sum = 0;

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

for (int j=0;j<10;j++)

{

M[i][j]=0;

}

for (int j = 0; j < 10; j++)

{

int x, y;

do

{

x = rand() % 10;

y = rand() % 10;

} while (M[x][y] == 1);

M[x][y] = 1;

}

X = 0;

Y = 0;

ProgressBarEnergy->Position = ProgressBarEnergy->Max; // Принажатиикнопки"Начатьзаново" вседелениястрокиProgressBarвозвращаютсявмаксимальноеположение

ButtonKopat->Enabled = true; // При нажатии кнопки"Начать заново" снимается блокировка со всех клавиш

ButtonLeft->Enabled = true;

ButtonRight->Enabled = true;

ButtonUp->Enabled = true;

ButtonDown->Enabled = true;

LabelGameScore->Caption = ""; // При нажатии кнопки "Начать заново" убирается надпись с количеством найденных кладов

LabelGameOver->Caption = "";

Draw();

}

//--------------------------------------------------------------

void __fastcall TForm1::N2Click(TObject *Sender)

{

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

for (int j=0;j<10;j++)

{

M[i][j]=0;

}

for (int j = 0; j < 10; j++)

{

int x, y;

do

{

x = rand() % 10;

y = rand() % 10;

} while (M[x][y] == 1);

M[x][y] = 1;

}

X = 0;

Y = 0;

Draw();

}

//--------------------------------------------------------------

void __fastcall TForm1::ButtonResetScoreClick(TObject *Sender)

{

sum=0;

score = 0;

// Присваивание 0 к значениям количества найденного клада(sum) и общего счета игры (score) после нажатия кнопки “Сбросить счет”

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

for (int j=0;j<10;j++)

{

M[i][j]=0;

}

for (int j = 0; j < 10; j++)

{

int x, y;

do

{

x = rand() % 10;

y = rand() % 10;

} while (M[x][y] == 1);

M[x][y] = 1;

}

X = 0;

Y = 0;

ProgressBarEnergy->Position = ProgressBarEnergy->Max; // Принажатиикнопки“Сброситьсчет”вседелениястрокиProgressBarвозвращаютсявмаксимальноеположение

ButtonKopat->Enabled = true;

ButtonLeft->Enabled = true;

ButtonRight->Enabled = true;

ButtonUp->Enabled = true;

ButtonDown->Enabled = true;

// При нажатии кнопки“Сбросить счет”снимается блокировка со всех клавиш

LabelGameScore->Caption = ""; // При нажатии кнопки “Сбросить счет” убирается надпись с количеством найденных кладов

LabelFullScore->Caption = "";// При нажатии кнопки “Сбросить счет” убирается надпись с общим счетом игры

LabelGameOver->Caption = "";// При нажатии кнопки “Сбросить счет” убирается надпись “Игра окончена”

Draw();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]