⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tsixmine.cpp

📁 自己用C编写的小游戏
💻 CPP
字号:
#ifndef  __BenBear_SixMine_TMine_cpp
#define  __BenBear_SixMine_TMine_cpp

#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
#include "HoneyHole.h"

const int dDefaultFloor = 5;
const double dlDefaultRotia = 0.2;

enum TState { hsCover, hsOpen, hsMark, hsError };
enum TValue { hv0 = 0, hv1 = 1, hv2 = 2,
              hv3 = 3, hv4 = 4, hv5 = 5,
              hv6 = 6, hvMine = 7
            };
//enum TReturn   { hrOK, hrNull, hrWin, hrDie };
typedef  int  TReturn;
const int  hrOK=0,hrNull=1,hrWin=2,hrDie=3;
struct TMineHole
{
  TValue v;
  TState s;
};
const TMineHole MineHoleEmpty = { hv0, hsCover };

//////////////////////////////////////////////////
//        the prototype of TSixMine
//////////////////////////////////////////////////
struct TSixMine
{
  vector<TMineHole>  holes;
  CHoneyHole pos;
  int floor, hole, mine;
  int left_mine, open_hole;

  TReturn set( int  dFloor = dDefaultFloor,
               double  dlRotia = dlDefaultRotia );
  TReturn set( int  dFloor, int  dMine );

  TReturn win();
  TReturn die();

  TReturn reset();
  TReturn lay  ()  {  return  lay(hole);  }
  TReturn lay  ( CHoneyHole  p );
  
  TReturn move( int  dDirection );
  
  TReturn dig     ( CHoneyHole  p );
  TReturn wide_dig( CHoneyHole  p );
  TReturn mark    ( CHoneyHole  p );
  TReturn dig()       {  return  dig( pos );  }
  TReturn wide_dig()  {  return  wide_dig( pos );  }
  TReturn mark()      {  return  mark( pos );  }
  
public:
  // constructor, destructor define
  TSixMine( int dFloor = dDefaultFloor, double dlRotia = dlDefaultRotia )
  {
    set( dFloor, dlRotia );
    reset();
  }
  
  ~TSixMine() {}
};

//////////////////////////////////////////////////
//       the implemetation of TSixMine
//////////////////////////////////////////////////

/******************** die() *********************/
TReturn TSixMine::die()
{
  int i;
  for( i = 0; i < hole; i++ )
    if( holes[ i ].v != hvMine && holes[ i ].s == hsMark )
      holes[i].s = hsError;
  pos = hole;
  return hrDie;
}

/******************** dig() *********************/
TReturn TSixMine::dig( CHoneyHole p )
{
  if( p >= hole )
    return hrNull;
  if( holes[ p ].s != hsCover )
    return hrNull;

  if( holes[ p ].v == hvMine )
  {
    holes[ p ].s = hsError;
    return die();
  }

  holes[ p ].s = hsOpen;
  open_hole++;
  if( open_hole + mine == hole )
  {
//    return win();
    win();
    return  hrWin;
  }

  if( holes[ p ].v == hv0 )
  {
    CHoneyHole h;
    int i;
    TReturn re;
    for( i = 0; i < 6; i++ )
    {
      h = p;
      h.move( i );
      if( h >= hole )
        continue;
      re = dig( h );
      if( re == hrWin )
        return re;
    }
  }
  return hrOK;
}

/********************* lay() ********************/
TReturn TSixMine::lay( CHoneyHole  p )
{
  int i, d;
  int r;
  CHoneyHole h;

  srand( time(0) );
  for( i = 0; i < hole; i++ )
    holes[i] = MineHoleEmpty;

  for( i = 0; i < mine; i++ )
  {
    do
    {
      r = rand()%hole;
    }
    while( holes[r].v == hvMine || r == p );

    holes[r].v = hvMine;
    for( d = 0; d < 6; d++ )
    {
      h = r;
      h.move( d );
      if(( h >= hole ) || ( holes[h].v == hvMine ))
        continue;
      holes[h].v = static_cast<TValue>(holes[h].v + 1);
    }
  }
  return hrOK;
}

/******************** mark() *******************/
TReturn TSixMine::mark( CHoneyHole  p )
{
  if( ( holes[ p ].s == hsOpen )
      || ( holes[ p ].s == hsCover && left_mine <= 0 ) )
    return hrNull;

  if( holes[ p ].s == hsCover )
  {
    holes[ p ].s = hsMark;
    left_mine--;
  }
  else
  {
    holes[ p ].s = hsCover;
    left_mine++;
  }
  return hrOK;
}

/******************** move() ********************/
TReturn TSixMine::move( int dDirection )
{
  CHoneyHole h = pos;
  h.move( dDirection );
  if( h >= hole )
    return hrNull;
  
  pos = h;
  
  return hrOK;
}

/******************** reset() *******************/
TReturn TSixMine::reset()
{
  left_mine = mine;
  open_hole = 0;
  pos = 0;
  lay();

  return hrOK;
}

/********************* set() ********************/
TReturn TSixMine::set( int dFloor, double dlRotia )
{
  if( dFloor < 1 )
    dFloor = dDefaultFloor;
  if( dlRotia < 0.0 || dlRotia > 1.0 )
    dlRotia = dlDefaultRotia;
  
  floor = dFloor;
  hole = floor * ( floor + 1 ) * 3 + 1;
  mine = static_cast <int> ( hole * dlRotia );
  
  if( holes.size() < hole )
    holes.resize( hole );
  reset();
  return hrOK;
}

/****************** set_mine() ******************/
TReturn TSixMine::set( int  dFloor, int  dMine )
{
  if( dFloor < 1 )
    dFloor = dDefaultFloor;
  
  floor = dFloor;
  hole = floor * ( floor + 1 ) * 3 + 1;
  
  if( dMine < 1 || dMine >= hole )
    dMine = static_cast<int>(hole*dlDefaultRotia);
  
  mine = dMine;
  
  if( holes.size() < hole )
    holes.resize( hole );
  
  return  hrOK;
}

/****************** wide_dig() ******************/
TReturn TSixMine::wide_dig( CHoneyHole  p )
{
  if( holes[ p ].s != hsOpen )
    return hrNull;
  int i, s=0, d=0, t=0;
  CHoneyHole h;
  for( i = 0; i < 6; i++ )
  {
    h = p;
    h.move( i );
    if( h >= hole )
      continue;
    t++;
    if( holes[ h ].s == hsMark )
      s++;
    if( holes[ h ].s == hsOpen )
      d++;
  }
  if(( s != holes[ p ].v )&&( d != t - holes[ p ].v ))
    return hrNull;
  TReturn re;
  if( s == holes[ p ].v )
    for( i = 0; i < 6; i++ )
    {
      h = p;
      h.move( i );
      if( h > hole )
        continue;
      if( holes[ h ].s == hsMark )
        continue;
      re = dig( h );
      if( re == hrWin || re == hrDie )
        return re;
    }
  else
  {
    CHoneyHole h2 = p;
    for( i = 0; i < 6; i++ )
    {
      p = h2;
      p.move( i );
      if( p > hole )
        continue;
      if( holes[ p ].s != hsCover )
        continue;
      mark(p);
    }
    p = h2;
  }
  return hrOK;
}

/******************** win() *********************/
TReturn TSixMine::win()
{
  int i;
  for( i = 0; i < hole; i++ )
    if( holes[ i ].v == hvMine )
      holes[ i ].s == hsMark;
  pos = hole;
  return  hrWin;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -