your input flovodoh

profilevazquez1012
nshaffer_mod9tetris_342017_3.zip

NewTetrisScore.cpp

NewTetrisScore.cpp

// newTetris.cpp : Defines the entry point for the console application.
//

#include   "stdafx.h"
#include   < stdlib . h >
#include   < iostream >
#include   < time . h >
#include   < windows . h >

#define  GAME_INTERVAL  20
#define  DIR_DOWN  2
#define  DIR_LEFT  4
#define  DIR_RIGHT  6
#define  DIR_ROTATE  5

using   namespace  std ;

class   TetrisShape   {
public :
     char  shapeArray [ 4 ][ 4 ];
     int  shapeTopLeftX  =   6 ;
     int  shapeTopLeftY  =   0 ;
    
     void  populateShapeArray ( int  shape );
     void  rotate ();
     template   < size_t rows ,  size_t cols >
     void  setShape ( char ( & shape )[ rows ][ cols ]);
     TetrisShape ( int  shape )   {  populateShapeArray ( shape );   };
     TetrisShape ()   {};
};


void   TetrisShape :: rotate ()   {
     char  _shapeArray [ 4 ][ 4 ];

    _shapeArray [ 0 ][ 0 ]   =  shapeArray [ 0 ][ 3 ];  _shapeArray [ 1 ][ 0 ]   =  shapeArray [ 0 ][ 2 ];  _shapeArray [ 2 ][ 0 ]   =  shapeArray [ 0 ][ 1 ];  _shapeArray [ 3 ][ 0 ]   =  shapeArray [ 0 ][ 0 ];
    _shapeArray [ 0 ][ 1 ]   =  shapeArray [ 1 ][ 3 ];  _shapeArray [ 1 ][ 1 ]   =  shapeArray [ 1 ][ 2 ];  _shapeArray [ 2 ][ 1 ]   =  shapeArray [ 1 ][ 1 ];  _shapeArray [ 3 ][ 1 ]   =  shapeArray [ 1 ][ 0 ];
    _shapeArray [ 0 ][ 2 ]   =  shapeArray [ 2 ][ 3 ];  _shapeArray [ 1 ][ 2 ]   =  shapeArray [ 2 ][ 2 ];  _shapeArray [ 2 ][ 2 ]   =  shapeArray [ 2 ][ 1 ];  _shapeArray [ 3 ][ 2 ]   =  shapeArray [ 2 ][ 0 ];
    _shapeArray [ 0 ][ 3 ]   =  shapeArray [ 3 ][ 3 ];  _shapeArray [ 1 ][ 3 ]   =  shapeArray [ 3 ][ 2 ];  _shapeArray [ 2 ][ 3 ]   =  shapeArray [ 3 ][ 1 ];  _shapeArray [ 3 ][ 3 ]   =  shapeArray [ 3 ][ 0 ];

     for   ( int  _x  =   0 ;  _x  <   4 ;  _x ++ )   {
         for   ( int  _y  =   0 ;  _y  <   4 ;  _y ++ )   {
            shapeArray [ _x ][ _y ]   =  _shapeArray [ _x ][ _y ];
         }
     }
    
}

void   TetrisShape :: populateShapeArray ( int  shape )   {
     switch   ( shape )   {
     case   1 :
        shapeArray [ 0 ][ 0 ]   =   ' ' ;  shapeArray [ 1 ][ 0 ]   =   ' ' ;  shapeArray [ 2 ][ 0 ]   =   ' ' ;  shapeArray [ 3 ][ 0 ]   =   ' ' ;
        shapeArray [ 0 ][ 1 ]   =   ' ' ;  shapeArray [ 1 ][ 1 ]   =   'X' ;  shapeArray [ 2 ][ 1 ]   =   ' ' ;  shapeArray [ 3 ][ 1 ]   =   ' ' ;
        shapeArray [ 0 ][ 2 ]   =   ' ' ;  shapeArray [ 1 ][ 2 ]   =   'X' ;  shapeArray [ 2 ][ 2 ]   =   ' ' ;  shapeArray [ 3 ][ 2 ]   =   ' ' ;
        shapeArray [ 0 ][ 3 ]   =   ' ' ;  shapeArray [ 1 ][ 3 ]   =   'X' ;  shapeArray [ 2 ][ 3 ]   =   'X' ;  shapeArray [ 3 ][ 3 ]   =   ' ' ;
         break ;
     case   2 :
        shapeArray [ 0 ][ 0 ]   =   ' ' ;  shapeArray [ 1 ][ 0 ]   =   'X' ;  shapeArray [ 2 ][ 0 ]   =   ' ' ;  shapeArray [ 3 ][ 0 ]   =   ' ' ;
        shapeArray [ 0 ][ 1 ]   =   ' ' ;  shapeArray [ 1 ][ 1 ]   =   'X' ;  shapeArray [ 2 ][ 1 ]   =   ' ' ;  shapeArray [ 3 ][ 1 ]   =   ' ' ;
        shapeArray [ 0 ][ 2 ]   =   ' ' ;  shapeArray [ 1 ][ 2 ]   =   'X' ;  shapeArray [ 2 ][ 2 ]   =   ' ' ;  shapeArray [ 3 ][ 2 ]   =   ' ' ;
        shapeArray [ 0 ][ 3 ]   =   ' ' ;  shapeArray [ 1 ][ 3 ]   =   'X' ;  shapeArray [ 2 ][ 3 ]   =   ' ' ;  shapeArray [ 3 ][ 3 ]   =   ' ' ;
         break ;
     case   3 :
        shapeArray [ 0 ][ 0 ]   =   ' ' ;  shapeArray [ 1 ][ 0 ]   =   ' ' ;  shapeArray [ 2 ][ 0 ]   =   ' ' ;  shapeArray [ 3 ][ 0 ]   =   ' ' ;
        shapeArray [ 0 ][ 1 ]   =   ' ' ;  shapeArray [ 1 ][ 1 ]   =   'X' ;  shapeArray [ 2 ][ 1 ]   =   ' ' ;  shapeArray [ 3 ][ 1 ]   =   ' ' ;
        shapeArray [ 0 ][ 2 ]   =   ' ' ;  shapeArray [ 1 ][ 2 ]   =   'X' ;  shapeArray [ 2 ][ 2 ]   =   'X' ;  shapeArray [ 3 ][ 2 ]   =   ' ' ;
        shapeArray [ 0 ][ 3 ]   =   ' ' ;  shapeArray [ 1 ][ 3 ]   =   ' ' ;  shapeArray [ 2 ][ 3 ]   =   'X' ;  shapeArray [ 3 ][ 3 ]   =   ' ' ;
         break ;
     case   4 :
        shapeArray [ 0 ][ 0 ]   =   ' ' ;  shapeArray [ 1 ][ 0 ]   =   ' ' ;  shapeArray [ 2 ][ 0 ]   =   ' ' ;  shapeArray [ 3 ][ 0 ]   =   ' ' ;
        shapeArray [ 0 ][ 1 ]   =   ' ' ;  shapeArray [ 1 ][ 1 ]   =   ' ' ;  shapeArray [ 2 ][ 1 ]   =   'X' ;  shapeArray [ 3 ][ 1 ]   =   ' ' ;
        shapeArray [ 0 ][ 2 ]   =   ' ' ;  shapeArray [ 1 ][ 2 ]   =   'X' ;  shapeArray [ 2 ][ 2 ]   =   'X' ;  shapeArray [ 3 ][ 2 ]   =   ' ' ;
        shapeArray [ 0 ][ 3 ]   =   ' ' ;  shapeArray [ 1 ][ 3 ]   =   'X' ;  shapeArray [ 2 ][ 3 ]   =   ' ' ;  shapeArray [ 3 ][ 3 ]   =   ' ' ;
         break ;
     case   5 :
        shapeArray [ 0 ][ 0 ]   =   ' ' ;  shapeArray [ 1 ][ 0 ]   =   ' ' ;  shapeArray [ 2 ][ 0 ]   =   ' ' ;  shapeArray [ 3 ][ 0 ]   =   ' ' ;
        shapeArray [ 0 ][ 1 ]   =   ' ' ;  shapeArray [ 1 ][ 1 ]   =   ' ' ;  shapeArray [ 2 ][ 1 ]   =   'X' ;  shapeArray [ 3 ][ 1 ]   =   ' ' ;
        shapeArray [ 0 ][ 2 ]   =   ' ' ;  shapeArray [ 1 ][ 2 ]   =   ' ' ;  shapeArray [ 2 ][ 2 ]   =   'X' ;  shapeArray [ 3 ][ 2 ]   =   ' ' ;
        shapeArray [ 0 ][ 3 ]   =   ' ' ;  shapeArray [ 1 ][ 3 ]   =   'X' ;  shapeArray [ 2 ][ 3 ]   =   'X' ;  shapeArray [ 3 ][ 3 ]   =   ' ' ;
         break ;
     case   6 :
        shapeArray [ 0 ][ 0 ]   =   ' ' ;  shapeArray [ 1 ][ 0 ]   =   ' ' ;  shapeArray [ 2 ][ 0 ]   =   ' ' ;  shapeArray [ 3 ][ 0 ]   =   ' ' ;
        shapeArray [ 0 ][ 1 ]   =   ' ' ;  shapeArray [ 1 ][ 1 ]   =   ' ' ;  shapeArray [ 2 ][ 1 ]   =   ' ' ;  shapeArray [ 3 ][ 1 ]   =   ' ' ;
        shapeArray [ 0 ][ 2 ]   =   ' ' ;  shapeArray [ 1 ][ 2 ]   =   'X' ;  shapeArray [ 2 ][ 2 ]   =   'X' ;  shapeArray [ 3 ][ 2 ]   =   ' ' ;
        shapeArray [ 0 ][ 3 ]   =   ' ' ;  shapeArray [ 1 ][ 3 ]   =   'X' ;  shapeArray [ 2 ][ 3 ]   =   'X' ;  shapeArray [ 3 ][ 3 ]   =   ' ' ;
         break ;
     }
}
int  score  =   0 ;
int  currentShape  =   - 1 ;                 // this is going to represent the shape that is currently in play.
bool  isDropping  =   false ;               // global that defines if a piece is currently falling - mainly for gameTick function.
int  currentTick  =   0 ;

template   < size_t rows ,  size_t cols >
void  generateBucket ( char ( & bucket )[ rows ][ cols ]);         // Creates a slightly pre-filled bucket.
void  generateShapeStream ();    // Generate a stream of shapes.
void  dropShape ();         // Draw the shape top/center.
bool  moveShape ( int  direction );         // Move the shape in the spec. dir.
template   < size_t rows ,  size_t cols >
bool  gameTick ( char ( & bucket )[ rows ][ cols ],   char ( & perm_bucket )[ rows ][ cols ]);                                        // Handles what is going on in the game every second.
template   < size_t rows ,  size_t cols >
void  landShape ( char ( & bucket )[ rows ][ cols ]);                            // What to do when the shape hits the bottom.
template   < size_t rows ,  size_t cols >
int  checkScore ( char ( & bucket )[ rows ][ cols ],   char ( & perm_bucket )[ rows ][ cols ],   int  tempvar ,   int  score );
template   < size_t rows ,  size_t cols >
void  drawBucket ( char ( & bucket )[ rows ][ cols ]);                      // Draws the current contents of the bucket.
template   < size_t rows ,  size_t cols >
bool  canEnter ( int  direction ,   char ( & bucket )[ rows ][ cols ]);            // Checks if the shape can enter the space it is trying to drop into.
int  getUserInput ();                   // gets the key pressed from the user.
void  setCursorTo ( int  x ,   int  y );       // Move the cursor to the appropriate position
int  previousX  =   6 ,  previousY  =   0 ;
int  shapes [ 256 ];

template   < size_t rows ,  size_t cols >
int  check_bucket ( char ( & bucket )[ rows ][ cols ]);
template   < size_t rows ,  size_t cols >
void  set_bucket ( char ( & bucket )[ rows ][ cols ],   char ( & perm_bucket )[ rows ][ cols ]);

TetrisShape  activeShape ;

int  main ()   {
     // Two bucket arrays, one shown on the screen, the other with the permanent contents of the buckets (walls and any non-moving shapes)
     char  bucket [ 12 ][ 25 ];
     int  score  =   0 ;
     int  tempvar  =   0 ;
     char  _bucket [ 12 ][ 25 ];
     int  shapes [ 256 ]   =   {};
     int  shapeIndex  =   0 ;
     bool  gameOver  =   false ;

    generateBucket ( bucket );
    generateBucket ( _bucket );

    generateShapeStream ();


    drawBucket ( bucket );


     while   ( ! gameOver )   {
        gameOver  =  gameTick ( bucket ,  _bucket );
         Sleep ( 50 );
        checkScore ( bucket ,  _bucket ,  tempvar ,  score );
        cout  <<   "Your Score is: "   <<  score  <<  endl ;
        currentTick ++ ;
     }
    setCursorTo ( 25 ,   6 );
    cout  <<   "GAME OVER" ;
    system ( "pause" );
}

void  setCursorTo ( int  x ,   int  y )
{
    HANDLE handle ;
    COORD position ;
    handle  =   GetStdHandle ( STD_OUTPUT_HANDLE );
    position . =  x ;
    position . =  y ;
     SetConsoleCursorPosition ( handle ,  position );
}

/* generateBucket - takes a bucket array of any size and
*                  creates a semi-empty bucket, with a
*                  few random shapes in the bottom few lines. */
template   < size_t rows ,  size_t cols >

void  generateBucket ( char ( & bucket )[ rows ][ cols ])   {
     for   ( int  w  =   0 ;  w  <   12 ;  w ++ )   {
         for   ( int  z  =   0 ;  z  <   25 ;  z ++ )   {
             if   ((( ==   0 )   ||   ( ==   11 ))   &&   ( ==   0 ))   {  bucket [ w ][ z ]   =   '.' ;   }
             else   if   ((( %   12   ==   0 )   ||   ( %   12   ==   11 ))   &&   (( >   0 )   &&   ( <   24 )))   {  bucket [ w ][ z ]   =   '|' ;   }
             else   if   ((( ==   0 )   ||   ( ==   11 ))   &&   ( ==   24 ))   {  bucket [ w ][ z ]   =   '+' ;   }
             else   if   ( ==   24 )   {  bucket [ w ][ z ]   =   '-' ;   }
             else   {  bucket [ w ][ z ]   =   ' ' ;   }
         }
     }
}

/* generateShapeStream - generates a pre-determined list of
*                       shapes that will fall from the sky. */
void  generateShapeStream ()   {
     // Initialize the random number generator
    srand ( time ( NULL ));

     for   ( int  i  =   0 ;  i  <   256 ;  i ++ )   {
        shapes [ i ]   =  rand ()   %   6   +   1 ;
     }
     //cout << "In generate shape..." << endl;
}

/* drawBucket - draws the actual bucket on the screen
*              including the currently dropping shape. */
template   < size_t rows ,  size_t cols >
void  drawBucket ( char ( & bucket )[ rows ][ cols ])   {
    setCursorTo ( 0 ,   0 );
     for   ( int  w  =   0 ;  w  <   25 ;  w ++ )   {
         for   ( int  z  =   0 ;  z  <   12 ;  z ++ )   {
            cout  <<  bucket [ z ][ w ];
         }
        cout  <<  endl ;
     }
}

/* gameTick - this function does all of the different
*             processessing that happens throughout
*             the game. This also returns false to
*             stop the main loop once gameover has
*             been reached                          */
template   < size_t rows ,  size_t cols >
bool  gameTick ( char ( & bucket )[ rows ][ cols ],   char ( & perm_bucket )[ rows ][ cols ])   {
    drawBucket ( bucket );
    
     if   ( ! isDropping )   {
        currentShape ++ ;
        activeShape  =   TetrisShape ( shapes [ currentShape ]);


         if   ( ! canEnter ( DIR_DOWN ,  perm_bucket ))   {
             return   true ;
         }
         else   {
            isDropping  =   true ;
            updateBucket ( bucket ,   false );
         }
     }
     else   {
         if   ( currentTick  %  GAME_INTERVAL  ==   1 )   {
             // we are on a drop interval.
             if   ( canEnter ( DIR_DOWN ,  perm_bucket ))   {

                updateBucket ( bucket ,  moveShape ( DIR_DOWN ));
             }
             else   {
                landShape ( perm_bucket );

             }
         }
     }
     int  direction  =  getUserInput ();
     if   ( canEnter ( direction ,  perm_bucket ))   {

        updateBucket ( bucket ,  moveShape ( direction ));
     }

     if   ( ! canEnter ( DIR_DOWN ,  perm_bucket ))   {
        landShape ( perm_bucket );
        set_bucket ( bucket ,  perm_bucket );
     }


     return   false ;
}


/* moveShape - Handles moving the shape in the bucket. */
bool  moveShape ( int  direction )   {
    previousX  =  activeShape . shapeTopLeftX ;
    previousY  =  activeShape . shapeTopLeftY ;
     switch   ( direction )   {
     case  DIR_DOWN :
        activeShape . shapeTopLeftY ++ ;
         return   false ;
         break ;
     case  DIR_RIGHT :
        activeShape . shapeTopLeftX ++ ;
         return   false ;
         break ;
     case  DIR_LEFT :
        activeShape . shapeTopLeftX -- ;
         return   false ;
         break ;
     case  DIR_ROTATE :
        activeShape . rotate ();
         return   true ;
         break ;
     }

}

/* updateBucket - place the cureret shape in the bucket, remove the old shape*/
template   < size_t rows ,  size_t cols >
void  updateBucket ( char ( & bucket )[ rows ][ cols ],   bool  isRotation )   {
     for   ( int  _x  =   0 ;  _x  <   4 ;  _x ++ )   {
         for   ( int  _y  =   0 ;  _y  <   4 ;  _y ++ )   {
             if   ( ! isRotation )   {
                 if   (( activeShape . shapeArray [ _x ][ _y ]   !=   ' ' )   &&   ( bucket [ _x  +  previousX ][ _y  +  previousY ]   !=   '|' )   &&   ( bucket [ _x  +  previousX ][ _y  +  previousY ]   !=   '-' ))   {
                    bucket [ _x  +  previousX ][ _y  +  previousY ]   =   ' ' ;
                 }
             }
             else   {
                 if   (( bucket [ _x  +  previousX ][ _y  +  previousY ]   !=   '|' )   &&   ( bucket [ _x  +  previousX ][ _y  +  previousY ]   !=   '-' ))   {
                    bucket [ _x  +  previousX ][ _y  +  previousY ]   =   ' ' ;
                 }
             }
         }
     }
     for   ( int  _x  =   0 ;  _x  <   4 ;  _x ++ )   {
         for   ( int  _y  =   0 ;  _y  <   4 ;  _y ++ )   {
             if   ( activeShape . shapeArray [ _x ][ _y ]   !=   ' ' )   {
                bucket [ _x  +  activeShape . shapeTopLeftX ][ _y  +  activeShape . shapeTopLeftY ]   =  activeShape . shapeArray [ _x ][ _y ];
             }

         }
     }


}

/* landShape - Sets the shape in place once it hits the
bottom of the bucket. Moves the shape to the permanent bucket (_bucket)     */
template   < size_t rows ,  size_t cols >
void  landShape ( char ( & bucket )[ rows ][ cols ])   {
    
    updateBucket ( bucket ,   false );
    previousX  =   6 ;  previousY  =   0 ;
    check_bucket ( bucket );

    isDropping  =   false ;

}

template < size_t rows ,  size_t cols >
int  checkScore ( char ( & bucket )[ rows ][ cols ],   char ( & perm_bucket )[ rows ][ cols ],   int  tempvar ,   int  score )
{
     for   ( int  y  =   0 ;  y  <   25 ;  y ++ )   {
         int  tmp_count  =   0 ;
         for   ( int  x  =   0 ;  x  <   13 ;  x ++ )   {
             if   ( bucket [ x ][ y ]   ==   'X' )   {
                tmp_count ++ ;
             }
         }
         if   ( tmp_count  ==   10 )   {
            tempvar  =   1 ;
             if   ( tempvar  ==   1 )   {
                score  =  score  +   100 ;
                 return  score ;
             }
         }
     }
}


/* getUserInput - Reads the user input from the player*/
int  getUserInput ()   {
    setCursorTo ( 35 ,   9 );
     if   (( GetKeyState ( VK_DOWN )   !=   0 )   &&   ( GetKeyState ( VK_DOWN )   !=   1 ))   {   return  DIR_DOWN ;   }
     if   (( GetKeyState ( VK_RIGHT )   !=   0 )   &&   ( GetKeyState ( VK_RIGHT )   !=   1 ))   {   return  DIR_RIGHT ;   }
     if   (( GetKeyState ( VK_LEFT )   !=   0 )   &&   ( GetKeyState ( VK_LEFT )   !=   1 ))   {   return  DIR_LEFT ;   }
     if   (( GetKeyState ( VK_UP )   !=   0 )   &&   ( GetKeyState ( VK_UP )   !=   1 ))   {   return  DIR_ROTATE ;   }

     return   0 ;
}


/* canRotate - if we are adjacent to another shape, then we CANNOT rotate */
template   < size_t rows ,  size_t cols >
bool  canRotate ( char ( & bucket )[ rows ][ cols ])   {
     // The only real way to do this is to create a copy of the shape, rotate it, then try to determine where it will be in the bucket.
     TetrisShape  _tmp  =   TetrisShape ( activeShape );
    _tmp . rotate ();
     for   ( int  _x  =   0 ;  _x  <   4 ;  _x ++ )   {
         for   ( int  _y  =   0 ;  _y  <   4 ;  _y ++ )   {
             if   ( _tmp . shapeArray [ _x ][ _y ]   !=   ' ' )   {
                 if   ( bucket [ _tmp . shapeTopLeftX  +  _x ][ _tmp . shapeTopLeftY  +  _y ]   !=   ' ' )   {
                     return   false ;
                 }
             }
         }
     }

     return   true ;
}

/* canEnter - Tests to see if the falling blocks can
enter in any direction.                 */
template   < size_t rows ,  size_t cols >
bool  canEnter ( int  dir ,   char ( & bucket )[ rows ][ cols ])   {
     // Check for collision with any elements of the shape array, and any elements of the bucket.

     // Determine which direction we are moving.
     int  delta_x  =   0 ,  delta_y  =   0 ;
     switch   ( dir )   {
     case  DIR_DOWN :
        delta_y ++ ;
         break ;
     case  DIR_LEFT :
        delta_x -- ;
         break ;
     case  DIR_RIGHT :
        delta_x ++ ;
         break ;
     case  DIR_ROTATE :
         return  canRotate ( bucket );
         break ;
     }

     // Create the starting {x, y} position to test for collsion
     int  test_x  =  activeShape . shapeTopLeftX  +  delta_x ;
     int  test_y  =  activeShape . shapeTopLeftY  +  delta_y ;

     for   ( int  _x  =   0 ;  _x  <   4 ;  _x ++ )   {
         for   ( int  _y  =   0 ;  _y  <   4 ;  _y ++ )   {

             if   ( activeShape . shapeArray [ _x ][ _y ]   !=   ' ' )   {
                 if   ( bucket [ test_x  +  _x ][ test_y  +  _y ]   !=   ' ' )   {
                     return   false ;
                 }
             }
         }
     }
     return   true ;
}
template   < size_t rows ,  size_t cols >
int  checkScore ( char ( & bucket )[ rows ][ cols ],   int  tempvar ,   int  score )   {
     for   ( int  y  =   0 ;  y  <   25 ;  y ++ )   {
         int  tmp_count  =   0 ;
         for   ( int  x  =   0 ;  x  <   13 ;  x ++ )   {
             if   ( bucket [ x ][ y ]   ==   'X' )   {
                tmp_count ++ ;
             }
         }
         if   ( tmp_count  ==   10 )   {
            tempvar  =   1 ;
             if   ( tempvar  ==   1 )   {
            score  =  score  +   100 ;
             return  score ;
             }
             for   ( int  x  =   1 ;  x  <   11 ;  x ++ )   {
                 for   ( int  _y  =  y ;  _y  >   0 ;  _y -- )   {
                    bucket [ x ][ _y ]   =  bucket [ x ][ _y  -   1 ];


                 }
             }
         }
     }

    
}
template   < size_t rows ,  size_t cols >
void  check_bucket ( char ( & bucket )[ rows ][ cols ])   {
     for   ( int  y  =   0 ;  y  <   25 ;  y ++ )   {
         int  tmp_count  =   0 ;
         for   ( int  x  =   0 ;  x  <   13 ;  x ++ )   {
             if   ( bucket [ x ][ y ]   ==   'X' )   {
                tmp_count ++ ;
             }
         }
         if   ( tmp_count  ==   10 )   {
             for   ( int  x  =   1 ;  x  <   11 ;  x ++ )   {
                 for   ( int  _y  =  y ;  _y  >   0 ;  _y -- )   {
                    bucket [ x ][ _y ]   =  bucket [ x ][ _y  -   1 ];
                    
                
             }
             }
         }
     }

}

template   < size_t rows ,  size_t cols >
void  set_bucket ( char ( & bucket )[ rows ][ cols ],   char ( & perm_bucket )[ rows ][ cols ])   {
     for   ( int  x  =   0 ;  x  <   12 ;  x ++ )   {
         for   ( int  y  =   0 ;  y  <   25 ;  y ++ )   {
            bucket [ x ][ y ]   =  perm_bucket [ x ][ y ];
         }
     }
}