i need an input of this program. anything good or bad. what could be changed, what you may like or dislike about it. only one paragraph. // newTetris.cpp : Defines the entry point for the console application. // #include “stdafx.h” #include #include #include #include #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 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 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 bool gameTick(char(&bucket)[rows][cols], char(&perm_bucket)[rows][cols]); // Handles what is going on in the game every second. template void landShape(char(&bucket)[rows][cols]); // to do when the shape hits the bottom. template int checkScore(char(&bucket)[rows][cols], char(&perm_bucket)[rows][cols], int tempvar, int score); template void drawBucket(char(&bucket)[rows][cols]); // Draws the current contents of the bucket. template 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 int check_bucket(char(&bucket)[rows][cols]); template 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 = 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 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] = '.'; } else if (((w % 12 == 0) || (w % 12 == 11)) && ((z > 0) && (z < 24))) { bucket[w][z] = '|'; } else if (((w == 0) || (w == 11)) && (z == 24)) { bucket[w][z] = '+'; } else if (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 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 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 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 void landShape(char(&bucket)[rows][cols]) { updateBucket(bucket, false); previousX = 6; previousY = 0; check_bucket(bucket); isDropping = false; } template 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 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 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 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 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 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]; } } } Purchase the answer to view it