周六下午花了点时间实现了最近很火的小游戏2048,这里用最简单的控制台实现,自娱自乐
附源码:
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
using namespace std;
const int SIZE = 4;
int M[SIZE][SIZE];
enum DIR {
BOTTOM = 2,
RIGHT = 6,
LEFT = 4,
TOP = 8
};
void play();
bool isLegal(int getNum);
void randomNum();
void combine(int dir);
void showM();
void setView(int number);
bool isDead();
int main() {
play();
return 0;
}
void play() {
int getNum;
while (cin >> getNum) {
if (isDead()) {
cout << " game over !" << endl;
break;
}
system("cls");
if (! isLegal(getNum)) {
system("cls");
showM();
continue;
}
combine(getNum);
randomNum();
showM();
}
}
bool isLegal(int getNum) {
if (getNum == 0) {
cout << "QUIT GAME(Y/N) ";
char isQuitGame = 'N';
cin >> isQuitGame;
if (isQuitGame == 'Y') {
exit(0);
}
}
return getNum == LEFT || getNum == TOP || getNum == RIGHT || getNum == BOTTOM;
}
void randomNum() {
int i = 0;
int j = 0;
srand((unsigned)time(NULL));
do {
i = rand() % SIZE;
j = rand() % SIZE;
} while (M[i][j] != 0);
M[i][j] = 2;
}
void combine(int dir) {
int i, j;
switch (dir) {
case LEFT:
for (i = 0; i < SIZE; i ++) {
// delete 0 between the number
for (j = 1; j < SIZE; j ++) {
if (M[i][j] == 0) {
continue;
}
// M[i][j] != 0 here
while (j != 0 && M[i][j - 1] == 0) {
M[i][j - 1] = M[i][j];
M[i][j --] = 0;
}
}
// combine the same number
for (j = 0; j < SIZE - 1; j ++) {
if (M[i][j] == M[i][j + 1]) {
M[i][j] += M[i][j + 1];
M[i][j + 1] = 0;
}
}
// delete 0 between the number
for (j = 1; j < SIZE; j ++) {
if (M[i][j] == 0) {
continue;
}
// M[i][j] != 0 here
while (j != 0 && M[i][j - 1] == 0) {
M[i][j - 1] = M[i][j];
M[i][j --] = 0;
}
}
}
break;
case TOP:
for (j = 0; j < SIZE; j ++) {
for (i = 1; i < SIZE; i ++) {
if (M[i][j] == 0) {
continue;
}
while (i != 0 && M[i - 1][j] == 0) {
M[i - 1][j] = M[i][j];
M[i --][j] = 0;
}
}
for (i = 0; i < SIZE - 1; i ++) {
if (M[i][j] == M[i + 1][j]) {
M[i][j] += M[i + 1][j];
M[i + 1][j] = 0;
}
}
for (i = 1; i < SIZE; i ++) {
if (M[i][j] == 0) {
continue;
}
while (i != 0 && M[i - 1][j] == 0) {
M[i - 1][j] = M[i][j];
M[i --][j] = 0;
}
}
}
break;
case RIGHT:
for (i = 0; i < SIZE; i ++) {
for (j = SIZE - 2; j >= 0; j --) {
if (M[i][j] == 0) {
continue;
}
while (j != SIZE - 1 && M[i][j + 1] == 0) {
M[i][j + 1] = M[i][j];
M[i][j ++] = 0;
}
}
for (j = SIZE - 1; j >= 1; j --) {
if (M[i][j] == M[i][j - 1]) {
M[i][j] += M[i][j - 1];
M[i][j - 1] = 0;
}
}
for (j = SIZE - 2; j >= 0; j --) {
if (M[i][j] == 0) {
continue;
}
while (j != SIZE - 1 && M[i][j + 1] == 0) {
M[i][j + 1] = M[i][j];
M[i][j ++] = 0;
}
}
}
break;
case BOTTOM:
for (j = 0; j < SIZE; j ++) {
for (i = SIZE - 2; i >= 0; i --) {
if (M[i][j] == 0) {
continue;
}
while (i != SIZE - 1 && M[i + 1][j] == 0) {
M[i + 1][j] = M[i][j];
M[i ++][j] = 0;
}
}
for (i = SIZE - 1; i >= 1; i --) {
if (M[i][j] == M[i - 1][j]) {
M[i][j] += M[i - 1][j];
M[i - 1][j] = 0;
}
}
for (i = SIZE - 2; i >= 0; i --) {
if (M[i][j] == 0) {
continue;
}
while (i != SIZE - 1 && M[i + 1][j] == 0) {
M[i + 1][j] = M[i][j];
M[i ++][j] = 0;
}
}
}
break;
default:
break;
}
}
void showM() {
cout << endl << endl;
cout << " ┏━━━━┳━━━━┳━━━━┳━━━━┓" << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┃ ";
setView(M[0][0]);
cout << " ┃ ";
setView(M[0][1]);
cout << " ┃ ";
setView(M[0][2]);
cout << " ┃ ";
setView(M[0][3]);
cout << " ┃ " << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┣━━━━╋━━━━╋━━━━╋━━━━┫" << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┃ ";
setView(M[1][0]);
cout << " ┃ ";
setView(M[1][1]);
cout << " ┃ ";
setView(M[1][2]);
cout << " ┃ ";
setView(M[1][3]);
cout << " ┃ " << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┣━━━━╋━━━━╋━━━━╋━━━━┫" << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┃ ";
setView(M[2][0]);
cout << " ┃ ";
setView(M[2][1]);
cout << " ┃ ";
setView(M[2][2]);
cout << " ┃ ";
setView(M[2][3]);
cout << " ┃ " << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┣━━━━╋━━━━╋━━━━╋━━━━┫" << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┃ ";
setView(M[3][0]);
cout << " ┃ ";
setView(M[3][1]);
cout << " ┃ ";
setView(M[3][2]);
cout << " ┃ ";
setView(M[3][3]);
cout << " ┃ " << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┃ ┃ ┃ ┃ ┃" << endl;
cout << " ┗━━━━┻━━━━┻━━━━┻━━━━┛" << endl;
}
void setView(int number) {
if (number == 0) {
cout << " ";
} else {
cout << setw(4) << number;
}
}
bool isDead() {
for (int i = 0; i < SIZE; i ++) {
for (int j = 0; j < SIZE; j ++) {
if (M[i][j] == 0) {
return false;
}
}
}
return true;
}