C++ 俄罗斯方块编程

 

今天跟一位大佬学习了一下C++俄罗斯方块的编程代码

                废话不多数,直接上代码!!!

/****Author:victory(liyinuo)****/
/*******************************************************************************************
 *
 *   raylib - classic game: tetris
 *
 *   Sample game developed by Marc Palau and Ramon Santamaria
 *
 *   This game has been created using raylib v1.3 (www.raylib.com)
 *   raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
 *
 *   Copyright (c) 2015 Ramon Santamaria (@raysan5)
 *
 ********************************************************************************************/

#include "raylib.h"

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

#if defined(PLATFORM_WEB)
#include <emscripten/emscripten.h>
#endif

//----------------------------------------------------------------------------------
// Some Defines
//----------------------------------------------------------------------------------
#define SQUARE_SIZE             20

#define GRID_HORIZONTAL_SIZE    12
#define GRID_VERTICAL_SIZE      20

#define LATERAL_SPEED           10
#define TURNING_SPEED           12
#define FAST_FALL_AWAIT_COUNTER 30

#define FADING_TIME             33

//----------------------------------------------------------------------------------
// Types and Structures Definition
//----------------------------------------------------------------------------------
typedef enum GridSquare { EMPTY, MOVING, FULL, BLOCK, FADING } GridSquare;

//------------------------------------------------------------------------------------
// Global Variables Declaration
//------------------------------------------------------------------------------------
static const int screenWidth = 800;
static const int screenHeight = 450;

static bool gameOver = false;
static bool pause = false;

// Matrices
static GridSquare grid [GRID_HORIZONTAL_SIZE][GRID_VERTICAL_SIZE];
static GridSquare piece [4][4];
static GridSquare incomingPiece [4][4];

// Theese variables keep track of the active piece position
static int piecePositionX = 0;
static int piecePositionY = 0;

// Game parameters
static Color fadingColor;
//static int fallingSpeed;           // In frames

static bool beginPlay = true;      // This var is only true at the begining of the game, used for the first matrix creations
static bool pieceActive = false;
static bool detection = false;
static bool lineToDelete = false;

// Statistics
static int level = 1;
static int lines = 0;

// Counters
static int gravityMovementCounter = 0;
static int lateralMovementCounter = 0;
static int turnMovementCounter = 0;
static int fastFallMovementCounter = 0;

static int fadeLineCounter = 0;

// Based on level
static int gravitySpeed = 30;

//------------------------------------------------------------------------------------
// Module Functions Declaration (local)
//------------------------------------------------------------------------------------
static void InitGame(void);         // Initialize game
static void UpdateGame(void);       // Update game (one frame)
static void DrawGame(void);         // Draw game (one frame)
static void UnloadGame(void);       // Unload game
static void UpdateDrawFrame(void);  // Update and Draw (one frame)

// Additional module functions
static bool Createpiece();
static void GetRandompiece();
static void ResolveFallingMovement(bool *detection, bool *pieceActive);
static bool ResolveLateralMovement();
static bool ResolveTurnMovement();
static void CheckDetection(bool *detection);
static void CheckCompletion(bool *lineToDelete);
static void DeleteCompleteLines();

//------------------------------------------------------------------------------------
// Program main entry point
//------------------------------------------------------------------------------------
int main(void)
{
	// Initialization (Note windowTitle is unused on Android)
	//---------------------------------------------------------
	InitWindow(screenWidth, screenHeight, "classic game: tetris");
	
	InitGame();
	
#if defined(PLATFORM_WEB)
	emscripten_set_main_loop(UpdateDrawFrame, 60, 1);
#else
	SetTargetFPS(60);
	//--------------------------------------------------------------------------------------
	
	// Main game loop
	while (!WindowShouldClose())    // Detect window close button or ESC key
	{
		// Update and Draw
		//----------------------------------------------------------------------------------
		UpdateDrawFrame();
		//----------------------------------------------------------------------------------
	}
#endif
	// De-Initialization
	//--------------------------------------------------------------------------------------
	UnloadGame();         // Unload loaded data (textures, sounds, models...)
	
	CloseWindow();        // Close window and OpenGL context
	//--------------------------------------------------------------------------------------
	
	return 0;
}

//--------------------------------------------------------------------------------------
// Game Module Functions Definition
//--------------------------------------------------------------------------------------

// Initialize game variables
void InitGame(void)
{
	// Initialize game statistics
	level = 1;
	lines = 0;
	
	fadingColor = GRAY;
	
	piecePositionX = 0;
	piecePositionY = 0;
	
	pause = false;
	
	beginPlay = true;
	pieceActive = false;
	detection = false;
	lineToDelete = false;
	
	// Counters
	gravityMovementCounter = 0;
	lateralMovementCounter = 0;
	turnMovementCounter = 0;
	fastFallMovementCounter = 0;
	
	fadeLineCounter = 0;
	gravitySpeed = 30;
	
	// Initialize grid matrices
	for (int i = 0; i < GRID_HORIZONTAL_SIZE; i++)
	{
		for (int j = 0; j < GRID_VERTICAL_SIZE; j++)
		{
			if ((j == GRID_VERTICAL_SIZE - 1) || (i == 0) || (i == GRID_HORIZONTAL_SIZE - 1)) grid[i][j] = BLOCK;
			else grid[i][j] = EMPTY;
		}
	}
	
	// Initialize incoming piece matrices
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j< 4; j++)
		{
			incomingPiece[i][j] = EMPTY;
		}
	}
}

// Update game (one frame)
void UpdateGame(void)
{
	if (!gameOver)
	{
		if (IsKeyPressed('P')) pause = !pause;
		
		if (!pause)
		{
			if (!lineToDelete)
			{
				if (!pieceActive)
				{
					// Get another piece
					pieceActive = Createpiece();
					
					// We leave a little time before starting the fast falling down
					fastFallMovementCounter = 0;
				}
				else    // Piece falling
				{
					// Counters update
					fastFallMovementCounter++;
					gravityMovementCounter++;
					lateralMovementCounter++;
					turnMovementCounter++;
					
					// We make sure to move if we've pressed the key this frame
					if (IsKeyPressed(KEY_LEFT) || IsKeyPressed(KEY_RIGHT)) lateralMovementCounter = LATERAL_SPEED;
					if (IsKeyPressed(KEY_UP)) turnMovementCounter = TURNING_SPEED;
					
					// Fall down
					if (IsKeyDown(KEY_DOWN) && (fastFallMovementCounter >= FAST_FALL_AWAIT_COUNTER))
					{
						// We make sure the piece is going to fall this frame
						gravityMovementCounter += gravitySpeed;
					}
					
					if (gravityMovementCounter >= gravitySpeed)
					{
						// Basic falling movement
						CheckDetection(&detection);
						
						// Check if the piece has collided with another piece or with the boundings
						ResolveFallingMovement(&detection, &pieceActive);
						
						// Check if we fullfilled a line and if so, erase the line and pull down the the lines above
						CheckCompletion(&lineToDelete);
						
						gravityMovementCounter = 0;
					}
					
					// Move laterally at player's will
					if (lateralMovementCounter >= LATERAL_SPEED)
					{
						// Update the lateral movement and if success, reset the lateral counter
						if (!ResolveLateralMovement()) lateralMovementCounter = 0;
					}
					
					// Turn the piece at player's will
					if (turnMovementCounter >= TURNING_SPEED)
					{
						// Update the turning movement and reset the turning counter
						if (ResolveTurnMovement()) turnMovementCounter = 0;
					}
				}
				
				// Game over logic
				for (int j = 0; j < 2; j++)
				{
					for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++)
					{
						if (grid[i][j] == FULL)
						{
							gameOver = true;
						}
					}
				}
			}
			else
			{
				// Animation when deleting lines
				fadeLineCounter++;
				
				if (fadeLineCounter%8 < 4) fadingColor = MAROON;
				else fadingColor = GRAY;
				
				if (fadeLineCounter >= FADING_TIME)
				{
					DeleteCompleteLines();
					fadeLineCounter = 0;
					lineToDelete = false;
					
					lines++;
				}
			}
		}
	}
	else
	{
		if (IsKeyPressed(KEY_ENTER))
		{
			InitGame();
			gameOver = false;
		}
	}
}

// Draw game (one frame)
void DrawGame(void)
{
	BeginDrawing();
	
	ClearBackground(RAYWHITE);
	
	if (!gameOver)
	{
		// Draw gameplay area
		Vector2 offset;
		offset.x = screenWidth/2 - (GRID_HORIZONTAL_SIZE*SQUARE_SIZE/2) - 50;
		offset.y = screenHeight/2 - ((GRID_VERTICAL_SIZE - 1)*SQUARE_SIZE/2) + SQUARE_SIZE*2;
		
		offset.y -= 50;     // NOTE: Harcoded position!
		
		int controller = offset.x;
		
		for (int j = 0; j < GRID_VERTICAL_SIZE; j++)
		{
			for (int i = 0; i < GRID_HORIZONTAL_SIZE; i++)
			{
				// Draw each square of the grid
				if (grid[i][j] == EMPTY)
				{
					DrawLine(offset.x, offset.y, offset.x + SQUARE_SIZE, offset.y, LIGHTGRAY );
					DrawLine(offset.x, offset.y, offset.x, offset.y + SQUARE_SIZE, LIGHTGRAY );
					DrawLine(offset.x + SQUARE_SIZE, offset.y, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY );
					DrawLine(offset.x, offset.y + SQUARE_SIZE, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY );
					offset.x += SQUARE_SIZE;
				}
				else if (grid[i][j] == FULL)
				{
					DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, GRAY);
					offset.x += SQUARE_SIZE;
				}
				else if (grid[i][j] == MOVING)
				{
					DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, DARKGRAY);
					offset.x += SQUARE_SIZE;
				}
				else if (grid[i][j] == BLOCK)
				{
					DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, LIGHTGRAY);
					offset.x += SQUARE_SIZE;
				}
				else if (grid[i][j] == FADING)
				{
					DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, fadingColor);
					offset.x += SQUARE_SIZE;
				}
			}
			
			offset.x = controller;
			offset.y += SQUARE_SIZE;
		}
		
		// Draw incoming piece (hardcoded)
		offset.x = 500;
		offset.y = 45;
		
		int controler = offset.x;
		
		for (int j = 0; j < 4; j++)
		{
			for (int i = 0; i < 4; i++)
			{
				if (incomingPiece[i][j] == EMPTY)
				{
					DrawLine(offset.x, offset.y, offset.x + SQUARE_SIZE, offset.y, LIGHTGRAY );
					DrawLine(offset.x, offset.y, offset.x, offset.y + SQUARE_SIZE, LIGHTGRAY );
					DrawLine(offset.x + SQUARE_SIZE, offset.y, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY );
					DrawLine(offset.x, offset.y + SQUARE_SIZE, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY );
					offset.x += SQUARE_SIZE;
				}
				else if (incomingPiece[i][j] == MOVING)
				{
					DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, GRAY);
					offset.x += SQUARE_SIZE;
				}
			}
			
			offset.x = controler;
			offset.y += SQUARE_SIZE;
		}
		
		DrawText("INCOMING:", offset.x, offset.y - 100, 10, GRAY);
		DrawText(TextFormat("LINES:      %04i", lines), offset.x, offset.y + 20, 10, GRAY);
		
		if (pause) DrawText("GAME PAUSED", screenWidth/2 - MeasureText("GAME PAUSED", 40)/2, screenHeight/2 - 40, 40, GRAY);
	}
	else DrawText("PRESS [ENTER] TO PLAY AGAIN", GetScreenWidth()/2 - MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, GetScreenHeight()/2 - 50, 20, GRAY);
	
	EndDrawing();
}

// Unload game variables
void UnloadGame(void)
{
	// TODO: Unload all dynamic loaded data (textures, sounds, models...)
}

// Update and Draw (one frame)
void UpdateDrawFrame(void)
{
	UpdateGame();
	DrawGame();
}

//--------------------------------------------------------------------------------------
// Additional module functions
//--------------------------------------------------------------------------------------
static bool Createpiece()
{
	piecePositionX = (int)((GRID_HORIZONTAL_SIZE - 4)/2);
	piecePositionY = 0;
	
	// If the game is starting and you are going to create the first piece, we create an extra one
	if (beginPlay)
	{
		GetRandompiece();
		beginPlay = false;
	}
	
	// We assign the incoming piece to the actual piece
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j< 4; j++)
		{
			piece[i][j] = incomingPiece[i][j];
		}
	}
	
	// We assign a random piece to the incoming one
	GetRandompiece();
	
	// Assign the piece to the grid
	for (int i = piecePositionX; i < piecePositionX + 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (piece[i - (int)piecePositionX][j] == MOVING) grid[i][j] = MOVING;
		}
	}
	
	return true;
}

static void GetRandompiece()
{
	int random = GetRandomValue(0, 6);
	
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			incomingPiece[i][j] = EMPTY;
		}
	}
	
	switch (random)
{
	case 0: { incomingPiece[1][1] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[1][2] = MOVING; incomingPiece[2][2] = MOVING; } break;    //Cube
	case 1: { incomingPiece[1][0] = MOVING; incomingPiece[1][1] = MOVING; incomingPiece[1][2] = MOVING; incomingPiece[2][2] = MOVING; } break;    //L
	case 2: { incomingPiece[1][2] = MOVING; incomingPiece[2][0] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[2][2] = MOVING; } break;    //L inversa
	case 3: { incomingPiece[0][1] = MOVING; incomingPiece[1][1] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[3][1] = MOVING; } break;    //Recta
	case 4: { incomingPiece[1][0] = MOVING; incomingPiece[1][1] = MOVING; incomingPiece[1][2] = MOVING; incomingPiece[2][1] = MOVING; } break;    //Creu tallada
	case 5: { incomingPiece[1][1] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[2][2] = MOVING; incomingPiece[3][2] = MOVING; } break;    //S
	case 6: { incomingPiece[1][2] = MOVING; incomingPiece[2][2] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[3][1] = MOVING; } break;    //S inversa
}
}

static void ResolveFallingMovement(bool *detection, bool *pieceActive)
{
	// If we finished moving this piece, we stop it
	if (*detection)
	{
		for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--)
		{
			for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++)
			{
				if (grid[i][j] == MOVING)
				{
					grid[i][j] = FULL;
					*detection = false;
					*pieceActive = false;
				}
			}
		}
	}
	else    // We move down the piece
	{
		for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--)
		{
			for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++)
			{
				if (grid[i][j] == MOVING)
				{
					grid[i][j+1] = MOVING;
					grid[i][j] = EMPTY;
				}
			}
		}
		
		piecePositionY++;
	}
}

static bool ResolveLateralMovement()
{
	bool collision = false;
	
	// Piece movement
	if (IsKeyDown(KEY_LEFT))        // Move left
	{
		// Check if is possible to move to left
		for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--)
		{
			for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++)
			{
				if (grid[i][j] == MOVING)
				{
					// Check if we are touching the left wall or we have a full square at the left
					if ((i-1 == 0) || (grid[i-1][j] == FULL)) collision = true;
				}
			}
		}
		
		// If able, move left
		if (!collision)
		{
			for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--)
			{
				for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++)             // We check the matrix from left to right
				{
					// Move everything to the left
					if (grid[i][j] == MOVING)
					{
						grid[i-1][j] = MOVING;
						grid[i][j] = EMPTY;
					}
				}
			}
			
			piecePositionX--;
		}
	}
	else if (IsKeyDown(KEY_RIGHT))  // Move right
	{
		// Check if is possible to move to right
		for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--)
		{
			for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++)
			{
				if (grid[i][j] == MOVING)
				{
					// Check if we are touching the right wall or we have a full square at the right
					if ((i+1 == GRID_HORIZONTAL_SIZE - 1) || (grid[i+1][j] == FULL))
					{
						collision = true;
						
					}
				}
			}
		}
		
		// If able move right
		if (!collision)
		{
			for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--)
			{
				for (int i = GRID_HORIZONTAL_SIZE - 1; i >= 1; i--)             // We check the matrix from right to left
				{
					// Move everything to the right
					if (grid[i][j] == MOVING)
					{
						grid[i+1][j] = MOVING;
						grid[i][j] = EMPTY;
					}
				}
			}
			
			piecePositionX++;
		}
	}
	
	return collision;
}

static bool ResolveTurnMovement()
{
	// Input for turning the piece
	if (IsKeyDown(KEY_UP))
	{
		GridSquare aux;
		bool checker = false;
		
		// Check all turning possibilities
		if ((grid[piecePositionX + 3][piecePositionY] == MOVING) &&
			(grid[piecePositionX][piecePositionY] != EMPTY) &&
			(grid[piecePositionX][piecePositionY] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 3][piecePositionY + 3] == MOVING) &&
			(grid[piecePositionX + 3][piecePositionY] != EMPTY) &&
			(grid[piecePositionX + 3][piecePositionY] != MOVING)) checker = true;
		
		if ((grid[piecePositionX][piecePositionY + 3] == MOVING) &&
			(grid[piecePositionX + 3][piecePositionY + 3] != EMPTY) &&
			(grid[piecePositionX + 3][piecePositionY + 3] != MOVING)) checker = true;
		
		if ((grid[piecePositionX][piecePositionY] == MOVING) &&
			(grid[piecePositionX][piecePositionY + 3] != EMPTY) &&
			(grid[piecePositionX][piecePositionY + 3] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 1][piecePositionY] == MOVING) &&
			(grid[piecePositionX][piecePositionY + 2] != EMPTY) &&
			(grid[piecePositionX][piecePositionY + 2] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 3][piecePositionY + 1] == MOVING) &&
			(grid[piecePositionX + 1][piecePositionY] != EMPTY) &&
			(grid[piecePositionX + 1][piecePositionY] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 2][piecePositionY + 3] == MOVING) &&
			(grid[piecePositionX + 3][piecePositionY + 1] != EMPTY) &&
			(grid[piecePositionX + 3][piecePositionY + 1] != MOVING)) checker = true;
		
		if ((grid[piecePositionX][piecePositionY + 2] == MOVING) &&
			(grid[piecePositionX + 2][piecePositionY + 3] != EMPTY) &&
			(grid[piecePositionX + 2][piecePositionY + 3] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 2][piecePositionY] == MOVING) &&
			(grid[piecePositionX][piecePositionY + 1] != EMPTY) &&
			(grid[piecePositionX][piecePositionY + 1] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 3][piecePositionY + 2] == MOVING) &&
			(grid[piecePositionX + 2][piecePositionY] != EMPTY) &&
			(grid[piecePositionX + 2][piecePositionY] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 1][piecePositionY + 3] == MOVING) &&
			(grid[piecePositionX + 3][piecePositionY + 2] != EMPTY) &&
			(grid[piecePositionX + 3][piecePositionY + 2] != MOVING)) checker = true;
		
		if ((grid[piecePositionX][piecePositionY + 1] == MOVING) &&
			(grid[piecePositionX + 1][piecePositionY + 3] != EMPTY) &&
			(grid[piecePositionX + 1][piecePositionY + 3] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 1][piecePositionY + 1] == MOVING) &&
			(grid[piecePositionX + 1][piecePositionY + 2] != EMPTY) &&
			(grid[piecePositionX + 1][piecePositionY + 2] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 2][piecePositionY + 1] == MOVING) &&
			(grid[piecePositionX + 1][piecePositionY + 1] != EMPTY) &&
			(grid[piecePositionX + 1][piecePositionY + 1] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 2][piecePositionY + 2] == MOVING) &&
			(grid[piecePositionX + 2][piecePositionY + 1] != EMPTY) &&
			(grid[piecePositionX + 2][piecePositionY + 1] != MOVING)) checker = true;
		
		if ((grid[piecePositionX + 1][piecePositionY + 2] == MOVING) &&
			(grid[piecePositionX + 2][piecePositionY + 2] != EMPTY) &&
			(grid[piecePositionX + 2][piecePositionY + 2] != MOVING)) checker = true;
		
		if (!checker)
		{
			aux = piece[0][0];
			piece[0][0] = piece[3][0];
			piece[3][0] = piece[3][3];
			piece[3][3] = piece[0][3];
			piece[0][3] = aux;
			
			aux = piece[1][0];
			piece[1][0] = piece[3][1];
			piece[3][1] = piece[2][3];
			piece[2][3] = piece[0][2];
			piece[0][2] = aux;
			
			aux = piece[2][0];
			piece[2][0] = piece[3][2];
			piece[3][2] = piece[1][3];
			piece[1][3] = piece[0][1];
			piece[0][1] = aux;
			
			aux = piece[1][1];
			piece[1][1] = piece[2][1];
			piece[2][1] = piece[2][2];
			piece[2][2] = piece[1][2];
			piece[1][2] = aux;
		}
		
		for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--)
		{
			for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++)
			{
				if (grid[i][j] == MOVING)
				{
					grid[i][j] = EMPTY;
				}
			}
		}
		
		for (int i = piecePositionX; i < piecePositionX + 4; i++)
		{
			for (int j = piecePositionY; j < piecePositionY + 4; j++)
			{
				if (piece[i - piecePositionX][j - piecePositionY] == MOVING)
				{
					grid[i][j] = MOVING;
				}
			}
		}
		
		return true;
	}
	
	return false;
}

static void CheckDetection(bool *detection)
{
	for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--)
	{
		for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++)
		{
			if ((grid[i][j] == MOVING) && ((grid[i][j+1] == FULL) || (grid[i][j+1] == BLOCK))) *detection = true;
		}
	}
}

static void CheckCompletion(bool *lineToDelete)
{
	int calculator = 0;
	
	for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--)
	{
		calculator = 0;
		for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++)
		{
			// Count each square of the line
			if (grid[i][j] == FULL)
			{
				calculator++;
			}
			
			// Check if we completed the whole line
			if (calculator == GRID_HORIZONTAL_SIZE - 2)
			{
				*lineToDelete = true;
				calculator = 0;
				// points++;
				
				// Mark the completed line
				for (int z = 1; z < GRID_HORIZONTAL_SIZE - 1; z++)
				{
					grid[z][j] = FADING;
				}
			}
		}
	}
}

static void DeleteCompleteLines()
{
	// Erase the completed line
	for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--)
	{
		while (grid[1][j] == FADING)
		{
			for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++)
			{
				grid[i][j] = EMPTY;
			}
			
			for (int j2 = j-1; j2 >= 0; j2--)
			{
				for (int i2 = 1; i2 < GRID_HORIZONTAL_SIZE - 1; i2++)
				{
					if (grid[i2][j2] == FULL)
					{
						grid[i2][j2+1] = FULL;
						grid[i2][j2] = EMPTY;
					}
					else if (grid[i2][j2] == FADING)
					{
						grid[i2][j2+1] = FADING;
						grid[i2][j2] = EMPTY;
					}
				}
			}
		}
	}
}

 

创作不易,帮忙点个赞呗~~ (#^.^#) 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值