一个命令行版本的2048。支持自定义游戏矩阵的长和宽。同时也是我中学生电脑制作大赛的参赛作品。
#include<cstdio>
#include<iostream>
#include<windows.h>
#include<ctime>
#include<cstdlib>
using namespace std;
void readInput(int* l, int* h);
void gameStart(int l, int h);
class GameTable {
private:
int t[10][10];
int length, height;
int score;
bool cleanLeft(bool status) {
bool sta = false;
if(status) {
for(int i = 0 ; i < height ; i++) {
for(int j = 0 ; j < length ; j++) {
if(t[i][j]) {
int tmp = j - 1;
while(!t[i][tmp] && tmp >= 0) {
tmp--;
}
tmp++;
if(tmp != j) {
t[i][tmp] = t[i][j];
t[i][j] = 0;
sta = true;
}
}
}
}
}
return sta;
}
bool cleanRight(bool status) {
bool sta = false;
if(status) {
for(int i = 0 ; i < height ; i++) {
for(int j = length - 1 ; j >= 0 ; j--) {
if(t[i][j]) {
int tmp = j + 1;
while(!t[i][tmp] && tmp <= length - 1) {
tmp++;
}
tmp--;
if(tmp != j) {
t[i][tmp] = t[i][j];
t[i][j] = 0;
sta = true;
}
}
}
}
}
return sta;
}
bool cleanUp(bool status) {
bool sta = false;
if(status) {
for(int i = 0 ; i < length ; i++) {
for(int j = 0 ; j < height ; j++) {
if(t[j][i]) {
int tmp = j - 1;
while(!t[tmp][i] && tmp >= 0) {
tmp--;
}
tmp++;
if(tmp != j) {
t[tmp][i] = t[j][i];
t[j][i] = 0;
sta = true;
}
}
}
}
}
return sta;
}
bool cleanDown(bool status) {
bool sta = false;
if(status) {
for(int i = 0 ; i < length ; i++) {
for(int j = height - 1 ; j >= 0 ; j--) {
if(t[j][i]) {
int tmp = j + 1;
while(!t[tmp][i] && tmp <= height - 1) {
tmp++;
}
tmp--;
if(tmp != j) {
t[tmp][i] = t[j][i];
t[j][i] = 0;
sta = true;
}
}
}
}
}
return sta;
}
int max(int x, int y) {
return x > y ? x : y;
}
int min(int x, int y) {
return x < y ? x : y;
}
public:
GameTable(int l, int h) {
memset(t, 0, sizeof(t));
length = l;
height = h;
score = 0;
}
bool moveLeft(void) {
bool status = false;
if(cleanLeft(true) == true) {
status = true;
}
for(int i = 0 ; i < height ; i++) {
for(int j = length - 1 ; j > 0 ; j--) {
if(t[i][j] == t[i][j - 1] && t[i][j] != 0) {
status = true;
t[i][j] = 0;
t[i][j - 1] *= 2;
score += t[i][j - 1];
j--;
}
}
}
cleanLeft(status);
return status;
}
bool moveRight(void) {
bool status = false;
if(cleanRight(true) == true) {
status = true;
}
for(int i = 0 ; i < height ; i++) {
for(int j = 0 ; j < length - 1 ; j++) {
if(t[i][j] == t[i][j + 1] && t[i][j] != 0) {
status = true;
t[i][j] = 0;
t[i][j + 1] *= 2;
score += t[i][j + 1];
j++;
}
}
}
cleanRight(status);
return status;
}
bool moveUp(void) {
bool status = false;
if(cleanUp(true) == true) {
status = true;
}
for(int i = 0 ; i < length ; i++) {
for(int j = height - 1 ; j > 0 ; j--) {
if(t[j][i] == t[j - 1][i] && t[j][i] != 0) {
status = true;
t[j][i] = 0;
t[j - 1][i] *= 2;
score += t[j - 1][i];
j--;
}
}
}
cleanUp(status);
return status;
}
bool moveDown(void) {
bool status = false;
if(cleanDown(true) == true) {
status = true;
}
for(int i = 0 ; i < length ; i++) {
for(int j = 0 ; j < height - 1 ; j++) {
if(t[j][i] == t[j + 1][i] && t[j][i] != 0) {
status = true;
t[j][i] = 0;
t[j + 1][i] *= 2;
score += t[j + 1][i];
j++;
}
}
}
cleanDown(status);
return status;
}
bool gameStatus(void) {
bool status = false;
for(int i = 0 ; i < height ; i++) {
for(int j = 0 ; j < length ; j++) {
if(t[i][j] == 0) {
status = true;
break;
}
}
if(status) {
break;
}
}
for(int i = 1 ; i < height - 1 ; i++) {
for(int j = 1 ; j < length - 1 ; j++) {
int tmp = t[i][j];
if(t[i][j + 1] == tmp || t[i][j - 1] == tmp || t[i - 1][j] == tmp || t[i + 1][j] == tmp) {
status = true;
break;
}
}
if(status) {
break;
}
}
if(t[0][0] == t[0][1] || t[0][0] == t[1][0]) {
status = true;
}
if(t[0][length - 1] == t[0][length - 2] || t[0][length - 1] == t[1][length - 1]) {
status = true;
}
if(t[height - 1][0] == t[height - 1][1] || t[height - 1][0] == t[height - 2][0]) {
status = true;
}
if(t[height - 1][length - 1] == t[height - 2][length - 1] || t[height - 1][length - 1] == t[height - 1][length - 2]) {
status = true;
}
return status;
}
void printTable(void) {
for(int i = 0 ; i < height ; i++) {
for(int j = 0 ; j < length ; j++) {
printf("%d\t", t[i][j]);
}
printf("\n");
}
printf("Score:%d\n", score);
}
void addNum(void) {
int l = rand() % length;
int h = rand() % height;
while(t[h][l]) {
l = rand() % length;
h = rand() % height;
}
int num = rand() % 2;
if(num == 0) {
t[h][l] = 2;
} else {
t[h][l] = 4;
}
}
};
int main() {
int l, h;
srand((unsigned)time(NULL));
bool sta = true;
while(sta) {
readInput(&l, &h);
gameStart(l, h);
printf("Would you like to play again?(Y/N):");
char s = getchar();
fflush(stdin);
while(!(s == 'n' || s == 'N' || s == 'y' || s == 'Y')) {
printf("Input error! Please input again:");
s = getchar();
fflush(stdin);
}
if(s == 'N' || s == 'n') {
printf("Thanks for playing! Please press enter to exit.");
sta = false;
getchar();
} else {
printf("\n\n");
}
}
}
void readInput(int* l, int* h) {
printf("Please input the length and height(separated by a comma)(3 <= length <= 10 and 3 <= height <= 10):");
scanf("%d,%d", l, h);
printf("%d %d", *l, *h);
while(!(*l <= 10 && *h <= 10 && *l >= 3 && *h >= 3)) {
printf("Input error! Please input again:");
scanf("%d,%d", l, h);
}
}
void gameStart(int l, int h) {
GameTable *gt = new GameTable(l, h);
char op;
gt -> addNum();
while(gt -> gameStatus()) {
system("cls");
gt -> printTable();
fflush(stdin);
scanf("%c", &op);
bool sta;
switch(op) {
case 'w':
sta = gt -> moveUp();
break;
case 's':
sta = gt -> moveDown();
break;
case 'a':
sta = gt -> moveLeft();
break;
case 'd':
sta = gt -> moveRight();
break;
default:
printf("Error! Please input again:");
scanf("%d", &op);
}
if(sta) {
gt -> addNum();
}
}
system("cls");
gt -> printTable();
printf("\n\nGame Over!!\n\n");
delete gt;
}