7076

Методы проектирования программ на языках высокого уровня С++

Лабораторная работа

Информатика, кибернетика и программирование

1. Цель работы Знакомство с методами проектирования программ на языках высокого уровня С++. 2. Задание на работу В программе необходимо реализовать: пункт главного меню Справка, состоящий из двух подпунктов Информация об авторе и Информация о п...

Русский

2013-01-14

115.5 KB

2 чел.

1. Цель работы

Знакомство с методами проектирования программ на языках высокого уровня С++.

2. Задание на работу

В программе необходимо реализовать:

пункт главного меню «Справка», состоящий из двух подпунктов «Информация об авторе» и «Информация о программе»;

реализацию режимов «Новая игра», «Новичок» и режим, заданный в варианте задания, на основе главного меню.

Реализовать программу игры «Сапер» для режима «Эксперт» (20  10 клеток (36 мин)).

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

3. Листинг программы:

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int ch=0,times=0;

int   pole[30][30],flags[30][30],Min=2,str=30/*строки*/,

                                                      stol=30;/*столбцы*/

int timelimit=1*60; //(1 минута)

int maxMin=2;

bool NoWinFlag=0

bool k=false,gen=false;

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

__fastcall TForm1::TForm1(TComponent* Owner)

       : TForm(Owner)

{

newgame (30,30);

stol=3;

str=3;

maxMin=2;      

timelimit = 10*60;

newgame(3,3);

            };

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

void savefile()

{

if (!NoWinFlag)

       {

       ifstream infile("best.txt");  

       if(infile){ char s[80];

               infile.getline(s,80);

               infile.close();

               if (times<StrToInt(s))

                  ;}

               {

               ofstream outfile("best.txt");  

               outfile << times <<'\n';

               outfile.close();

               }

       }

}

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

void TForm1::generation(int a,int b)

{

int x,y,t;

//      y-строки  x-столбцы

for(int y=0;y<str;y++)

for(int x=0;x<stol;x++){pole[x][y]=0;flags[x][y]=0;}

for(int s=0;s<maxMin;s++)

     {

       t=1;

       while(t)

       {      

       Randomize();

       x=random(stol);

       y=random(str);

if((pole[x][y]==9)||((a==y)&&(b==x)))

{t=1;}

else

{t=0;};

       }

       pole[x][y]=9;    

int z=0;for(int xx=0;xx<str;xx++)for(int yy=0;yy<stol;yy++)

{if (pole[xx][yy]==9) z++;};z=z/9;

      }

for(int y=0;y<str;y++)

for(int x=0;x<stol;x++)

if(pole[x][y]!=9)

{

if(pole[x-1][y]==9&&x>0)pole[x][y]++;

if(pole[x+1][y]==9&&x<stol-1)pole[x][y]++;

if(pole[x][y+1]==9&&y<str-1)pole[x][y]++;

if(pole[x][y-1]==9&&y>0)pole[x][y]++;

if(pole[x+1][y+1]==9&&x<stol-1&&y<str-1)pole[x][y]++;

if(pole[x-1][y-1]==9&&x>0&&y>0)pole[x][y]++;

if(pole[x+1][y-1]==9&&x<stol-1&&y>0)pole[x][y]++;

if(pole[x-1][y+1]==9&&x>0&&y<str-1)pole[x][y]++;

}

}

void TForm1::flag(int x,int y,int n,int z)

{

Image1->Canvas->Brush->Color=clWhite;

Image1->Canvas->Pen->Color=clWhite;

Image1->Canvas->Rectangle(x*16+1,y*16+1,x*16+17,y*16+17);

if(z==0)

{

flags[x][y]=2;

switch(n)

{

case 0:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,0,1);

break;

case 1:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,1,1);

break;

case 2:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,2,1);

break;

case 3:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,3,1);

break;

case 4:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,4,1);

break;

case 5:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,5,1);

break;

case 6:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,6,1);

break;

case 7:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,7,1);

break;

case 8:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,8,1);

break;

case 9:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,9,1);

break;

case 10:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,0,1);

break;

case 11:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,12,1);

break;

case 12:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,13,1);

break;

case 13:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,10,1);

break;

case 14:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,11,1);

break;

}

}

if(z==1)

{

switch (n){

case 10:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,10,1);

flags[x][y]=0;

break;

case 11:

ImageList1->Draw(Image1->Canvas,x*16+1,y*16+1,11,1);

flags[x][y]=1;

break;

}

}

}

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

void TForm1::newgame(int stol_1, int str_1)

{

Image1->Width=(stol_1*16);

Image1->Height=(str_1*16);

Form1->Width=(stol_1*16)+150;

Form1->Height=(str_1*16)+150;

gen=true;

k=true;

times=0;

Timer1->Enabled=false;

Label2->Caption="Время:0";

Image1->Canvas->Brush->Color=clWhite;

Image1->Canvas->Pen->Color=clWhite;

Image1->Canvas->Rectangle(0,0,(stol_1*16)+1,(str_1*16)+1);

for(int x=0;x<stol_1;x++)

for(int y=0;y<str_1;y++)

{

flag(x,y,10,1);

flags[x][y]=0;pole[x][y]=0;

}

Min=maxMin;

Label1->Caption=Min;

}

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

void __fastcall TForm1::N2Click(TObject *Sender)

{

newgame(stol,str);

}

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

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

times=times+1;

Label2->Caption="Время:"+IntToStr(times)+" (из"+IntToStr(timelimit)+")";

if (times==timelimit)

{MessageBox(NULL, "Информация","Время вышло!", MB_OK | MB_ICONEXCLAMATION);

NoWinFlag=1;};    

}

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

void TForm1::rec(int x,int y)

{

if(pole[x][y]==0)

{

pole[x][y]=10;

if(flags[x-1][y]==0)flag(x-1,y,pole[x-1][y],0);

if(pole[x-1][y]==0&&x>0)rec(x-1,y);

if(flags[x+1][y]==0)flag(x+1,y,pole[x+1][y],0);

if(pole[x+1][y]==0&&x<stol-1)rec(x+1,y);

if(flags[x][y+1]==0)flag(x,y+1,pole[x][y+1],0);

if(pole[x][y+1]==0&&y<str-1)rec(x,y+1);

if(flags[x][y-1]==0)flag(x,y-1,pole[x][y-1],0);

if(pole[x][y-1]==0&&y>0)rec(x,y-1);

if(flags[x+1][y+1]==0)flag(x+1,y+1,pole[x+1][y+1],0);

if(pole[x+1][y+1]==0&&x<stol-1&&y<str-1)rec(x+1,y+1);

if(flags[x-1][y-1]==0)flag(x-1,y-1,pole[x-1][y-1],0);

if(pole[x-1][y-1]==0&&x>0&&y>0)rec(x-1,y-1);

if(flags[x+1][y-1]==0)flag(x+1,y-1,pole[x+1][y-1],0);

if(pole[x+1][y-1]==0&&x<stol-1&&y>0)rec(x+1,y-1);

if(flags[x-1][y+1]==0)flag(x-1,y+1,pole[x-1][y+1],0);

if(pole[x-1][y+1]==0&&x>0&&y<str-1)rec(x-1,y+1);

}

}

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

void __fastcall TForm1::Image1MouseDown(TObject *Sender,

     TMouseButton Button, TShiftState Shift, int X, int Y)

{

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

if(k==true)

{

int x=floor(X/16),y=Y/16;

//X, Y - координаты точки нажатия мыши относительно угла формы

if(gen==true){generation(x,y);gen=false;}

Timer1->Enabled=true;

//запускается таймер.

if(Button==1&&flags[x][y]==0&&Min>0)

{

flag(x,y,11,1);

Min=Min-1;

Label1->Caption=Min;

if(Min==0)

{

int ot=0;

for(int y=0;y<str;y++)for(int x=0;x<stol;x++)

if(flags[x][y]==2)ot++;

if(ot==str*stol-maxMin)

{

Timer1->Enabled=false;

MessageBox(NULL, "Вы выиграли!","Поздравляю", MB_OK | MB_ICONEXCLAMATION);

savefile();

k=false;

}

}

 return;

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

}

if(Button==1&&flags[x][y]==1)

{

flag(x,y,10,1);

Min=Min+1;

}

Label1->Caption=Min;

if(Button==0&&flags[x][y]==0)

{

if(pole[x][y]==9)

{

k=false;

Timer1->Enabled=false;

for(int a=0;a<str;a++)

for(int b=0;b<stol;b++)

{

  if(pole[b][a]==9&&flags[b][a]!=1)

       {flag(b,a,pole[b][a],0);

       }

        else {

               if(pole[b][a]!=9&&flags[b][a]==1)

                       {flag(b,a,12,0); // если нет мины (9) и был поставлен флажок (flags=1)

                       }

               else

               {flag(b,a,pole[b][a],0);};

              }

}

flag(x,y,11,Button);

MessageBox(NULL, "Вы взорвались!","Game Over", MB_OK | MB_ICONEXCLAMATION);

return;

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

}

if(pole[x][y]==0)rec(x,y);

flag(x,y,pole[x][y],Button);

}

if(Min==0)

{

int ot=0;

for(int y=0;y<str;y++)for(int x=0;x<stol;x++)

if(flags[x][y]==2)ot++;

if(ot==str*stol-maxMin)

{

Timer1->Enabled=false;

MessageBox(NULL, "Вы выиграли!","Поздравляю", MB_OK | MB_ICONEXCLAMATION);

savefile();

k=false;

}

}

}

}

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

void __fastcall TForm1::N3Click(TObject *Sender)

{

Form1->Close();

}

void __fastcall TForm1::N4Click(TObject *Sender)

{

stol=20;

str=10;

maxMin=10;// у эксперта 10 мин

timelimit = 36*60; //предел времени у эксперта 36 минут

newgame (20,10);

}

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

void __fastcall TForm1::N5Click(TObject *Sender)

{

stol=3;

str=3;

maxMin=2; // у новичка 2 мины

timelimit = 10*60; //предел времени у новичка 10 минут

newgame(3,3);

}

void __fastcall TForm1::N7Click(TObject *Sender)

{

Form2->ShowModal();

}

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

void __fastcall TForm1::N8Click(TObject *Sender)

{

Form3->ShowModal();

}

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

Отладка прошла успешно.

  1.  Результаты функционирования разработанного ПО.

Рисунок 1.   Рисунок 2.

Начало новой игры в Вид экранной формы в

режиме «Новичок»  режиме «Новичок»

 

Рисунок 3.   Рисунок 4.

Вид экранной формы Сообщение о выигрыше

при выигрыше

 

Рисунок 5.   Рисунок 6.

Вид экранной формы Сообщение о проигрыше

при проигрыше

 

Рисунок 7. Начало новой игры в режиме «Эксперт»

Рисунок 8. Вид экранной формы в режиме «Эксперт»

Рисунок 8. Вид экранной формы при проигрыше

Рисунок 9. Сообщение о проигрыше

Рисунок 10. Вид экранной формы при выигрыше

Рисунок 11. Сообщение о проигрыше

Вывод:

Ознакомились с некоторыми методами проектирования программ на С++.

Ответы на контрольные вопросы:

  1.  Какие операторы динамического выделения и освобождения памяти используются в Pascal’е?

 Оператор GetMem – оператор динамического выделения, оператор FreeMem – оператор высвобождения памяти.

8)Каким образом можно определять и фиксировать имя и время игрока, быстрее всех разминировавшего игровое поле?


 

А также другие работы, которые могут Вас заинтересовать

5081. Образ былинного богатыря отечественного искусства 19 в 257.5 KB
  История мировой живописи знает немного картин, созданию которых художник посвящал бы значительную часть своей творческой жизни. В числе таких картин Богатыри Виктора Михайловича Васнецова. Много лет работал замечательный художник над этим знаменит...
5082. Влияние распределения прибыли на общее финансовое состояние предприятия на примере ДОАО ННН - нефть 1.58 MB
  Постепенный переход России от централизованно-плановой системы хозяйствования к рыночной по-новому ставит вопрос о методах ведения экономики предприятия. Традиционные структуры и уклады меняются. В этих условиях руководство предприятий, изу...
5083. Социология. Курс лекций. Объект и предмет социологии 322.5 KB
  Социология как наука Объект и предмет социологии. Структура социологии. Функции социологии как науки. Методы социологии. Институционализация социологии. Объект и предмет социологии Объект любой науки – это...
5084. Разработка теплотехнологии производства стекла заданного состава 163.81 KB
  За последние десятилетия научно-техническая революция во всех областях науки и техники привела к громадным сдвигам в науке о стекле, и в технологии стекла. Характерной чертой развития технологии стекла является резкое повышение производите...
5085. Проектирование и применение червячной передачи в машиностроении 1.48 MB
  Современное машиностроение отличается интенсивным расширением многообразия выпускаемой продукции. Одновременно происходит сокращение продолжительности цикла выпуска изделий одного вида. Объем выпуска продукции, как и прежде, изменяются в ши...
5086. Инженерное оборудование жилых зданий 564 KB
  Инженерное оборудование жилых зданий Исходные данные: План жилого дома приведен на рис.1 Район строительства г. Пенза Высота этажа 3 м Ориентация фасада - южная Источник теплоснабжения - котельная в подвале здания...
5087. Проектирование телефонной сети по заданному числу АТС 668 KB
  Составить структурную схему телефонной сети по заданному числу АТС, при наличии на сети автоматической междугородной телефонной станции (АМТС) и узла специальных служб (УСС). Разработать функциональную схему проектируемой АТСКУ...
5088. Расчет одноступенчатого редуктора, содержащего червячную цилиндрическую передачу 1008 KB
  Проведен расчет одноступенчатого редуктора, содержащего червячную цилиндрическую передачу, расчет ценой передачи, спроектирован привод конвейера. Выполнен кинематический, энергетический и проверочный расчеты, расчет валов, подшипников....
5089. Отопительно-производственная котельная ГУП ФАПК Якутия 2.58 MB
  Котельная установка ГУП ФАПК Якутия расположенная в г. Якутске предназначена для отопительно-производственных целей и оборудована тремя паровыми котлами паропроизводительностью 10 т/ч: два кола ДКВР-10-13 и один ДЕ-10-14. Котельная вырабат...