Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "saper.h"
- CApp::CRes::CRes()
- {
- IMG_Init (IMG_INIT_PNG);
- surf = new SDL_Surface* [COUNT];
- surf[I_PLAY] = IMG_Load ("res/play.png");
- surf[I_WIN] = IMG_Load ("res/win.png");
- surf[I_LOSE] = IMG_Load ("res/lose.png");
- surf[I_CLEAR] = IMG_Load ("res/clear.png");
- surf[I_FLAG] = IMG_Load ("res/flag.png");
- surf[I_CHECK] = IMG_Load ("res/check.png");
- surf[I_MINE] = IMG_Load ("res/mine.png");
- surf[I_GOTMINE] = IMG_Load ("res/gotmine.png");
- }
- bool CApp::CBoard::Create()
- {
- Destroy();
- if (x == 0 || y == 0)
- return false;
- fields = new CField* [x];
- for (int i = 0; i < x; ++i)
- fields [x] = new CField [y];
- return created = true;
- }
- void CApp::CBoard::Destroy()
- {
- if (!created)
- return;
- for (int i = 0; i < x; ++i)
- {
- delete[] fields [x];
- }
- delete[] fields;
- created = false;
- }
- bool CApp::Reset()
- {
- board.Create();
- return board;
- }
- bool CApp::Click (int x, int y)
- {
- if (!board (x, y))
- return false;
- if (board (x, y)->Is (CField::CHECK) )
- return false;
- board (x, y)->Set (CField::CHECK, true);
- if (board (x, y)->Is (CField::MINE) )
- return true;
- if (board (x, y)->mAround == 0)
- {
- Click (x-1, y-1);
- Click (x, y-1);
- Click (x+1, y-1);
- Click (x-1, y);
- Click (x+1, y);
- Click (x-1, y+1);
- Click (x, y+1);
- Click (x+1, y+1);
- }
- return false;
- }
- bool CApp::BothClick (int x, int y)
- {
- if (board (x, y)->Is (CField::CHECK) )
- return false;
- if (board (x, y)->fAround != board (x, y)->mAround)
- return false;
- return Click (x-1, y-1)
- + Click (x, y-1)
- + Click (x+1, y-1)
- + Click (x-1, y)
- + Click (x+1, y)
- + Click (x-1, y+1)
- + Click (x, y+1)
- + Click (x+1, y+1);
- }
- bool CApp::SetMine (int x, int y)
- {
- if (board (x, y)->Is (CField::MINE) )
- return false;
- board (x-1, y-1)->Set (CField::MINE, true);
- board (x, y-1)->mAround += 1;
- board (x+1, y-1)->mAround += 1;
- board (x-1, y)->mAround += 1;
- board (x+1, y)->mAround += 1;
- board (x-1, y+1)->mAround += 1;
- board (x, y+1)->mAround += 1;
- board (x+1, y+1)->mAround += 1;
- return true;
- }
- int CApp::Run()
- {
- if (!(screen = SDL_SetVideoMode (
- AbsX = 2 * Size::hMargin + board.x * Size::Field,
- AbsY = 2 * Size::vMargin + board.y * Size::Field + Size::Face + Size::FaceSpace,
- 32, SDL_SWSURFACE) ) )
- { return 4+1; }
- if (!board.Create())
- {
- board.x = Size::BoardX;
- board.y = Size::BoardY;
- return 0;
- }
- Draw();
- while (true)
- {
- SDL_PumpEvents();
- Draw();
- }
- }
- int main()
- {
- if (SDL_Init (SDL_INIT_EVERYTHING) != 0)
- return 1;
- if ( !(IMG_Init (IMG_INIT_PNG) & IMG_INIT_PNG) )
- return 2;
- CApp App;
- App.board.x = Size::BoardX;
- App.board.y = Size::BoardY;
- int rt;
- for (; (rt = App.Run()) == 0;);
- return rt-1;
- }
- void CApp::Draw()
- {
- SDL_Rect work;
- SDL_FillRect (screen, 0,
- SDL_MapRGB(screen->format, Size::BgR, Size::BgG, Size::BgB) );
- work = {AbsX / 2 - Size::Face / 2,
- Size::vMargin, Size::Face, Size::Face};
- SDL_BlitSurface (res[I_PLAY], 0, screen, &work);
- work = {Size::hMargin, Size::vMargin + Size::Face + Size::FaceSpace,
- Size::Field, Size::Field};
- for (int y = 0; y < board.y; ++y)
- {
- for (int x = 0; x < board.x; ++x)
- {
- SDL_Surface* tSurf;
- if (board(x,y)->Is (CField::CHECK))
- {
- if (board(x,y)->Is (CField::MINE))
- tSurf = res[I_MINE];
- else
- tSurf = res[I_CHECK];
- }
- else
- {
- if (board(x,y)->Is (CField::FLAG))
- tSurf = res[I_FLAG];
- else
- tSurf = res[I_CLEAR];
- }
- SDL_BlitSurface (tSurf, 0, screen, &work);
- work.x += Size::Field;
- }
- work.x = Size::hMargin;
- work.y += Size::Field;
- }
- SDL_Flip (screen);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement