2
code:cpp
# include <Siv3D.hpp> // OpenSiv3D v0.2.8
enum class Direction
{
Up,
Right,
Down,
Left
};
constexpr Point ToPoint(Direction direction)
{
switch (direction)
{
case Direction::Up:
return Point::Up();
case Direction::Right:
return Point::Right();
case Direction::Down:
return Point::Down();
default:
return Point::Left();
}
}
enum class MoveType
{
Move,
Merge,
None
};
constexpr MoveType GetMoveType(int32 my, int32 target)
{
if (target == 0 && my != 0)
{
return MoveType::Move;
}
else if ((my != 0) && (my == target))
{
return MoveType::Merge;
}
else
{
return MoveType::None;
}
}
void Main()
{
Graphics::SetBackground(ColorF(0.8, 0.9, 1.0));
constexpr double CellSize = 100.0;
const Font font(30, Typeface::Bold);
Grid<int32> grid = {
{1, 1, 1, 0},
{1, 0, 1, 1},
{1, 1, 1, 0},
{1, 1, 0, 1} };
while (System::Update())
{
Optional<Direction> direction;
if (KeyUp.down())
{
direction = Direction::Up;
}
else if (KeyRight.down())
{
direction = Direction::Right;
}
else if (KeyDown.down())
{
direction = Direction::Down;
}
else if (KeyLeft.down())
{
direction = Direction::Left;
}
if (direction)
{
if (direction == Direction::Up)
{
//move
for (auto x : step(4))
{
for (auto y : Range(1, 3))
{
for (auto i : step(y))
{
const MoveType moveType = GetMoveType(myValue, valueAtTarget);
if (moveType == MoveType::Move)
{
valueAtTarget = myValue;
myValue = 0;
}
}
}
}
//merge
for (auto x : step(4))
{
for (auto y : Range(1, 3))
{
const MoveType moveType = GetMoveType(myValue, valueAtTarget);
if (moveType == MoveType::Merge)
{
++valueAtTarget;
myValue = 0;
}
}
}
//move
for (auto x : step(4))
{
for (auto y : Range(1, 3))
{
for (auto i : step(y))
{
const MoveType moveType = GetMoveType(myValue, valueAtTarget);
if (moveType == MoveType::Move)
{
valueAtTarget = myValue;
myValue = 0;
}
}
}
}
}
}
Transformer2D t(Mat3x2::Translate(120, 40));
RectF(400).stretched(5).rounded(3).draw(ColorF(0.5));
for (auto p : step(Size(4, 4)))
{
const int32 value = gridp; const RectF rect(p * CellSize, CellSize);
if (value)
{
rect.stretched(-5).rounded(3).draw(HSV(0, value * 0.1, 0.9));
font(Exp2(value)).drawAt(rect.center(), ColorF(0.3));
}
else
{
rect.stretched(-5).rounded(3).draw(ColorF(0.6));
}
}
}
}
https://gyazo.com/09199d15f895bf7cb413b1b2637d61b1