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


 

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

66079. Иностранные инвестиции РФ 55 KB
  В этой связи создание благоприятных условий для увеличения притока средств иностранных инвесторов является одним из приоритетных направлений государственной экономической политики в РФ. Правовое регулирование иностранных инвестиций на территории РФ осуществляется Федеральным законом...
66080. Статус безработного 48.5 KB
  Для того чтобы приобрести права и получить гарантии, установленные для безработного гражданина, Вы должны быть признаны безработным в определенном порядке. Процесс признания человека безработным условно можно разделить на следующие этапы...
66081. Европейский банк реконструкции и развития 52.23 KB
  Европейский банк реконструкции и развития является международной финансовой организацией, которая финансирует проекты в 29 странах от Центральной Европы до Центральной Азии. Вкладывая капитал прежде всего в те предприятия частного сектора...
66083. ВТО и Россия 18.2 KB
  Всемирная торговая организация – международная организация, созданная в 1995 году с целью либерализации международной торговли и регулирования торгово-политических отношений государств-членов. ВТО является преемницей Генерального соглашения по тарифам и торговле (ГААТ), заключенного в 1947 году...
66084. Национальные и региональные инвестиционные проекты РФ 36.31 KB
  В 2006 году на реализацию проекта из федерального бюджета и государственных внебюджетных фондов направлено 7898 млрд руб. В 2007 году предусмотрено выделение 1313 млрд рублей. медицинских работников получили дополнительные денежные выплаты на общую сумму более 66 млрд руб.
66086. Финансовая несостоятельность регионов и межбюджетные отношения 128.44 KB
  Финансовая несостоятельность регионов и межбюджетные отношения В России имеет место абсурдная ситуация: из 83 регионов страны 70 являются дотационными то есть убыточными. Возможно ли такое Почему такая ситуация вообще возникает Правомерно ли поддержание...
66087. ПРАВОВЫЕ ОСНОВЫ АДМИНИСТРАТИВНОГО НАДЗОРА В СФЕРЕ ЭЛЕКТРОЭНЕРГЕТИКИ 114 KB
  При исследовании правового регулирования административного надзора необходимо определить с какой системой нормативных правовых актов придется иметь дело. Итак что проверяется в процессе надзора Этот вопрос чрезвычайно важен с практической точки зрения.