熟悉的2048小游戏,环境:Windows10及以上,dev.c++5.11及以上或控制台(可能有警告,不影响运行)
付代码:
cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int SIZE = 4;
int board[SIZE][SIZE];
// 初始化游戏棋盘,随机两个位置生成 2 或 4
void initialize() {
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
board[i][j] = 0;
}
}
srand(time(0));
int x1 = rand() % SIZE;
int y1 = rand() % SIZE;
board[x1][y1] = (rand() % 2 == 0) ? 2 : 4;
int x2, y2;
do {
x2 = rand() % SIZE;
y2 = rand() % SIZE;
} while (x2 == x1 && y2 == y1);
board[x2][y2] = (rand() % 2 == 0) ? 2 : 4;
}
// 打印游戏棋盘
void printBoard() {
system("cls");
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
if (board[i][j] == 0) {
cout << ".\t";
} else {
cout << board[i][j] << "\t";
}
}
cout << endl;
}
}
// 在空白位置随机生成一个 2 或 4
void generateRandomTile() {
int emptyTiles = 0;
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
if (board[i][j] == 0) {
emptyTiles++;
}
}
}
if (emptyTiles > 0) {
int randomTile = rand() % emptyTiles;
int count = 0;
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
if (board[i][j] == 0) {
if (count == randomTile) {
board[i][j] = (rand() % 2 == 0) ? 2 : 4;
return;
}
count++;
}
}
}
}
}
// 判断是否还有空白位置
bool hasEmptyTile() {
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
if (board[i][j] == 0) {
return true;
}
}
}
return false;
}
// 判断是否还有可合并的相邻方块
bool canMerge() {
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
if (i > 0 && board[i][j] == board[i - 1][j]) {
return true;
}
if (i < SIZE - 1 && board[i][j] == board[i + 1][j]) {
return true;
}
if (j > 0 && board[i][j] == board[i][j - 1]) {
return true;
}
if (j < SIZE - 1 && board[i][j] == board[i][j + 1]) {
return true;
}
}
}
return false;
}
// 判断游戏是否结束
bool isGameOver() {
return!hasEmptyTile() &&!canMerge();
}
// 向上移动
void up() {
bool moved = false;
for (int j = 0; j < SIZE; ++j) {
for (int i = 1; i < SIZE; ++i) {
if (board[i][j] != 0) {
int k = i;
while (k > 0 && board[k - 1][j] == 0) {
board[k - 1][j] = board[k][j];
board[k][j] = 0;
k--;
moved = true;
}
if (k > 0 && board[k - 1][j] == board[k][j]) {
board[k - 1][j] *= 2;
board[k][j] = 0;
moved = true;
}
}
}
}
if (moved) {
generateRandomTile();
}
}
// 向下移动
void down() {
bool moved = false;
for (int j = 0; j < SIZE; ++j) {
for (int i = SIZE - 2; i >= 0; --i) {
if (board[i][j] != 0) {
int k = i;
while (k < SIZE - 1 && board[k + 1][j] == 0) {
board[k + 1][j] = board[k][j];
board[k][j] = 0;
k++;
moved = true;
}
if (k < SIZE - 1 && board[k + 1][j] == board[k][j]) {
board[k + 1][j] *= 2;
board[k][j] = 0;
moved = true;
}
}
}
}
if (moved) {
generateRandomTile();
}
}
// 向左移动
void left() {
bool moved = false;
for (int i = 0; i < SIZE; ++i) {
for (int j = 1; j < SIZE; ++j) {
if (board[i][j] != 0) {
int k = j;
while (k > 0 && board[i][k - 1] == 0) {
board[i][k - 1] = board[i][k];
board[i][k] = 0;
k--;
moved = true;
}
if (k > 0 && board[i][k - 1] == board[i][k]) {
board[i][k - 1] *= 2;
board[i][k] = 0;
moved = true;
}
}
}
}
if (moved) {
generateRandomTile();
}
}
// 向右移动
void right() {
bool moved = false;
for (int i = 0; i < SIZE; ++i) {
for (int j = SIZE - 2; j >= 0; --j) {
if (board[i][j] != 0) {
int k = j;
while (k < SIZE - 1 && board[i][k + 1] == 0) {
board[i][k + 1] = board[i][k];
board[i][k] = 0;
k++;
moved = true;
}
if (k < SIZE - 1 && board[i][k + 1] == board[i][k]) {
board[i][k + 1] *= 2;
board[i][k] = 0;
moved = true;
}
}
}
}
if (moved) {
generateRandomTile();
}
}
int main() {
initialize();
while (true) {
printBoard();
if (isGameOver()) {
cout << "Game Over!" << endl;
break;
}
char input;
cin >> input;
switch (input) {
case 'w':
up();
break;
case 's':
down();
break;
case 'a':
left();
break;
case 'd':
right();
break;
default:
cout << "请输入'w', 's', 'a',d'" << endl;
}
}
return 0;
}