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


 

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

116. Рекламная деятельность: организация, планирование, оценка эффективности 1.42 MB
  Организация рекламной деятельности рекламодателем. Рекламу изучают и как часть процесса продажи товара, и как коммуникацию, и как часть маркетинга, и как искусство. Средства массовой информации или средства размещения информации.
117. Проектирование детского Ясли-сада на 240 мест 92.5 KB
  Пространственная жесткость достигается за счет совместной работы наружных продольных и поперечных стен в вертикальном направлении и в горизонтальном направлении перекрытиями, их анкеровкой и замоноличиванием швов.
118. Визначення найменування і тактової частоти процесора 632 KB
  Дана лабораторна робота написана на мові Delphi 7 на тему Визначення найменування і тактової частоти процесора. Зміст роботи: Постановка задачі. Теоретичні відомості. Опис алгоритму. Керівництво програмісту. Керівництво користувачеві. Приклад роботи програми. Програмний код програми. Висновок про виконану роботу. Використана література, або інші джерела.
119. Теорія інформації 184.5 KB
  Мета процесу кодування інформації: за одиницю часу передати більше інформації. Конвенціональність кодування (одну й ту ж інформацію можна кодувати різними способами).
120. Системний аналіз - Календарне планування. Розрахунок мережевої моделі 56.5 KB
  Розрахунок мережевої моделі дозволяє визначити критичні та некритичні операції. Операція критична, якщо затримка початку її виконання або збільшення тривалості приводить до збільшення тривалості програми в цілому. В противному випадку – некритична операція, характеризується тим, що різниця в часі між пізнім закінченням і раннім початком більша ніж тривалість операції. Виникає резерв часу, який може бути використаний з точки зору оптимізації ресурсів.
121. Системний аналіз - Матричні ігри 94.5 KB
  Системний аналіз - матричні ігри. Точка мінімаксу визначаєтьсяі як найнижча точка огинаючої зверху.
122. Завдання для контрольної роботи по курсу Основи системного аналізу об’єктів та процесів комп’ютеризації 235.5 KB
  Контрольна робота складається з двох частин: теоретичної та практичної. I. В теоретичній частині потрібно дати розгорнуту відповідь на одне з наступних питань відповідно варіанту. II. В практичній частині необхідно розв’язати наступні задачі.
123. ПРИЙНЯТТЯ РІШЕНЬ В УМОВАХ НЕВИЗНАЧЕНОСТІ 195.5 KB
  Якщо існування функцій розподілу ймовірностей, які характеризують степінь неповноти або неточності інформації про вихідні дані задачі прийняття рішень не гарантується, то таку ситуацію класифікують як прийняття рішень в умовах невизначеності.