home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2233.zip / wxOS2-2_3_3.zip / wxWindows-2.3.3 / demos / bombs / game.cpp < prev    next >
C/C++ Source or Header  |  2000-01-08  |  3KB  |  106 lines

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Name:        bombs1.cpp
  3. // Purpose:     Implementation of the class BombsGame
  4. // Author:      P. Foggia 1996
  5. // Modified by:
  6. // Created:     1996
  7. // RCS-ID:      $Id: game.cpp,v 1.1 2000/01/08 15:27:36 VZ Exp $
  8. // Copyright:   (c) 1996 P. Foggia
  9. // Licence:     wxWindows licence
  10. ///////////////////////////////////////////////////////////////////////////////
  11.  
  12. #ifdef __GNUG__
  13. #pragma implementation
  14. #endif
  15.  
  16. #include "wx/wxprec.h"
  17.  
  18. #ifndef  WX_PRECOMP
  19.   #include "wx/wx.h"
  20. #endif //precompiled headers
  21.  
  22. #include "game.h"
  23. #include <stdlib.h>
  24. #include <limits.h>
  25.  
  26. #define PROB 0.2
  27.  
  28. #ifndef RAND_MAX
  29. #define RAND_MAX INT_MAX
  30. #endif
  31.  
  32.  
  33. /*--------------------  BombsGame::~BombsGame()  ---------------------*/
  34. /*--------------------------------------------------------------------*/
  35. BombsGame::~BombsGame()
  36.   { if (field)
  37.       free(field);
  38.   }
  39.  
  40. /*------------------  int BombsGame::Init(width,height)  -------------------*/
  41. /* Initialize the play field.   Returns 0 on failure                        */
  42. /*--------------------------------------------------------------------------*/
  43. int BombsGame::Init(int aWidth, int aHeight)
  44.   { int x, y;
  45.     int xx, yy;
  46.  
  47.     if (field)
  48.       free(field);
  49.     field=(short *)malloc(aWidth*aHeight*sizeof(short));
  50.     if (!field)
  51.       { width=height=0;
  52.         return 0;
  53.       }
  54.     width=aWidth;
  55.     height=aHeight;
  56.  
  57.     for(x=0; x<width; x++)
  58.       for(y=0; y<height; y++)
  59.         { field[x+y*width] = ((float)rand()/RAND_MAX <PROB)?
  60.                              BG_HIDDEN | BG_BOMB :
  61.                              BG_HIDDEN;
  62.         }
  63.  
  64.     bombs=0;
  65.     for(x=0; x<width; x++)
  66.       for(y=0; y<height; y++)
  67.         if (field[x+y*width] & BG_BOMB)
  68.           { bombs++;
  69.             for(xx=x-1; xx<=x+1; xx++)
  70.               if (xx>=0 && xx<width)
  71.                 for(yy=y-1; yy<=y+1; yy++)
  72.                   if (yy>=0 && yy<height && (yy!=y || xx!=x))
  73.                     field[xx+yy*width]++;
  74.           }
  75.     normal_cells=height*width-bombs;
  76.     return 1;
  77.   }
  78.  
  79. /*----------------------  BombsGame::Mark(x,y)  -------------------------*/
  80. /* Marks/unmarks a cell                                                  */
  81. /*-----------------------------------------------------------------------*/
  82. void BombsGame::Mark(int x, int y)
  83.   {
  84.       field[x+y*width] ^= BG_MARKED;
  85.   }
  86.  
  87. /*-------------------  BombsGame::Unhide(x,y)  ------------------------*/
  88. /* Unhides a cell                                                      */
  89. /*---------------------------------------------------------------------*/
  90. void BombsGame::Unhide(int x, int y)
  91.   { if (!IsHidden(x,y))
  92.       return;
  93.     field[x+y*width] &= ~BG_HIDDEN;
  94.     if (!IsBomb(x,y))
  95.       normal_cells--;
  96.   }
  97.  
  98. /*-------------------  BombsGame::Explode(x,y)  ------------------------*/
  99. /* Makes a cell exploded                                                */
  100. /*----------------------------------------------------------------------*/
  101. void BombsGame::Explode(int x, int y)
  102.   {
  103.     field[x+y*width] |= BG_EXPLODED;
  104.   }
  105.  
  106.