Задание руководителя
Сделать программу-игру, которая будет называться “Копатель”. В игре должна быть реализована энергия, без которой Копатель не сможет выкапывать, а также статистика, показывающая количество найденного клада и общий счет игры. В конце игры ячейки все ячейки должны открыться и тем самым показать, где находится клад.
Замечания руководителя Содержание Введение
Наверно многие согласятся, что без современных компьютерных игр наша жизнь стала бы скучной. Дело не в том, что у нас очень много свободного времени или не хватает острых ощущений – в игре можно оказаться в совершенно другом мире, отвлечься от злободневности и будничности. Но и не надо забывать, что игры могут плохо влиять на психику человека.
Жанров компьютерных игр довольно много, поэтому любой может найти игру по вкусу. Сейчас сложно найти человека, который умеет обращаться с компьютером, но ни разу не играл. В спокойной домашней обстановке можно сыграть в любую игру без опасений критики или непонимания со стороны окружающих.
В данной пояснительной записке будет идти рассказ о спокойной и довольно интересной игре “Копатель”, какой алгоритм работы она имеет и о том, что означает каждая строчка написанного кода.
Работа программы будет продемонстрирована на тестовом примере. Инструкция к программе поможет разобраться с игрой даже человеку, который впервые сел за компьютер. С помощью блок-схем будет показана каждая логическая операция, а также сама программа.
Алгоритм работы программы
Поле программы состоит из 100 ячеек. Его размеры 10х10 ячеек. Данное поле рисуется прямо в окне программы и у каждой ячейки есть свои координаты. У самого Копателя, который представляет собой круг зелёного цвета, тоже есть свои координаты, которые обозначаются переменными X и Y. При нажатии кнопок управления координаты Копателя изменяются, и он переходит в другую ячейку. При подходе к краю поля, вступает в действие ограничение, которое не дает Копателю выйти за границы этого поля. При нажатии кнопки “Копать” ячейка меняет свой цвет, т.е. открывается. Смена цвета на желтый свидетельствует о наличии клада в данной ячейке, а смена цвета на светло-зеленый – о пустоте ячейки.
Текст программы с комментариями
//--------------------------------------------------------------
#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();
}