This document contains C++ code for a Tetris game. It defines classes and functions for representing Tetris shapes, moving and rotating the shapes, generating a falling sequence of shapes, and handling game logic and drawing the game board. Key aspects include a TetrisShape class to represent game pieces, functions for populating shape arrays, moving/rotating shapes, generating a random sequence of falling shapes, and a game tick function that handles core game logic like shape movement/falling and checking for completed lines to remove.
4. 2]='X'; shapeArray[3][2]=' ';
shapeArray[0][3]=' '; shapeArray[1][3]='X'; shapeArray[2]
[3]='X'; shapeArray[3][3]=' ';
break;
case6:
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 current
ly falling - mainly for gameTick function.
int currentTick =0;
template<size_t rows, size_t cols>
void generateBucket(char(&bucket)[rows][cols]);// Creates a sli
ghtly 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 seco
nd.
template<size_t rows, size_t cols>
void landShape(char(&bucket)[rows][cols]);// What to do when
5. 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 curre
nt contents of the bucket.
template<size_t rows, size_t cols>
bool canEnter(int direction,char(&bucket)[rows][cols]);// Check
s 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 appropria
te 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 th
e 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;
6. 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 = x;
position.Y = 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>
7. void generateBucket(char(&bucket)[rows][cols]){
for(int w =0; w <12; w++){
for(int z =0; z <25; z++){
if(((w ==0)||(w ==11))&&(z ==0)){ bucket[w][z]='.';}
elseif(((w %12==0)||(w %12==11))&&((z >0)&&(z <24))){ buc
ket[w][z]='|';}
elseif(((w ==0)||(w ==11))&&(z ==24)){ bucket[w][z]='+';}
elseif(z ==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;
}
8. }
/* 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)){
returntrue;
}
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);
}
9. }
}
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);
}
returnfalse;
}
/* 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++;
returnfalse;
break;
case DIR_RIGHT:
activeShape.shapeTopLeftX++;
returnfalse;
break;
case DIR_LEFT:
activeShape.shapeTopLeftX--;
returnfalse;
break;
case DIR_ROTATE: