git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5300 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        bombs1.cpp
 | |
| // Purpose:     Implementation of the class BombsGame
 | |
| // Author:      P. Foggia 1996
 | |
| // Modified by:
 | |
| // Created:     1996
 | |
| // RCS-ID:      $Id$
 | |
| // Copyright:   (c) 1996 P. Foggia
 | |
| // Licence:     wxWindows licence
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifdef __GNUG__
 | |
| #pragma implementation
 | |
| #endif
 | |
| 
 | |
| #include "wx/wxprec.h"
 | |
| 
 | |
| #ifndef  WX_PRECOMP
 | |
|   #include "wx/wx.h"
 | |
| #endif //precompiled headers
 | |
| 
 | |
| #include "game.h"
 | |
| #include <stdlib.h>
 | |
| #include <limits.h>
 | |
| 
 | |
| #define PROB 0.2
 | |
| 
 | |
| #ifndef RAND_MAX
 | |
| #define RAND_MAX INT_MAX
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /*--------------------  BombsGame::~BombsGame()  ---------------------*/
 | |
| /*--------------------------------------------------------------------*/
 | |
| BombsGame::~BombsGame()
 | |
|   { if (field)
 | |
|       free(field);
 | |
|   }
 | |
| 
 | |
| /*------------------  int BombsGame::Init(width,height)  -------------------*/
 | |
| /* Initialize the play field.   Returns 0 on failure                        */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| int BombsGame::Init(int aWidth, int aHeight)
 | |
|   { int x, y;
 | |
|     int xx, yy;
 | |
| 
 | |
|     if (field)
 | |
|       free(field);
 | |
|     field=(short *)malloc(aWidth*aHeight*sizeof(short));
 | |
|     if (!field)
 | |
|       { width=height=0;
 | |
|         return 0;
 | |
|       }
 | |
|     width=aWidth;
 | |
|     height=aHeight;
 | |
| 
 | |
|     for(x=0; x<width; x++)
 | |
|       for(y=0; y<height; y++)
 | |
|         { field[x+y*width] = ((float)rand()/RAND_MAX <PROB)?
 | |
|                              BG_HIDDEN | BG_BOMB :
 | |
|                              BG_HIDDEN;
 | |
|         }
 | |
| 
 | |
|     bombs=0;
 | |
|     for(x=0; x<width; x++)
 | |
|       for(y=0; y<height; y++)
 | |
|         if (field[x+y*width] & BG_BOMB)
 | |
|           { bombs++;
 | |
|             for(xx=x-1; xx<=x+1; xx++)
 | |
|               if (xx>=0 && xx<width)
 | |
|                 for(yy=y-1; yy<=y+1; yy++)
 | |
|                   if (yy>=0 && yy<height && (yy!=y || xx!=x))
 | |
|                     field[xx+yy*width]++;
 | |
|           }
 | |
|     normal_cells=height*width-bombs;
 | |
|     return 1;
 | |
|   }
 | |
| 
 | |
| /*----------------------  BombsGame::Mark(x,y)  -------------------------*/
 | |
| /* Marks/unmarks a cell                                                  */
 | |
| /*-----------------------------------------------------------------------*/
 | |
| void BombsGame::Mark(int x, int y)
 | |
|   {
 | |
|       field[x+y*width] ^= BG_MARKED;
 | |
|   }
 | |
| 
 | |
| /*-------------------  BombsGame::Unhide(x,y)  ------------------------*/
 | |
| /* Unhides a cell                                                      */
 | |
| /*---------------------------------------------------------------------*/
 | |
| void BombsGame::Unhide(int x, int y)
 | |
|   { if (!IsHidden(x,y))
 | |
|       return;
 | |
|     field[x+y*width] &= ~BG_HIDDEN;
 | |
|     if (!IsBomb(x,y))
 | |
|       normal_cells--;
 | |
|   }
 | |
| 
 | |
| /*-------------------  BombsGame::Explode(x,y)  ------------------------*/
 | |
| /* Makes a cell exploded                                                */
 | |
| /*----------------------------------------------------------------------*/
 | |
| void BombsGame::Explode(int x, int y)
 | |
|   {
 | |
|     field[x+y*width] |= BG_EXPLODED;
 | |
|   }
 | |
| 
 |