小游戏——2048的简易实现

周六下午花了点时间实现了最近很火的小游戏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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值