first commit

This commit is contained in:
2026-06-05 11:45:04 +03:00
commit b457544071
29 changed files with 1725 additions and 0 deletions
+189
View File
@@ -0,0 +1,189 @@
#include "GameField.h"
void GameField::resize(
size_t width,
size_t height
)
{
m_Width = width;
m_Height = height;
m_Field =
std::vector<
std::vector<wchar_t>
>(
m_Height - 2,
std::vector<wchar_t>(
m_Width - 2,
0x0387
)
);
}
void GameField::render(
PaintDevice& paintDevice
)
{
for (int x = 1; x < m_Width - 1; x++)
{
paintDevice.set_char(
Vector2(x,0),
'-'
);
paintDevice.set_char(
Vector2(
x,
m_Height - 1
),
'-'
);
}
for (int y = 1; y < m_Height - 1; y++)
{
paintDevice.set_char(
Vector2(0,y),
'|'
);
paintDevice.set_char(
Vector2(
m_Width - 1,
y
),
'|'
);
}
paintDevice.set_char(
Vector2(0,0),
'+'
);
paintDevice.set_char(
Vector2(
m_Width - 1,
0
),
'+'
);
paintDevice.set_char(
Vector2(
0,
m_Height - 1
),
'+'
);
paintDevice.set_char(
Vector2(
m_Width - 1,
m_Height - 1
),
'+'
);
for (size_t y = 0; y < m_Field.size(); y++)
{
for (size_t x = 0;
x < m_Field[y].size();
x++)
{
paintDevice.set_char(
Vector2(
x + 1,
y + 1
),
m_Field[y][x]
);
}
}
}
bool GameField::has_collision(
const Figure& figure)
{
Point position =
figure.get_position();
for (const Point& point :
figure.get_body())
{
int x =
point.x + position.x;
int y =
point.y + position.y;
if (x < 1 ||
x > m_Width - 2)
return true;
if (y < 1 ||
y > m_Height - 2)
return true;
if (
m_Field[y - 1][x - 1]
!= 0x0387
)
return true;
}
return false;
}
void GameField::merge(const Figure& figure)
{
Point position = figure.get_position();
for (const Point& point : figure.get_body())
{
int x = point.x + position.x;
int y = point.y + position.y;
if (x < 1 || x > m_Width - 2 ||
y < 1 || y > m_Height - 2)
continue;
m_Field[y - 1][x - 1] = L'#';
}
}
int GameField::clear_lines()
{
int cleared = 0;
for (int y = (int)m_Field.size() - 1; y >= 0; y--)
{
bool full = true;
for (size_t x = 0; x < m_Field[y].size(); x++)
{
if (m_Field[y][x] == L' ')
{
full = false;
break;
}
}
if (full)
{
cleared++;
for (int j = y; j > 0; j--)
{
m_Field[j] = m_Field[j - 1];
}
m_Field[0] = std::vector<wchar_t>(
m_Width - 2,
L' '
);
y++; // 🔥 ВАЖНО: перескан строки после сдвига
}
}
return cleared;
}