Advertisement
Guest User

Untitled

a guest
Oct 29th, 2010
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.63 KB | None | 0 0
  1. #include "saper.h"
  2.  
  3. CApp::CRes::CRes()
  4. {
  5.     IMG_Init (IMG_INIT_PNG);
  6.     surf = new SDL_Surface* [COUNT];
  7.     surf[I_PLAY] = IMG_Load ("res/play.png");
  8.     surf[I_WIN] = IMG_Load ("res/win.png");
  9.     surf[I_LOSE] = IMG_Load ("res/lose.png");
  10.     surf[I_CLEAR] = IMG_Load ("res/clear.png");
  11.     surf[I_FLAG] = IMG_Load ("res/flag.png");
  12.     surf[I_CHECK] = IMG_Load ("res/check.png");
  13.     surf[I_MINE] = IMG_Load ("res/mine.png");
  14.     surf[I_GOTMINE] = IMG_Load ("res/gotmine.png");
  15. }
  16.  
  17. bool CApp::CBoard::Create()
  18. {
  19.     Destroy();
  20.  
  21.     if (x == 0 || y == 0)
  22.         return false;
  23.  
  24.     fields = new CField* [x];
  25.     for (int i = 0; i < x; ++i)
  26.         fields [x] = new CField [y];
  27.     return created = true;
  28. }
  29.  
  30. void CApp::CBoard::Destroy()
  31. {
  32.     if (!created)
  33.         return;
  34.  
  35.     for (int i = 0; i < x; ++i)
  36.     {
  37.         delete[] fields [x];
  38.     }
  39.     delete[] fields;
  40.     created = false;
  41. }
  42.  
  43. bool CApp::Reset()
  44. {
  45.  
  46.     board.Create();
  47.     return board;
  48. }
  49.  
  50. bool CApp::Click (int x, int y)
  51. {
  52.     if (!board (x, y))
  53.         return false;
  54.     if (board (x, y)->Is (CField::CHECK) )
  55.         return false;
  56.  
  57.     board (x, y)->Set (CField::CHECK, true);
  58.     if (board (x, y)->Is (CField::MINE) )
  59.         return true;
  60.  
  61.     if (board (x, y)->mAround == 0)
  62.     {
  63.         Click (x-1, y-1);
  64.         Click (x, y-1);
  65.         Click (x+1, y-1);
  66.         Click (x-1, y);
  67.         Click (x+1, y);
  68.         Click (x-1, y+1);
  69.         Click (x, y+1);
  70.         Click (x+1, y+1);
  71.     }
  72.     return false;
  73. }
  74.  
  75. bool CApp::BothClick (int x, int y)
  76. {
  77.     if (board (x, y)->Is (CField::CHECK) )
  78.         return false;
  79.     if (board (x, y)->fAround != board (x, y)->mAround)
  80.         return false;
  81.  
  82.     return Click (x-1, y-1)
  83.         + Click (x, y-1)
  84.         + Click (x+1, y-1)
  85.         + Click (x-1, y)
  86.         + Click (x+1, y)
  87.         + Click (x-1, y+1)
  88.         + Click (x, y+1)
  89.         + Click (x+1, y+1);
  90. }
  91.  
  92. bool CApp::SetMine (int x, int y)
  93. {
  94.     if (board (x, y)->Is (CField::MINE) )
  95.         return false;
  96.  
  97.     board (x-1, y-1)->Set (CField::MINE, true);
  98.     board (x, y-1)->mAround += 1;
  99.     board (x+1, y-1)->mAround += 1;
  100.     board (x-1, y)->mAround += 1;
  101.     board (x+1, y)->mAround += 1;
  102.     board (x-1, y+1)->mAround += 1;
  103.     board (x, y+1)->mAround += 1;
  104.     board (x+1, y+1)->mAround += 1;
  105.     return true;
  106. }
  107.  
  108. int CApp::Run()
  109. {
  110.     if (!(screen = SDL_SetVideoMode (
  111.             AbsX = 2 * Size::hMargin + board.x * Size::Field,
  112.             AbsY = 2 * Size::vMargin + board.y * Size::Field + Size::Face + Size::FaceSpace,
  113.             32, SDL_SWSURFACE) ) )
  114.     { return 4+1; }
  115.  
  116.     if (!board.Create())
  117.     {
  118.         board.x = Size::BoardX;
  119.         board.y = Size::BoardY;
  120.         return 0;
  121.     }
  122.  
  123.     Draw();
  124.  
  125.     while (true)
  126.     {
  127.         SDL_PumpEvents();
  128.         Draw();
  129.     }
  130. }
  131.  
  132. int main()
  133. {
  134.     if (SDL_Init (SDL_INIT_EVERYTHING) != 0)
  135.         return 1;
  136.     if ( !(IMG_Init (IMG_INIT_PNG) & IMG_INIT_PNG) )
  137.         return 2;
  138.     CApp App;
  139.     App.board.x = Size::BoardX;
  140.     App.board.y = Size::BoardY;
  141.     int rt;
  142.     for (; (rt = App.Run()) == 0;);
  143.     return rt-1;
  144. }
  145.  
  146. void CApp::Draw()
  147. {
  148.     SDL_Rect work;
  149.     SDL_FillRect (screen, 0,
  150.         SDL_MapRGB(screen->format, Size::BgR, Size::BgG, Size::BgB) );
  151.  
  152.     work = {AbsX / 2 - Size::Face / 2,
  153.             Size::vMargin, Size::Face, Size::Face};
  154.     SDL_BlitSurface (res[I_PLAY], 0, screen, &work);
  155.  
  156.     work = {Size::hMargin, Size::vMargin + Size::Face + Size::FaceSpace,
  157.             Size::Field, Size::Field};
  158.     for (int y = 0; y < board.y; ++y)
  159.     {
  160.         for (int x = 0; x < board.x; ++x)
  161.         {
  162.             SDL_Surface* tSurf;
  163.             if (board(x,y)->Is (CField::CHECK))
  164.             {
  165.                 if (board(x,y)->Is (CField::MINE))
  166.                     tSurf = res[I_MINE];
  167.                 else
  168.                     tSurf = res[I_CHECK];
  169.             }
  170.             else
  171.             {
  172.                 if (board(x,y)->Is (CField::FLAG))
  173.                     tSurf = res[I_FLAG];
  174.                 else
  175.                     tSurf = res[I_CLEAR];
  176.             }
  177.  
  178.  
  179.             SDL_BlitSurface (tSurf, 0, screen, &work);
  180.             work.x += Size::Field;
  181.         }
  182.         work.x = Size::hMargin;
  183.         work.y += Size::Field;
  184.     }
  185.  
  186.     SDL_Flip (screen);
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement