2048游戏高级版
2025-08-10 10:35:04
发布于:广东
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <windows.h>
using namespace std;
class Game2048 {
private:
vector<vector<int>> board;
int score;
bool gameOver;
bool won;
// 随机生成一个新的数字(2或4)
void generateNewNumber() {
int emptyCount = 0;
for (const auto& row : board) {
for (int cell : row) {
if (cell == 0) emptyCount++;
}
}
if (emptyCount == 0) return;
int pos = rand() % emptyCount + 1;
int value = (rand() % 10 == 0) ? 4 : 2; // 10%概率生成4,90%生成2
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (board[i][j] == 0) {
pos--;
if (pos == 0) {
board[i][j] = value;
return;
}
}
}
}
}
// 检查游戏是否结束
bool checkGameOver() {
// 检查是否有空位
for (const auto& row : board) {
for (int cell : row) {
if (cell == 0) return false;
}
}
// 检查是否还有可合并的数字
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] == board[i][j+1]) return false;
if (board[j][i] == board[j+1][i]) return false;
}
}
return true;
}
// 辅助函数:打印分隔线
void printLine() {
cout << "+------+------+------+------+" << endl;
}
public:
Game2048() : board(4, vector<int>(4, 0)), score(0), gameOver(false), won(false) {
srand(time(0));
generateNewNumber();
generateNewNumber();
}
// 显示游戏界面
void printBoard() {
system("cls"); // 清屏
cout << "================ 2048 游戏 ================" << endl;
cout << "分数: " << score << endl;
cout << "操作: 方向键移动,Q键退出" << endl << endl;
printLine();
for (const auto& row : board) {
for (int cell : row) {
cout << "|";
if (cell == 0) {
cout << " ";
} else {
// 根据数字大小设置宽度,确保对齐
int width = 6;
int numDigits = to_string(cell).length();
int spaces = (width - numDigits) / 2;
for (int i = 0; i < spaces; i++) cout << " ";
cout << cell;
for (int i = 0; i < width - numDigits - spaces; i++) cout << " ";
}
}
cout << "|" << endl;
printLine();
}
if (won) {
cout << endl << "恭喜你赢了!继续挑战更高分数吧!" << endl;
}
}
// 向左移动
bool moveLeft() {
bool moved = false;
for (int i = 0; i < 4; i++) {
// 移除空格
for (int j = 0; j < 4; j++) {
if (board[i][j] == 0) {
for (int k = j + 1; k < 4; k++) {
if (board[i][k] != 0) {
board[i][j] = board[i][k];
board[i][k] = 0;
moved = true;
break;
}
}
}
}
// 合并相同数字
for (int j = 0; j < 3; j++) {
if (board[i][j] != 0 && board[i][j] == board[i][j+1]) {
board[i][j] *= 2;
score += board[i][j];
if (board[i][j] == 2048) won = true;
board[i][j+1] = 0;
moved = true;
// 合并后需要再次向左移动填补空位
for (int k = j + 1; k < 3; k++) {
board[i][k] = board[i][k+1];
board[i][k+1] = 0;
}
}
}
}
return moved;
}
// 向右移动
bool moveRight() {
bool moved = false;
for (int i = 0; i < 4; i++) {
// 移除空格
for (int j = 3; j >= 0; j--) {
if (board[i][j] == 0) {
for (int k = j - 1; k >= 0; k--) {
if (board[i][k] != 0) {
board[i][j] = board[i][k];
board[i][k] = 0;
moved = true;
break;
}
}
}
}
// 合并相同数字
for (int j = 3; j > 0; j--) {
if (board[i][j] != 0 && board[i][j] == board[i][j-1]) {
board[i][j] *= 2;
score += board[i][j];
if (board[i][j] == 2048) won = true;
board[i][j-1] = 0;
moved = true;
// 合并后需要再次向右移动填补空位
for (int k = j - 1; k > 0; k--) {
board[i][k] = board[i][k-1];
board[i][k-1] = 0;
}
}
}
}
return moved;
}
// 向上移动
bool moveUp() {
bool moved = false;
for (int j = 0; j < 4; j++) {
// 移除空格
for (int i = 0; i < 4; i++) {
if (board[i][j] == 0) {
for (int k = i + 1; k < 4; k++) {
if (board[k][j] != 0) {
board[i][j] = board[k][j];
board[k][j] = 0;
moved = true;
break;
}
}
}
}
// 合并相同数字
for (int i = 0; i < 3; i++) {
if (board[i][j] != 0 && board[i][j] == board[i+1][j]) {
board[i][j] *= 2;
score += board[i][j];
if (board[i][j] == 2048) won = true;
board[i+1][j] = 0;
moved = true;
// 合并后需要再次向上移动填补空位
for (int k = i + 1; k < 3; k++) {
board[k][j] = board[k+1][j];
board[k+1][j] = 0;
}
}
}
}
return moved;
}
// 向下移动
bool moveDown() {
bool moved = false;
for (int j = 0; j < 4; j++) {
// 移除空格
for (int i = 3; i >= 0; i--) {
if (board[i][j] == 0) {
for (int k = i - 1; k >= 0; k--) {
if (board[k][j] != 0) {
board[i][j] = board[k][j];
board[k][j] = 0;
moved = true;
break;
}
}
}
}
// 合并相同数字
for (int i = 3; i > 0; i--) {
if (board[i][j] != 0 && board[i][j] == board[i-1][j]) {
board[i][j] *= 2;
score += board[i][j];
if (board[i][j] == 2048) won = true;
board[i-1][j] = 0;
moved = true;
// 合并后需要再次向下移动填补空位
for (int k = i - 1; k > 0; k--) {
board[k][j] = board[k-1][j];
board[k-1][j] = 0;
}
}
}
}
return moved;
}
// 处理用户输入
void handleInput() {
int key = _getch();
// 方向键的ASCII码特殊,需要处理两次
if (key == 224) {
key = _getch();
switch (key) {
case 72: moveUp(); break; // 上
case 80: moveDown(); break; // 下
case 75: moveLeft(); break; // 左
case 77: moveRight(); break; // 右
}
} else if (key == 'q' || key == 'Q') {
gameOver = true;
}
// 如果移动了,生成新数字并检查游戏是否结束
if (!gameOver) {
generateNewNumber();
gameOver = checkGameOver();
}
}
// 游戏主循环控制
void play() {
while (!gameOver) {
printBoard();
handleInput();
}
printBoard();
cout << endl << "游戏结束!最终得分: " << score << endl;
if (won) {
cout << "恭喜你成功合成了2048!" << endl;
} else {
cout << "再接再厉!" << endl;
}
}
};
int main() {
Game2048 game;
game.play();
return 0;
}
这里空空如也
有帮助,赞一个