您的位置:首页 > 其它

小游戏——2048的简易实现

2014-04-26 20:47 555 查看
周六下午花了点时间实现了最近很火的小游戏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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: