在linux系统中使用qt creator实现2048源代码
时间: 2023-12-03 19:04:52 浏览: 180
首先需要安装Qt Creator和Qt库。安装完成后,可以按照以下步骤进行实现:
1. 新建Qt Widgets Application项目。
2. 在项目中添加四个Label和一个PushButton,用于显示游戏界面和重新开始游戏。
3. 编写游戏逻辑代码,实现游戏的初始化、移动、合并等操作。
4. 将游戏逻辑代码与界面进行连接,实现游戏的展示和操作。
5. 编写结束判断代码,当游戏结束时弹出游戏结束提示框。
6. 部署程序,生成可执行文件。
下面是一个简单的2048实现示例代码:
mainwindow.h文件:
```cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLabel>
#include <QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QLabel *box[4][4];
QPushButton *restartBtn;
int score;
bool gameover;
void initGame();
void clearBox();
void newBox();
void updateBox();
void moveLeft();
void moveRight();
void moveUp();
void moveDown();
bool canMove();
bool canCombine();
bool isGameOver();
void gameOver();
int getRand(int min, int max);
private slots:
void restartGame();
void keyPressEvent(QKeyEvent *event);
};
#endif // MAINWINDOW_H
```
mainwindow.cpp文件:
```cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QKeyEvent>
#include <QMessageBox>
#include <ctime>
#include <cstdlib>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 设置窗口大小
setFixedSize(400, 400);
// 新建重新开始按钮
restartBtn = new QPushButton(this);
restartBtn->setText("重新开始");
restartBtn->setGeometry(290, 30, 100, 30);
connect(restartBtn, SIGNAL(clicked(bool)), this, SLOT(restartGame()));
// 新建游戏盒子
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
box[i][j] = new QLabel(this);
box[i][j]->setGeometry(20 + i * 90, 100 + j * 90, 80, 80);
box[i][j]->setStyleSheet("background-color: #bbada0; border-radius: 5px; font-size: 36px; font-weight: bold; color: #776e65; text-align: center;");
box[i][j]->setText("");
}
}
// 初始化游戏
initGame();
}
MainWindow::~MainWindow()
{
}
void MainWindow::initGame()
{
// 清空游戏盒子
clearBox();
// 初始化得分和游戏状态
score = 0;
gameover = false;
// 新建两个数字盒子
newBox();
newBox();
// 更新游戏盒子
updateBox();
}
void MainWindow::clearBox()
{
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
box[i][j]->setText("");
}
}
}
void MainWindow::newBox()
{
int i, j;
do {
i = getRand(0, 3);
j = getRand(0, 3);
} while (box[i][j]->text() != "");
int value = getRand(1, 2) * 2;
box[i][j]->setText(QString::number(value));
}
void MainWindow::updateBox()
{
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
int value = box[i][j]->text().toInt();
if (value == 0) {
box[i][j]->setText("");
} else {
box[i][j]->setText(QString::number(value));
}
switch (value) {
case 0:
box[i][j]->setStyleSheet("background-color: #bbada0; border-radius: 5px; font-size: 36px; font-weight: bold; color: #776e65; text-align: center;");
break;
case 2:
box[i][j]->setStyleSheet("background-color: #eee4da; border-radius: 5px; font-size: 36px; font-weight: bold; color: #776e65; text-align: center;");
break;
case 4:
box[i][j]->setStyleSheet("background-color: #ede0c8; border-radius: 5px; font-size: 36px; font-weight: bold; color: #776e65; text-align: center;");
break;
case 8:
box[i][j]->setStyleSheet("background-color: #f2b179; border-radius: 5px; font-size: 36px; font-weight: bold; color: #f9f6f2; text-align: center;");
break;
case 16:
box[i][j]->setStyleSheet("background-color: #f59563; border-radius: 5px; font-size: 36px; font-weight: bold; color: #f9f6f2; text-align: center;");
break;
case 32:
box[i][j]->setStyleSheet("background-color: #f67c5f; border-radius: 5px; font-size: 36px; font-weight: bold; color: #f9f6f2; text-align: center;");
break;
case 64:
box[i][j]->setStyleSheet("background-color: #f65e3b; border-radius: 5px; font-size: 36px; font-weight: bold; color: #f9f6f2; text-align: center;");
break;
case 128:
box[i][j]->setStyleSheet("background-color: #edcf72; border-radius: 5px; font-size: 36px; font-weight: bold; color: #f9f6f2; text-align: center;");
break;
case 256:
box[i][j]->setStyleSheet("background-color: #edcc61; border-radius: 5px; font-size: 36px; font-weight: bold; color: #f9f6f2; text-align: center;");
break;
case 512:
box[i][j]->setStyleSheet("background-color: #edc850; border-radius: 5px; font-size: 36px; font-weight: bold; color: #f9f6f2; text-align: center;");
break;
case 1024:
box[i][j]->setStyleSheet("background-color: #edc53f; border-radius: 5px; font-size: 36px; font-weight: bold; color: #f9f6f2; text-align: center;");
break;
case 2048:
box[i][j]->setStyleSheet("background-color: #edc22e; border-radius: 5px; font-size: 36px; font-weight: bold; color: #f9f6f2; text-align: center;");
break;
default:
box[i][j]->setStyleSheet("background-color: #3c3a32; border-radius: 5px; font-size: 36px; font-weight: bold; color: #f9f6f2; text-align: center;");
break;
}
}
}
}
void MainWindow::moveLeft()
{
bool flag = false;
for (int i = 0; i < 4; i++) {
int last = -1;
for (int j = 0; j < 4; j++) {
if (box[i][j]->text() == "") {
continue;
}
if (last == -1) {
last = j;
} else {
if (box[i][last]->text() == box[i][j]->text()) {
int value = box[i][j]->text().toInt() * 2;
score += value;
box[i][last]->setText(QString::number(value));
box[i][j]->setText("");
last = -1;
flag = true;
} else {
last = j;
}
}
}
if (last != -1) {
if (last != i) {
box[i][last]->setText(box[i][i]->text());
box[i][i]->setText("");
flag = true;
}
}
}
if (flag) {
newBox();
updateBox();
}
}
void MainWindow::moveRight()
{
bool flag = false;
for (int i = 0; i < 4; i++) {
int last = -1;
for (int j = 3; j >= 0; j--) {
if (box[i][j]->text() == "") {
continue;
}
if (last == -1) {
last = j;
} else {
if (box[i][last]->text() == box[i][j]->text()) {
int value = box[i][j]->text().toInt() * 2;
score += value;
box[i][last]->setText(QString::number(value));
box[i][j]->setText("");
last = -1;
flag = true;
} else {
last = j;
}
}
}
if (last != -1) {
if (last != i) {
box[i][last]->setText(box[i][i]->text());
box[i][i]->setText("");
flag = true;
}
}
}
if (flag) {
newBox();
updateBox();
}
}
void MainWindow::moveUp()
{
bool flag = false;
for (int j = 0; j < 4; j++) {
int last = -1;
for (int i = 0; i < 4; i++) {
if (box[i][j]->text() == "") {
continue;
}
if (last == -1) {
last = i;
} else {
if (box[last][j]->text() == box[i][j]->text()) {
int value = box[i][j]->text().toInt() * 2;
score += value;
box[last][j]->setText(QString::number(value));
box[i][j]->setText("");
last = -1;
flag = true;
} else {
last = i;
}
}
}
if (last != -1) {
if (last != j) {
box[last][j]->setText(box[j][j]->text());
box[j][j]->setText("");
flag = true;
}
}
}
if (flag) {
newBox();
updateBox();
}
}
void MainWindow::moveDown()
{
bool flag = false;
for (int j = 0; j < 4; j++) {
int last = -1;
for (int i = 3; i >= 0; i--) {
if (box[i][j]->text() == "") {
continue;
}
if (last == -1) {
last = i;
} else {
if (box[last][j]->text() == box[i][j]->text()) {
int value = box[i][j]->text().toInt() * 2;
score += value;
box[last][j]->setText(QString::number(value));
box[i][j]->setText("");
last = -1;
flag = true;
} else {
last = i;
}
}
}
if (last != -1) {
if (last != j) {
box[last][j]->setText(box[j][j]->text());
box[j][j]->setText("");
flag = true;
}
}
}
if (flag) {
newBox();
updateBox();
}
}
bool MainWindow::canMove()
{
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (box[i][j]->text() == "") {
return true;
}
if (i > 0 && box[i][j]->text() == box[i - 1][j]->text()) {
return true;
}
if (i < 3 && box[i][j]->text() == box[i + 1][j]->text()) {
return true;
}
if (j > 0 && box[i][j]->text() == box[i][j - 1]->text()) {
return true;
}
if (j < 3 && box[i][j]->text() == box[i][j + 1]->text()) {
return true;
}
}
}
return false;
}
bool MainWindow::canCombine()
{
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (i > 0 && box[i][j]->text() == box[i - 1][j]->text()) {
return true;
}
if (i < 3 && box[i][j]->text() == box[i + 1][j]->text()) {
return true;
}
if (j > 0 && box[i][j]->text() == box[i][j - 1]->text()) {
return true;
}
if (j < 3 && box[i][j]->text() == box[i][j + 1]->text()) {
return true;
}
}
}
return false;
}
bool MainWindow::isGameOver()
{
if (canMove()) {
return false;
}
if (canCombine()) {
return false;
}
return true;
}
void MainWindow::gameOver()
{
gameover = true;
QMessageBox::information(this, "游戏结束", "得分:" + QString::number(score));
}
int MainWindow::getRand(int min, int max)
{
srand(time(NULL));
return rand() % (max - min + 1) + min;
}
void MainWindow::restartGame()
{
initGame();
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
if (gameover) {
return;
}
switch (event->key()) {
case Qt::Key_Left:
moveLeft();
if (isGameOver()) {
gameOver();
}
break;
case Qt::Key_Right:
moveRight();
if (isGameOver()) {
gameOver();
}
break;
case Qt::Key_Up:
moveUp();
if (isGameOver()) {
gameOver();
}
break;
case Qt::Key_Down:
moveDown();
if (isGameOver()) {
gameOver();
}
break;
default:
break;
}
}
```
编译运行后,即可在窗口中玩2048游戏。
阅读全文