Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Copyright 2021 Alex Mitreanu
- */
- #include <iostream>
- #include <stdlib.h>
- #include <time.h>
- #include <conio.h> // getch()
- #include <windows.h> // colors display
- #include <map> // colors map
- using namespace std;
- bool running = true;
- // initialize board
- int board[4][4];
- map<int, int> colors;
- void showBoard() {
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- cout << "|-------------------|\n";
- cout << "| 2048 Game |\n";
- for (int i = 0; i < 4; i++) {
- cout << "|";
- for (int j = 0; j < 4; j++) {
- SetConsoleTextAttribute(hConsole, colors[board[i][j]]);
- if (board[i][j] < 10) cout << "000" << board[i][j];
- else if (board[i][j] >= 10 && board[i][j] < 100) cout << "00" << board[i][j];
- else if (board[i][j] >= 100 && board[i][j] < 1000) cout << "0" << board[i][j];
- else if (board[i][j] > 1000) cout << board[i][j];
- SetConsoleTextAttribute(hConsole, 7);
- cout << "|";
- }
- cout << "\n| |\n";
- }
- cout << "|-------------------|\n";
- }
- int boardZeroes() {
- int zeroes = 0;
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- if (!board[i][j]) zeroes++;
- }
- }
- return zeroes;
- }
- bool find2048() {
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- if (board[i][j] == 2048) return true;
- }
- }
- return false;
- }
- void generateNumber() {
- srand(time(NULL));
- int zeroes = boardZeroes();
- int line = rand() % 4;
- int column = rand() % 4;
- int number = rand() % 2;
- while (board[line][column] && zeroes > 0) {
- line = rand() % 4;
- column = rand() % 4;
- }
- if (zeroes > 0) board[line][column] = number ? 4 : 2;
- }
- bool hasValidMoves() {
- if (boardZeroes()) return true;
- int dl[] = { -1, 0, 1, 0 },
- dc[] = { 0, 1, 0, -1 };
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- for (int k = 0; k < 4; k++) {
- if ((i + dl[k] >= 0 && i + dl[k] < 4) &&
- (j + dc[k] >= 0 && j + dc[k] < 4) &&
- board[i + dl[k]][j + dc[k]] == board[i][j]
- ) return true;
- }
- }
- }
- return false;
- }
- void applyDirection() {
- bool validMove = false;
- char d = getch();
- cout << d << endl;
- switch (d) {
- case 'w':
- for (int i = 1; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- if (board[i][j]) {
- int k = 0;
- while (!board[i-k-1][j] && i-k-1 > 0) {
- k++;
- }
- if (board[i-k-1][j] == board[i][j]) {
- board[i-k-1][j] += board[i][j];
- board[i][j] = 0;
- validMove = true;
- } else if (board[i-k-1][j] != board[i][j] && board[i-k-1][j]) {
- board[i-k][j] = board[i][j];
- if (i-k != i) {
- board[i][j] = 0;
- validMove = true;
- }
- } else if (board[i-k-1][j] != board[i][j] && !board[i-k-1][j]) {
- board[i-k-1][j] += board[i][j];
- board[i][j] = 0;
- validMove = true;
- }
- }
- }
- }
- break;
- case 'a':
- for (int i = 0; i < 4; i++) {
- for (int j = 1; j < 4; j++) {
- if (board[i][j]) {
- int k = 0;
- while (!board[i][j-k-1] && j-k-1 > 0) {
- k++;
- }
- if (board[i][j-k-1] == board[i][j]) {
- board[i][j-k-1] += board[i][j];
- board[i][j] = 0;
- validMove = true;
- } else if (board[i][j-k-1] != board[i][j] && board[i][j-k-1]) {
- board[i][j-k] = board[i][j];
- if (j-k != j) {
- board[i][j] = 0;
- validMove = true;
- }
- } else if (board[i][j-k-1] != board[i][j] && !board[i][j-k-1]) {
- board[i][j-k-1] += board[i][j];
- board[i][j] = 0;
- validMove = true;
- }
- }
- }
- }
- break;
- case 's':
- for (int i = 2; i >= 0; i--) {
- for (int j = 0; j < 4; j++) {
- if (board[i][j]) {
- int k = 0;
- while (!board[i+k+1][j] && i+k+1 < 3) {
- k++;
- }
- if (board[i+k+1][j] == board[i][j]) {
- board[i+k+1][j] += board[i][j];
- board[i][j] = 0;
- validMove = true;
- } else if (board[i+k+1][j] != board[i][j] && board[i+k+1][j]) {
- board[i+k][j] = board[i][j];
- if (i+k != i) {
- board[i][j] = 0;
- validMove = true;
- }
- } else if (board[i+k+1][j] != board[i][j] && !board[i+k+1][j]) {
- board[i+k+1][j] += board[i][j];
- board[i][j] = 0;
- validMove = true;
- }
- }
- }
- }
- break;
- case 'd':
- for (int i = 0; i < 4; i++) {
- for (int j = 2; j >= 0; j--) {
- if (board[i][j]) {
- int k = 0;
- while (!board[i][j+k+1] && j+k+1 < 3) {
- k++;
- }
- if (board[i][j+k+1] == board[i][j]) {
- board[i][j+k+1] += board[i][j];
- board[i][j] = 0;
- validMove = true;
- } else if (board[i][j+k+1] != board[i][j] && board[i][j+k+1]) {
- board[i][j+k] = board[i][j];
- if (j+k != j) {
- board[i][j] = 0;
- validMove = true;
- }
- } else if (board[i][j+k+1] != board[i][j] && !board[i][j+k+1]) {
- board[i][j+k+1] += board[i][j];
- board[i][j] = 0;
- validMove = true;
- }
- }
- }
- }
- break;
- default:
- cout << "Cunt. >:(\n";
- break;
- }
- if (running && !validMove && boardZeroes()) applyDirection();
- }
- void initGame () {
- // initialize colors
- int k = 2;
- colors.insert(pair<int, int>(0, 15));
- for (int i = 2; i <= 2048; i*=2) {
- colors.insert(pair<int, int>(i, k++));
- }
- // start screen
- cout << "Buna ziua, acesta este un joc 2048 facut in consola. Controalele sunt w, a, s, d. Nu incercati sa introduceti alte litere sau sa introduceti WASD pentru ca programul va crapa. Multumesc de intelegere!\n";
- char start;
- cout << "\nApasati X pentru a incepe.\n"; cin >> start;
- while (start != 'X') {
- cout << "\nAm zis X.\n";
- cin >> start;
- }
- }
- int main() {
- initGame();
- while (running) {
- system("CLS");
- generateNumber();
- showBoard();
- if (find2048()) {
- cout << "Ati castigat. :^O\n";
- running = false;
- break;
- }
- if (!hasValidMoves()) {
- cout << "Ati pierdut. Haha :^)\n";
- running = false;
- break;
- }
- cout << "Your move: ";
- applyDirection();
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment