Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
Mini-Projet-TETRIS
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DIDON Maya
Mini-Projet-TETRIS
Commits
84f32fb0
Commit
84f32fb0
authored
Oct 27, 2020
by
DIDON Maya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Copie du code original du jeu
parent
e7c7e2a4
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
791 additions
and
0 deletions
+791
-0
tetris.c
tetris.c
+791
-0
No files found.
tetris.c
0 → 100644
View file @
84f32fb0
/*******************************************************************************************
*
* raylib - sample game: tetris
*
* Sample game 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
();
static
bool
ResolveLateralMovement
();
static
bool
ResolveTurnMovement
();
static
void
CheckDetection
();
static
void
CheckCompletion
();
static
void
DeleteCompleteLines
();
//------------------------------------------------------------------------------------
// Program main entry point
//------------------------------------------------------------------------------------
int
main
(
void
)
{
// Initialization (Note windowTitle is unused on Android)
//---------------------------------------------------------
InitWindow
(
screenWidth
,
screenHeight
,
"sample game: tetris"
);
InitGame
();
#if defined(PLATFORM_WEB)
emscripten_set_main_loop
(
UpdateDrawFrame
,
0
,
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
))
{
int
aux
=
0
;
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
;
}
}
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment