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)Каким образом можно определять и фиксировать имя и время игрока, быстрее всех разминировавшего игровое поле?


 

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

61559. Слитное и раздельное написание не с прилагательными 28.12 KB
  Цель урока: Записать в тетради число и тему урока Раздаю текст стихотворения Читаю стихотворение делая акцент на нужные слова Называю словосочетания дети подбирают хором синонимы...
61560. Источники информации 39.69 KB
  Источники информации передача информации источник зрительной информации источник звуковой информации Интернет-ресурсы к уроку Технология изучения Этап учебного занятия...
61561. Политические режимы 20.1 KB
  В результате проведенного занятия участники смогут: определять понятия политический режим демократия авторитаризм тоталитаризм; называть основные характеристики политических режимов; выражать свое отношение к современным политическим условиям в РФ.
61562. Город и село 17.75 KB
  Цель урока: Задачи: Образовательные: усвоение понятий город село формирование информационной компетентности перевод информации из графического представления в текстовое и наоборот коммуникативной...
61563. Знакомимся с риторикой и учебником 33.94 KB
  Этап урока Деятельность учителя Деятельность ученика Результат совместной деятельности Организационный момент Здравствуйте ребята меня зовут Ольга Вячеславовна и сегодня на уроке нашей темой будет.
61564. Сочинение по картине В. М. Васнецова «Снегурочка» 23.32 KB
  Цель: познакомит с творчеством художника; учить детей осмысливать содержание картины; совершенствовать умения подбирать необходимые для описания и повествования слова...
61566. Электризация объектов 37.46 KB
  Цель занятия: формирование элементарных представлений об электризации трением и о существовании двух видов электрических зарядов.
61567. Класс Двудольные. Семейство Крестоцветные 18.67 KB
  Задачи: познакомить учащихся с отличительными признаками и типичными представителями растений семейства Крестоцветных; научить составлять морфологическое описание растения.