mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 10:57:34 +00:00
2048: Make the scoring system less 'lame'
This commit is contained in:
parent
e36fce9cfc
commit
d97025567a
2 changed files with 23 additions and 21 deletions
|
@ -82,7 +82,8 @@ void TwentyFortyEightGame::reset()
|
||||||
m_states.clear();
|
m_states.clear();
|
||||||
m_states.append(initial_state());
|
m_states.append(initial_state());
|
||||||
|
|
||||||
m_states.last().score_text = String::format("Score: %d", score());
|
m_current_turn = 0;
|
||||||
|
m_states.last().score_text = "Score: 0";
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
@ -124,7 +125,7 @@ static Vector<Vector<u32>> reverse(const Vector<Vector<u32>>& board)
|
||||||
return new_board;
|
return new_board;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Vector<u32> slide_row(const Vector<u32>& row)
|
static Vector<u32> slide_row(const Vector<u32>& row, size_t& successful_merge_score)
|
||||||
{
|
{
|
||||||
if (row.size() < 2)
|
if (row.size() < 2)
|
||||||
return row;
|
return row;
|
||||||
|
@ -136,36 +137,37 @@ static Vector<u32> slide_row(const Vector<u32>& row)
|
||||||
result.take_first();
|
result.take_first();
|
||||||
|
|
||||||
if (x == 0) {
|
if (x == 0) {
|
||||||
result = slide_row(result);
|
result = slide_row(result, successful_merge_score);
|
||||||
result.append(0);
|
result.append(0);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (y == 0) {
|
if (y == 0) {
|
||||||
result[0] = x;
|
result[0] = x;
|
||||||
result = slide_row(result);
|
result = slide_row(result, successful_merge_score);
|
||||||
result.append(0);
|
result.append(0);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (x == y) {
|
if (x == y) {
|
||||||
result.take_first();
|
result.take_first();
|
||||||
result = slide_row(result);
|
result = slide_row(result, successful_merge_score);
|
||||||
result.append(0);
|
result.append(0);
|
||||||
result.prepend(x + x);
|
result.prepend(x + x);
|
||||||
|
successful_merge_score += x * 2;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = slide_row(result);
|
result = slide_row(result, successful_merge_score);
|
||||||
result.prepend(x);
|
result.prepend(x);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Vector<Vector<u32>> slide_left(const Vector<Vector<u32>>& board)
|
static Vector<Vector<u32>> slide_left(const Vector<Vector<u32>>& board, size_t& successful_merge_score)
|
||||||
{
|
{
|
||||||
Vector<Vector<u32>> new_board;
|
Vector<Vector<u32>> new_board;
|
||||||
for (auto& row : board)
|
for (auto& row : board)
|
||||||
new_board.append(slide_row(row));
|
new_board.append(slide_row(row, successful_merge_score));
|
||||||
|
|
||||||
return new_board;
|
return new_board;
|
||||||
}
|
}
|
||||||
|
@ -215,22 +217,23 @@ void TwentyFortyEightGame::keydown_event(GUI::KeyEvent& event)
|
||||||
{
|
{
|
||||||
auto& previous_state = m_states.last();
|
auto& previous_state = m_states.last();
|
||||||
State new_state;
|
State new_state;
|
||||||
|
size_t successful_merge_score = 0;
|
||||||
switch (event.key()) {
|
switch (event.key()) {
|
||||||
case KeyCode::Key_A:
|
case KeyCode::Key_A:
|
||||||
case KeyCode::Key_Left:
|
case KeyCode::Key_Left:
|
||||||
new_state.board = transpose(slide_left(transpose(previous_state.board)));
|
new_state.board = transpose(slide_left(transpose(previous_state.board), successful_merge_score));
|
||||||
break;
|
break;
|
||||||
case KeyCode::Key_D:
|
case KeyCode::Key_D:
|
||||||
case KeyCode::Key_Right:
|
case KeyCode::Key_Right:
|
||||||
new_state.board = transpose(reverse(slide_left(reverse(transpose(previous_state.board)))));
|
new_state.board = transpose(reverse(slide_left(reverse(transpose(previous_state.board)), successful_merge_score)));
|
||||||
break;
|
break;
|
||||||
case KeyCode::Key_W:
|
case KeyCode::Key_W:
|
||||||
case KeyCode::Key_Up:
|
case KeyCode::Key_Up:
|
||||||
new_state.board = slide_left(previous_state.board);
|
new_state.board = slide_left(previous_state.board, successful_merge_score);
|
||||||
break;
|
break;
|
||||||
case KeyCode::Key_S:
|
case KeyCode::Key_S:
|
||||||
case KeyCode::Key_Down:
|
case KeyCode::Key_Down:
|
||||||
new_state.board = reverse(slide_left(reverse(previous_state.board)));
|
new_state.board = reverse(slide_left(reverse(previous_state.board), successful_merge_score));
|
||||||
break;
|
break;
|
||||||
case KeyCode::Key_U:
|
case KeyCode::Key_U:
|
||||||
case KeyCode::Key_Backspace:
|
case KeyCode::Key_Backspace:
|
||||||
|
@ -245,11 +248,14 @@ void TwentyFortyEightGame::keydown_event(GUI::KeyEvent& event)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_state.board != previous_state.board) {
|
if (new_state.board != previous_state.board) {
|
||||||
|
++m_current_turn;
|
||||||
add_tile(new_state.board, m_starting_tile * 2);
|
add_tile(new_state.board, m_starting_tile * 2);
|
||||||
|
auto last_score = m_states.last().score;
|
||||||
if (m_states.size() == 16)
|
if (m_states.size() == 16)
|
||||||
m_states.take_first();
|
m_states.take_first();
|
||||||
m_states.append(move(new_state));
|
m_states.append(move(new_state));
|
||||||
|
|
||||||
|
m_states.last().score = last_score + successful_merge_score;
|
||||||
m_states.last().score_text = String::format("Score: %d", score());
|
m_states.last().score_text = String::format("Score: %d", score());
|
||||||
|
|
||||||
update();
|
update();
|
||||||
|
@ -258,7 +264,7 @@ void TwentyFortyEightGame::keydown_event(GUI::KeyEvent& event)
|
||||||
if (is_complete(m_states.last())) {
|
if (is_complete(m_states.last())) {
|
||||||
// You won!
|
// You won!
|
||||||
GUI::MessageBox::show(window(),
|
GUI::MessageBox::show(window(),
|
||||||
String::format("Score = %d", score()),
|
String::format("Score = %d in %zu turns", score(), m_current_turn),
|
||||||
"You won!",
|
"You won!",
|
||||||
GUI::MessageBox::Type::Information);
|
GUI::MessageBox::Type::Information);
|
||||||
return game_over();
|
return game_over();
|
||||||
|
@ -267,7 +273,7 @@ void TwentyFortyEightGame::keydown_event(GUI::KeyEvent& event)
|
||||||
if (is_stalled(m_states.last())) {
|
if (is_stalled(m_states.last())) {
|
||||||
// Game over!
|
// Game over!
|
||||||
GUI::MessageBox::show(window(),
|
GUI::MessageBox::show(window(),
|
||||||
String::format("Score = %d", score()),
|
String::format("Score = %d in %zu turns", score(), m_current_turn),
|
||||||
"You lost!",
|
"You lost!",
|
||||||
GUI::MessageBox::Type::Information);
|
GUI::MessageBox::Type::Information);
|
||||||
return game_over();
|
return game_over();
|
||||||
|
@ -341,11 +347,5 @@ void TwentyFortyEightGame::game_over()
|
||||||
|
|
||||||
int TwentyFortyEightGame::score() const
|
int TwentyFortyEightGame::score() const
|
||||||
{
|
{
|
||||||
u32 score = 0;
|
return m_states.last().score;
|
||||||
for (auto& row : m_states.last().board) {
|
|
||||||
for (auto& element : row)
|
|
||||||
score = max(score, element);
|
|
||||||
}
|
|
||||||
|
|
||||||
return score;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ public:
|
||||||
|
|
||||||
struct State {
|
struct State {
|
||||||
Vector<Vector<u32>> board;
|
Vector<Vector<u32>> board;
|
||||||
|
size_t score { 0 };
|
||||||
String score_text;
|
String score_text;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -56,6 +57,7 @@ private:
|
||||||
int m_rows { 4 };
|
int m_rows { 4 };
|
||||||
int m_columns { 4 };
|
int m_columns { 4 };
|
||||||
u32 m_starting_tile { 2 };
|
u32 m_starting_tile { 2 };
|
||||||
|
size_t m_current_turn { 0 };
|
||||||
|
|
||||||
Vector<State, 16> m_states;
|
Vector<State, 16> m_states;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue