Created
May 12, 2025 19:15
-
-
Save VKONSTANTINIUS/d11bab4155d90f18d984f751848666b3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <iomanip> | |
#include <cstdlib> | |
#include <ctime> | |
#include <conio.h> | |
using namespace std; | |
enum direction { DOWN = 80, UP = 72, LEFT = 75, RIGHT = 77 }; | |
const int SIZE = 4; | |
const int WIN_COUNT = 2048; | |
int board[SIZE][SIZE]{}; | |
int score = 0; | |
void set_board(); | |
void add_number(); | |
void draw_board(); | |
void move_up(); | |
void move_down(); | |
void move_left(); | |
void move_right(); | |
bool is_full(); | |
bool is_won(); | |
bool no_move(); | |
int main() | |
{ | |
srand(time(0)); | |
set_board(); | |
draw_board(); | |
while (true) { | |
if (is_won()) { | |
cout << "You won!\n"; | |
break; | |
} | |
if (is_full() || no_move()) { | |
cout << "Game over!\n"; | |
break; | |
} | |
int direct = _getch(); | |
if (direct == 224) | |
direct = _getch(); | |
if (direct == RIGHT) { | |
move_right(); | |
} | |
else if (direct == LEFT) { | |
move_left(); | |
} | |
else if (direct == UP) { | |
move_up(); | |
} | |
else if (direct == DOWN) { | |
move_down(); | |
} | |
} | |
return 0; | |
} | |
void set_board() { // Ініціалізація ігрового поля | |
for (int i = 0; i < SIZE; i++) { | |
for (int j = 0; j < SIZE; j++) { | |
board[i][j] = 0; | |
} | |
} | |
add_number(); // Додаємо нове число (2 або 4) у випадкову порожню клітинку | |
add_number(); | |
} | |
void add_number() { // Додаємо нове число | |
int i = rand() % SIZE; | |
int j = rand() % SIZE; | |
int value = (rand() % 2 + 1) * 2; | |
if (board[i][j] == 0) { | |
board[i][j] = value; | |
} | |
else add_number(); | |
} | |
void draw_board() { // Вивід ігрового поля | |
system("cls"); | |
cout << "Score: " << score << "\n"; | |
for (int i = 0; i < SIZE; i++) { | |
for (int j = 0; j < SIZE; j++) { | |
cout << setw(6) << board[i][j]; | |
} | |
cout << "\n\n\n"; | |
} | |
} | |
void move_up() { // Рух вгору | |
for (int j = 0; j < SIZE; j++) { | |
for (int i = 1; i < SIZE; i++) { | |
if (board[i][j] != 0) { | |
int k = i; | |
while (k > 0 && board[k - 1][j] == 0) { | |
board[k - 1][j] = board[k][j]; | |
board[k][j] = 0; | |
k--; | |
} | |
if (k > 0 && board[k - 1][j] == board[k][j]) { | |
board[k - 1][j] *= 2; | |
score += board[k - 1][j]; | |
board[k][j] = 0; | |
} | |
} | |
} | |
} | |
add_number(); | |
draw_board(); | |
} | |
void move_down() { // Рух вниз | |
for (int j = 0; j < SIZE; j++) { | |
for (int i = SIZE - 2; i >= 0; i--) { | |
if (board[i][j] != 0) { | |
int k = i; | |
while (k < SIZE - 1 && board[k + 1][j] == 0) { | |
board[k + 1][j] = board[k][j]; | |
board[k][j] = 0; | |
k++; | |
} | |
if (k < SIZE - 1 && board[k + 1][j] == board[k][j]) { | |
board[k + 1][j] *= 2; | |
score += board[k + 1][j]; | |
board[k][j] = 0; | |
} | |
} | |
} | |
} | |
add_number(); | |
draw_board(); | |
} | |
void move_left() { // Рух вліво | |
for (int i = 0; i < SIZE; i++) { | |
for (int j = 1; j < SIZE; j++) { | |
if (board[i][j] != 0) { | |
int k = j; | |
while (k > 0 && board[i][k - 1] == 0) { | |
board[i][k - 1] = board[i][k]; | |
board[i][k] = 0; | |
k--; | |
} | |
if (k > 0 && board[i][k - 1] == board[i][k]) { | |
board[i][k - 1] *= 2; | |
score += board[i][k - 1]; | |
board[i][k] = 0; | |
} | |
} | |
} | |
} | |
add_number(); | |
draw_board(); | |
} | |
void move_right() { // Рух вправо | |
for (int i = 0; i < SIZE; i++) { | |
for (int j = SIZE - 2; j >= 0; j--) { | |
if (board[i][j] != 0) { | |
int k = j; | |
while (k < SIZE - 1 && board[i][k + 1] == 0) { | |
board[i][k + 1] = board[i][k]; | |
board[i][k] = 0; | |
k++; | |
} | |
if (k < SIZE - 1 && board[i][k + 1] == board[i][k]) { | |
board[i][k + 1] *= 2; | |
score += board[i][k + 1]; | |
board[i][k] = 0; | |
} | |
} | |
} | |
} | |
add_number(); | |
draw_board(); | |
} | |
bool is_full() { // Перевірка чи є вільні клітинки | |
for (int i = 0; i < SIZE; i++) { | |
for (int j = 0; j < SIZE; j++) { | |
if (board[i][j] == 0) { | |
return false; | |
} | |
} | |
} | |
return true; | |
} | |
bool is_won() { // Перевірка чи виконана умова виграшу | |
for (int i = 0; i < SIZE; i++) { | |
for (int j = 0; j < SIZE; j++) { | |
if (board[i][j] == WIN_COUNT) { | |
return true; | |
} | |
} | |
} | |
return false; | |
} | |
bool no_move() { // Перевірка чи є можливі ходи | |
for (int i = 0; i < SIZE; i++) { | |
for (int j = 0; j < SIZE; j++) { | |
if (board[i][j] == 0) { | |
return false; | |
} | |
if (j > 0 && board[i][j] == board[i][j - 1]) { | |
return false; | |
} | |
if (j < SIZE - 1 && board[i][j] == board[i][j + 1]) { | |
return false; | |
} | |
if (i > 0 && board[i][j] == board[i - 1][j]) { | |
return false; | |
} | |
if (i < SIZE - 1 && board[i][j] == board[i + 1][j]) { | |
return false; | |
} | |
} | |
} | |
return true; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment