- •Задача 1. Конвертер
- •Задача 2. Фунты-килограммы
- •Задача 3. Сила тока.
- •Задача 4. Сопротивление
- •Задача 5. Кафе
- •Задача 6. Любимый напиток
- •Задача 7. Электроэнергия
- •Задание 8. Осаго
- •Задание 9.Просмотр иллюстраций
- •Задача 10. Калькулятор
- •Задача 11. Калькулятор-2
- •Задача 12.Секундомер
- •Задача 13. Угадай число
- •Задание 14.Угадай число-2
- •Задание 15.Запуск Internet Explorer
- •Задание 16.Конвертор
- •Задание 17.Конвертор 2
- •Задание 18.Погода
- •Задание 19.Средняя температура
- •Задание 20. Простая база данных
- •Задание 21. Редактор текста
- •Задание 22. Приветствие
- •Задача 23. Олимпийский флаг
- •Задание 24. Диаграмма
- •Задача 26. Круговая диаграмма.
- •Задача 27. Просмотр иллюстраций.
- •Задача 28 .Часы
- •Задача 29. Пинг понг.
- •Задача 30. Полет в облаках
- •Задача 31.Баннер
- •Задача 32. Фоновый рисунок
- •Задача 33. Wav
- •Задача 34. Mp3 Player
- •Задача 35.Воспроизведение midi
- •Задача 36.Compact Disk Player (версия 1)
- •Задача 37.Compact Disk Player (версия 2)
- •Задача 38.VideoPlayer
- •Задача 39. Анимация
- •Задача 40. Записная книжка
- •Задача 41 Магазин
- •Задача 42. Ежедневник
- •Задача 43. Сапер
- •Часть 1. Примеры и задачи
- •Часть 1. Примеры и задачи
- •Задача 44 Игра 15
- •Часть 1. Примеры и задачи
- •Задача 45. Игра "Собери картинку" (Puzzle)
- •Задача 46 Игра "Парные картинки"
- •Задача 47. Экзаменатор
- •Задача 48. Экзаменатор-2
- •Задача 49. Календарь
- •Задача 50. Будильник
- •Задача 51. Очистка диска
- •Задача 52.Печать
- •Задачи для самостоятельного решения Задача 1. Скидка
- •Задача 2.Доход по вкладу
- •Задача 3. Таблица умножения
- •Задача 4.Поездка на автомобиле
- •Задача 5.Стоимость разговора
- •Задача 6. Стеклопакет
- •Задача7. Калькулятор
- •Задача 8. Электроэнергия
- •Задача 9. Добрый день
- •Задача 10. Часы
- •Задача 11. Узоры
- •Задача 12. Курс доллара
- •Задача 13. Диаграмма
- •Задача 14. Домашние животные
- •Задача 15. Кораблик
- •Задача 16. Сапер
- •Задача 17 .Экзаменатор
- •Задача 18. База данных "Расходы"
Задача 16. Сапер
Внесите такие изменения в программу Сапер, чтобы изображения клеток (пустая клетка; флажок; мина; мина, помеченная флажком) загружались из файла. (Рис. 76)
Рис 76
Вывод: В этой программе мы создали игру сапёр.
Листинг
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
class Cell
{
public:
int BombCol;
bool Opened;
bool Checked;
bool Mined;
};
Cell Pole[100][100];
Graphics::TBitmap *BombPicture[2];
int BombKol,BombLeft;
TForm1 *Form1;
int Razmer;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Razmer=16;
BombPicture[0] = new Graphics::TBitmap();
BombPicture[1] = new Graphics::TBitmap();
BombPicture[0]->LoadFromFile("Bomb.bmp");
BombPicture[1]->LoadFromFile("Shiiko.bmp");
BombPicture[0]->Transparent=true;
BombPicture[1]->Transparent=true;
for(int j=0;j<Razmer;j++)
for(int i=0;i<Razmer;i++)
{
Pole[i][j].Opened=false;
Pole[i][j].BombCol=0;
Pole[i][j].Checked=false;
Pole[i][j].Mined=false;
}
BombKol=40;
BombLeft=BombKol;
RandomizeBomb();
UpdateCaption();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DrawCell(int x, int y)
{
PoleCanvas->Canvas->Pen->Color=clGray;
if(!Pole[x][y].Opened)
{
PoleCanvas->Canvas->Brush->Color=clSilver;
PoleCanvas->Canvas->Rectangle(x*20,y*20,x*20+20,y*20+20);
if(Pole[x][y].Checked)
{ //Флажок
PoleCanvas->Canvas->Rectangle(x*20,y*20,x*20+20,y*20+20);
PoleCanvas->Canvas->Brush->Color=clRed;
PoleCanvas->Canvas->Rectangle(x*20+5,y*20+5,x*20+15,y*20+10);
PoleCanvas->Canvas->Rectangle(x*20+13,y*20+5,x*20+15,y*20+17);
}
}else
{
PoleCanvas->Canvas->Brush->Color=(TColor)RGB(130,130,130);
PoleCanvas->Canvas->Rectangle(x*20,y*20,x*20+20,y*20+20);
if(Pole[x][y].Mined)
{
PoleCanvas->Canvas->Draw(x*20,y*20,
BombPicture[1&(BombLeft<=(BombKol/2))]);
} else
if(Pole[x][y].BombCol>0)
{
PoleCanvas->Canvas->TextOutA(x*20+4,y*20+0,IntToStr(Pole[x][y].BombCol));
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PoleCanvasPaint(TObject *Sender)
{
PoleCanvas->Canvas->Font->Size=13;
PoleCanvas->Canvas->Font->Color=clGreen;
for(int j=0;j<Razmer;j++)
for(int i=0;i<Razmer;i++)
{
DrawCell(i,j);
}
}
//---------------------------------------------------------------------------
TForm1::RandomizeBomb()
{
randomize();
TList*list=new TList();
for(int i=0;i<Razmer*(long)Razmer;i++)list->Add((void*)i);
for(int i=0;i<BombKol;i++)
{
int pos=random(list->Count);
int mesto=(int)list->Items[pos];
list->Delete(pos);
int y=mesto/Razmer;
int x=mesto-(y*Razmer);
Pole[x][y].Mined=true;
}
CountBombsNearCells();
return 1;
}
//---------------------------------------------------------------------------
TForm1::CountBombsNearCells()
{int num=0;
for(int j=1;j<Razmer-1;j++)
for(int i=1;i<Razmer-1;i++,num=0)
{
if(Pole[i+1][j].Mined)num++; if(Pole[i-1][j].Mined)num++;
if(Pole[i][j+1].Mined)num++; if(Pole[i][j-1].Mined)num++;
if(Pole[i+1][j+1].Mined)num++;if(Pole[i+1][j-1].Mined)num++;
if(Pole[i-1][j-1].Mined)num++;//Центр
if(Pole[i-1][j+1].Mined)num++;
Pole[i][j].BombCol=num;
}
for(int i=1;i<Razmer-1;i++,num=0)
{
if(Pole[0][i-1].Mined)num++;if(Pole[0][i+1].Mined)num++;
if(Pole[1][i-1].Mined)num++;if(Pole[1][i+1].Mined)num++;
if(Pole[1][i].Mined)num++;
Pole[0][i].BombCol=num; //Левыйкрай
}
for(int i=1;i<Razmer-1;i++,num=0)
{
if(Pole[Razmer-1][i-1].Mined)num++;if(Pole[Razmer-1][i+1].Mined)num++;
if(Pole[Razmer-2][i-1].Mined)num++;if(Pole[Razmer-2][i+1].Mined)num++;
if(Pole[Razmer-2][i].Mined)num++; //Правыйкрай
Pole[Razmer-1][i].BombCol=num;
}
for(int i=1;i<Razmer-1;i++,num=0)
{
if(Pole[i-1][0].Mined)num++;if(Pole[i+1][0].Mined)num++;
if(Pole[i+1][1].Mined)num++;if(Pole[i][1].Mined)num++;
if(Pole[i-1][1].Mined)num++; //Верх
Pole[i][0].BombCol=num;
}
for(int i=1;i<Razmer-1;i++,num=0)
{
if(Pole[i-1][Razmer-1].Mined)num++;if(Pole[i+1][Razmer-1].Mined)num++;
if(Pole[i+1][Razmer-2].Mined)num++;if(Pole[i][Razmer-2].Mined)num++;
if(Pole[i-1][Razmer-2].Mined)num++;
Pole[i][Razmer-1].BombCol=num; //Низ
}
num=0;
if(Pole[0][1].Mined)num++;
if(Pole[1][0].Mined)num++;
if(Pole[1][1].Mined)num++;
Pole[0][0].BombCol=num;
num=0;
if(Pole[0][Razmer-2].Mined)num++;
if(Pole[1][Razmer-2].Mined)num++;
if(Pole[1][Razmer-1].Mined)num++;
Pole[0][Razmer-1].BombCol=num;
num=0;
if(Pole[Razmer-2][0].Mined)num++;
if(Pole[Razmer-2][1].Mined)num++;
if(Pole[Razmer-1][1].Mined)num++;
Pole[Razmer-1][0].BombCol=num;
num=0;
if(Pole[Razmer-1][Razmer-2].Mined)num++;
if(Pole[Razmer-2][Razmer-2].Mined)num++;
if(Pole[Razmer-2][Razmer-1].Mined)num++;
Pole[Razmer-1][Razmer-1].BombCol=num;
return 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PoleCanvasMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
int XPos=X/20;
int YPos=Y/20;
if(Button==mbLeft)
{
if(Pole[XPos][YPos].BombCol==0)
{
CheckRekursively(XPos,YPos);
Repaint();
}
Pole[XPos][YPos].Opened=true;
DrawCell(XPos,YPos);
if(Pole[XPos][YPos].Mined)
{
Sleep(500);
DrawAll();
ShowMessage("Выпроиграли");
New(Razmer,BombKol);
}
}
if(Button==mbRight)
{
if(!Pole[XPos][YPos].Opened)
{
if(Pole[XPos][YPos].Checked)
{
Pole[XPos][YPos].Checked=false;
BombLeft++;
}else
{
Pole[XPos][YPos].Checked=true;
BombLeft--;
}
DrawCell(XPos,YPos);
}
}
UpdateCaption();
if(CheckWin())
{
ShowMessage("Победа!!!!!!!!");
New(Razmer,BombKol);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::New(int R, int BC)
{
Razmer=R;
for(int j=0;j<Razmer;j++)
for(int i=0;i<Razmer;i++)
{
Pole[i][j].Opened=false;
Pole[i][j].BombCol=0;
Pole[i][j].Checked=false;
Pole[i][j].Mined=false;
}
BombKol=BC;
BombLeft=BombKol;
RandomizeBomb();
PoleCanvas->Width=20*Razmer;
PoleCanvas->Height=20*Razmer;
Form1->ClientWidth=20*Razmer+60;
Form1->ClientHeight=20*Razmer+20;
UpdateCaption();
Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N5Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
New(9,10);
Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N3Click(TObject *Sender)
{
New(30,99);
Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DrawAll()
{
PoleCanvas->Canvas->Font->Size=13;
PoleCanvas->Canvas->Font->Color=clGreen;
for(int j=0;j<Razmer;j++)
for(int i=0;i<Razmer;i++)
{
Pole[i][j].Opened=true;
DrawCell(i,j);
if (Pole[i][j].Mined) BombLeft -=1;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UpdateCaption()
{
Caption="СаперБомб="+IntToStr(BombLeft)+" ";
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::CheckWin()
{
for(int j=0;j<Razmer;j++)
for(int i=0;i<Razmer;i++)
{
if((Pole[i][j].Mined)&&(!Pole[i][j].Checked))
return false;
}
return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N6Click(TObject *Sender)
{
New(16,40);
Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckRekursively(int x, int y)
{
if((x>Razmer-1)||(x<0)||(y>Razmer-1)||(y<0))return;
if(!Pole[x][y].Opened)
{
Pole[x][y].Opened=true;
if(Pole[x][y].BombCol==0)
{
CheckRekursively(x+1,y);
CheckRekursively(x-1,y);
CheckRekursively(x,y+1);
CheckRekursively(x,y-1);
CheckRekursively(x+1,y+1);
CheckRekursively(x-1,y-1);
CheckRekursively(x-1,y+1);
CheckRekursively(x+1,y-1);
}
}
}
