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

📄 honeyhole.h

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

class CHoneyHole
{
protected:
  int  _No;

  void No_to_FSO ( int  N, int& F, int& S, int& O );
  void FSO_to_XY ( int  F, int  S, int  o, int& X, int& Y );
  void XY_to_FSO ( int  X, int  Y, int& F, int& S, int& O );
  void FSO_to_No ( int  F, int  S, int  O, int& N );
public:
  CHoneyHole ()                      { set ();        }
  CHoneyHole ( const CHoneyHole& H )        { set (H);       }
  CHoneyHole ( int N )               { set (N);       }
  CHoneyHole ( int X, int Y )        { set (X, Y);    }
  CHoneyHole ( int F, int S, int O ) { set (F, S, O); }

  ~CHoneyHole() {}

  operator int ( ) { return _No; }

  int set ( const CHoneyHole& H );
  int set ( int N=0 );
  int set ( int X, int Y );
  int set ( int F, int S, int O );

  int get ();
  int get ( int& N );
  int get ( int& X, int& Y );
  int get ( int& F, int& S, int& O );

  int distance ( CHoneyHole H );

  int move ( int dir, int step = 1 );
  
  int turn ( int a = 1 );
};

int CHoneyHole::set( const CHoneyHole& H )
{
  return _No = H._No;
}

int CHoneyHole::set( int N )
{
  return _No = N < 0 ? 0 : N;
}

int CHoneyHole::set( int X, int Y )
{
  int F, S, O, N;
  XY_to_FSO (X, Y, F, S, O);
  FSO_to_No (F, S, O, N);
  return _No = N;
}

int CHoneyHole::set( int F, int S, int O )
{
  int N;
  FSO_to_No (F, S, O, N);
  return _No = N;
}

int CHoneyHole::get()
{
  return _No;
}

int CHoneyHole::get( int& N )
{
  return N = _No;
}

int CHoneyHole::get( int& X, int& Y )
{
  int F, S, O;
  No_to_FSO (_No, F, S, O);
  FSO_to_XY (F, S, O, X, Y);
  return _No;
}

int CHoneyHole::get( int& F, int& S, int& O )
{
  No_to_FSO (_No, F, S, O);
  return _No;
}

int CHoneyHole::distance( CHoneyHole h = CHoneyHole() )
{
  int x, y, x1, y1;
  get (x, y);
  h.get (x1, y1);
  x -= x1;
  y -= y1;
  CHoneyHole d(x, y);
  int f, s, o;
  d.get (f, s, o);
  return f;
}

int CHoneyHole::move( int dir, int step )
{
  int x, y;
  get (x, y);
  switch( dir )
  {
    case 0: x += step;            break;
    case 1: x += step; y += step; break;
    case 2: y += step;            break;
    case 3: x -= step;            break;
    case 4: x -= step; y -= step; break;
    case 5: y -= step;            break;
    default:
      return -1;
  }
  return set (x, y);
}

int CHoneyHole::turn( int a )
{
  int f, s, o;
  get (f, s, o);
  s += a % 6 + 6;
  s %= 6;
  return set (f, s, o);
}

void  CHoneyHole::No_to_FSO ( int  N , int& F , int& S , int& O )
{

  if( N == 0 )  // if No equal 0
  {
    F = 0;
    S = 0;
    O = 0;

    return ;
  }

  int  f , s , o;

  f = 0;
  while( ( f+1 ) * f * 3 < N )
    f++;

  s = ( ( f+1 ) * f * 3 - N ) / f;

  o = ( ( f+1 ) * f * 3 - N - s * f ) % f;

  F = f;
  S = s;
  O = o;

}

void  CHoneyHole::FSO_to_No ( int  F , int  S , int  O , int& N )
{

  N = ( F+1 ) * F * 3 - S * F - O;

}

void  CHoneyHole::FSO_to_XY ( int  F , int  S , int  O , int& X , int& Y )
{

  if( F == 0 )         // if No equal 0
  {
    X = 0;
    Y = 0;

    return ;
  }

  int  x , y;

  switch( S )
  {
    case 0:  x = F;        y = O;        break;
    case 1:  x = F - O;    y = F;        break;
    case 2:  x = - O;      y = F - O;    break;
    case 3:  x = - F;      y = - O;      break;
    case 4:  x = - F + O;  y = - F;      break;
    case 5:  x = O;        y = - F + O;  break;
  }

  X = x;
  Y = y;

}

void  CHoneyHole::XY_to_FSO ( int  X , int  Y , int& F , int& S , int& O )
{

  if( !X && !Y )       // if X==0 and Y==0
  {
    F = 0;
    S = 0;
    O = 0;

    return ;
  }

  int  f , s , o;

  if     ( ( Y >= 0 ) && ( X > Y ) )   // get the value of S
    s = 0;
  else if( ( X > 0 ) && ( Y >= X ) )
    s = 1;
  else if( ( Y > 0 ) && ( X <= 0 ) )
    s = 2;
  else if( ( Y <= 0 ) && ( Y > X ) )
    s = 3;
  else if( ( X < 0 ) && ( X >= Y ) )
    s = 4;
  else if( ( Y < 0 ) && ( X >= 0 ) )
    s = 5;

  switch( s )
  {
    case  0:  f = X;      o = Y;      break;
    case  1:  f = Y;      o = Y - X;  break;
    case  2:  f = Y - X;  o = - X;    break;
    case  3:  f = - X;    o = - Y;    break;
    case  4:  f = - Y;    o = X - Y;  break;
    case  5:  f = X - Y;  o = X;      break;
  }

  F = f;
  S = s;
  O = o;
}

#endif

⌨️ 快捷键说明

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