Qt--2048小游戏

这篇具有很好参考价值的文章主要介绍了Qt--2048小游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主要内容

  1. 2048

一.2048小游戏

1.功能

  1. 上下左右控制数字格子的移动 WASD
  2. 4*4 格子移动操作,加操作
  3. 开始游戏的按钮,重新游戏按钮
  4. 得分计算
  5. 判断游戏是否结束

2.源程序

代码如下(示例):

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QKeyEvent>
#include <QPushButton>
#include <QPainter>
#include <QTime>
#include <QDebug> //用来 Debug
#include <QMessageBox>//自定义消息提示框
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void paintEvent(QPaintEvent *);
void keyPressEvent(QKeyEvent *event);
void PressUp();
void PressDown();
void PressLeft();
void PressRight();
void myRand();
QPushButton *button;
int s[4][4];
int score=0;
bool state;
struct Ns{
int i;
int j;
};
public slots:
void slotStart();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

Main.cpp

#include "MainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.setFixedSize(320,480);
w.setWindowTitle("2048");
w.show();
return a.exec();
}

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//初始化
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
s[i][j]=0;
}
}
button = new QPushButton("开始游戏",this);
button->setGeometry(60,400,200,50);//从(60,400)做一个 200*50 的按钮
//随机函数
qsrand(uint(QTime(0,0,0).secsTo(QTime::currentTime())));
connect(button,SIGNAL(clicked()),this,SLOT(slotStart()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.setBrush(Qt::blue);
p.setFont(QFont("微软雅黑",20,700,false));
QString strscore;
p.drawText(QPoint(20,60),"分数: "+QString::number(score));
for (int i=0;i<4;i++) {
for (int j=0;j<4;j++) {
p.setPen(Qt::transparent);//?
if(s[i][j]==0){
p.setBrush(Qt::gray);
p.drawRect(i*60+40,j*60+120,55,55);
}
else if (s[i][j]==2) {
p.setBrush(Qt::red);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
//在方块中 绘制 Text, 并且文本位置位于中部
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(2),QTextOption(Qt::Al
ignCenter));
}
else if (s[i][j]==4) {
p.setBrush(Qt::darkRed);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(4),QTextOption(Qt::Al
ignCenter));
}
else if (s[i][j]==8) {
p.setBrush(Qt::green);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(8),QTextOption(Qt::Al
ignCenter));
}
else if (s[i][j]==16) {
p.setBrush(Qt::darkGreen);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(16),QTextOption(Qt::A
lignCenter));
}
else if (s[i][j]==32) {
p.setBrush(Qt::yellow);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(32),QTextOption(Qt::A
lignCenter));
}
else if (s[i][j]==64) {
p.setBrush(Qt::darkYellow);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(64),QTextOption(Qt::A
lignCenter));
}
else if (s[i][j]==128) {
p.setBrush(Qt::cyan);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(128),QTextOption(Qt::
AlignCenter));
}
else if (s[i][j]==256) {
p.setBrush(Qt::darkCyan);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(256),QTextOption(Qt::
AlignCenter));
}
else if (s[i][j]==512) {
p.setBrush(Qt::magenta);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(512),QTextOption(Qt::
AlignCenter));
}
else if (s[i][j]==1024) {
p.setBrush(Qt::darkMagenta);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(1024),QTextOption(Qt::
AlignCenter));
}
else if (s[i][j]==2048) {
p.setBrush(Qt::blue);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(2048),QTextOption(Qt::
AlignCenter));
}
else{
p.setBrush(Qt::darkBlue);
p.drawRect(i*60+40,j*60+120,55,55);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",10,700,false));
p.drawText(QRectF(i*60+40,j*60+120,55,55),QString::number(s[i][j]),QTextOption(
Qt::AlignCenter));
}
}
}
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
if(!state){
return ;
}
switch (event->key()) {
case Qt::Key_W:
PressUp();
break;
case Qt::Key_S:
PressDown();
break;
case Qt::Key_A:
PressLeft();
break;
case Qt::Key_D:
PressRight();
break;
default:
return;//忽略其他按钮
}
myRand();
update();
}
void MainWindow::slotStart(){
QMessageBox::about(this,"游戏规则","WSAD 控制方块上下左右移动");
score=0;
for (int i=0;i<4;i++) {
for (int j=0;j<4;j++) {
s[i][j]=0;
}
}
button->setText("重新游戏");
int randi=qrand()%4;
int randj=qrand()%4;
s[randi][randj]=2;
state=true;
update();
}
void MainWindow::PressUp(){
//移动
for (int i=0;i<4;i++) {
for (int j=1;j<4;j++) {
if(s[i][j]==0)continue;
for (int p=0;p<j;p++) {
//查看前面是否有空格子可移动
if(s[i][p]==0){
s[i][p]=s[i][j];
s[i][j]=0;
break;
}
}
}
}
//相加
for (int i=0;i<4;i++) {
for (int j=0;j<3;j++) {
if(s[i][j]==s[i][j+1]){
s[i][j]=2*s[i][j];
s[i][j+1]=0;
score+=s[i][j];
for (int p=j+2;p<4;p++) {
s[i][p-1]=s[i][p];
}
}
}
}
}
void MainWindow::PressDown(){
//移动
for (int i=0;i<4;i++) {
for (int j=2;j>=0;j--) {
if(s[i][j]==0)continue;
for (int p=3;p>j;p--) {
//查看前面是否有空格子可移动
if(s[i][p]==0){
s[i][p]=s[i][j];
s[i][j]=0;
break;
}
}
}
}
//相加
for (int i=0;i<4;i++) {
for (int j=3;j>0;j--) {
if(s[i][j]==s[i][j-1]){
s[i][j]=2*s[i][j];
s[i][j-1]=0;
score+=s[i][j];
for (int p=j-2;p>=0;p--) {
s[i][p+1]=s[i][p];
}
}
}
}
}
void MainWindow::PressLeft(){
//移动
for (int j=0;j<4;j++) {
for (int i=1;i<4;i++) {
if(s[i][j]==0){
continue;
}
for (int p=0;p<i;p++) {
//查看前面是否有空格可移入
if(s[p][j] == 0){
s[p][j] = s[i][j];
s[i][j] = 0;
break;
}
}
}
}
//相加
for (int j=0;j<4;j++) {
for (int i=0;i<3;i++) {
if(s[i][j]==s[i+1][j]){
s[i][j]=s[i][j]*2;
score+=s[i][j];
s[i+1][j]=0;
for(int p=i+2;p<4;p++){
s[p-1][j] = s[p][j];
}
}
}
}
}
void MainWindow::PressRight(){
//移动
for (int j=0;j<4;j++) {
for (int i=2;i>=0;i--) {
if(s[i][j]==0){
continue;
}
for (int p=3;p>i;p--) {
//查看前面是否有空格可移入
if(s[p][j] == 0){
s[p][j] = s[i][j];
s[i][j] = 0;
break;
}
}
}
}
//相加
for (int j=0;j<4;j++) {
for (int i=3;i>=0;i--) {
if(s[i][j]==s[i-1][j]){
s[i][j]=s[i][j]*2;
s[i-1][j]=0;
score+=s[i][j];
for(int p=i-2;p>=0;p--){
s[p+1][j] = s[p][j];
}
}
}
}
}
void MainWindow::myRand(){
int i=0,j=0;
//找出格子
struct Ns n[15];
int ni=0;
for (i=0;i<4;i++) {
for (j=0;j<4;j++) {
if(s[i][j]==0){
n[ni].i=i;
n[ni].j=j;
ni++;
}
}
}
//判断游戏是否结束
if (ni==0) {
for (i=0;i<4;i++) {
for (j=0;j<3;j++) {
if(s[i][j]==s[i][j+1]){
return;
}
}
}
for (j=0;j<4;j++) {
for (i=0;i<3;i++) {
if(s[i][j]==s[i+1][j]){
return;
}
}
}
QMessageBox::about(this,"游戏失败","分数为:"+QString::number(score)+"
");
return;
}
int rand=qrand()%ni;
s[n[rand].i][n[rand].j]=2;
}

Qt--2048小游戏,算法与数据结构,qt,命令模式,开发语言,算法,数据结构

5.结果

Qt--2048小游戏,算法与数据结构,qt,命令模式,开发语言,算法,数据结构


总结

以上是今天要讲的内容,练习了2048小游戏。文章来源地址https://www.toymoban.com/news/detail-823821.html

到了这里,关于Qt--2048小游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2048小游戏成品源码

    2048小游戏,可以自选背景颜色,方框颜色,音乐播放。 还可以展示当前玩家的排名,动态排名,及历史玩家的排名。 前期需求: 使用pygame加载目录音乐。MP3文件: 看下运行后的效果图: =========参数设置: =========背景设置: =========方块设置: ==========源码分享:

    2024年02月16日
    浏览(44)
  • c++制作小游戏2048

    完整代码来自于爱编程的柚子《【C语言/C++游戏项目】:2048小游戏,超详细教程教会你写这个小游戏。》 这个游戏用到了#include graphics.h,思路比较简单。 首先做出游戏页面,然后画出4*4的格子,利用map二维数组,依据数字{0,2,4,8,16,32,64,128,256,512,1024,2048}找到对应颜色在固定位

    2024年02月13日
    浏览(44)
  • Android期末项目2048小游戏

    Android期末项目2048小游戏。 2048属于益智类小游戏,它做到了娱乐性、趣味性、教育性相统一。益智类的游戏即是需要去开动大脑去思考从而获得游戏的胜利。简单的益智类游戏可以使玩家在娱乐中不断的开发大脑。这样一来就实现了在娱乐中学习。每次可以选择上下左右其中

    2024年02月06日
    浏览(57)
  • python快速实现2048小游戏

    《2048》是一款比较流行的数字游戏,最早于2014年3月20日发行。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台。这款游戏是基于《1024》和《小3传奇》的玩法开发而成的新型数字游戏。 操作指南: 每次可以选择上下左右其中一个方向去滑动,每滑动

    2024年02月11日
    浏览(40)
  • 基于C#的2048小游戏

    最近在玩过2048这个小游戏后感觉很有意思,想着正在学C#的winfrom的我能不能自己写一个2048游戏呢?于是就有了这个:   目录 1.实现思路; 2.代码实现; 1.初始化地图表示的数组; 2.绘制游戏的边框; 3.设置每个数值对应的颜色(可省略); 4.添加控件; 5.四个方向的移动;

    2024年02月08日
    浏览(44)
  • 【Android Studio】图形化数字游戏,小游戏2048。

    手机中的小游戏是一种在日常生活中应用广泛的休闲软件,无论是在超市商店,还是在办公室,或是家庭都有着它的身影。随着移动互联网和智能手机的不断发展和进步,当今市场上已经出现了多种简单轻松的小游戏,几乎每一位智能手机的使用者都会在种类繁多的App网站上

    2024年02月03日
    浏览(43)
  • 【C语言】2048小游戏【附源码】

    欢迎来到英杰社区 https://bbs.csdn.net/topics/617804998         2048是一款数字益智类游戏,玩家需要使用键盘控制数字方块的移动,合并相同数字的方块,最终达到数字方块上出现“2048”的目标。         每次移动操作,所有数字方块会朝着指定方向同时滑动,并在靠近边

    2024年04月15日
    浏览(38)
  • 用Python做一个2048小游戏

    2048的逻辑无非是操作 4 × 4 4times4 4 × 4 的方格,每个方格中有一个数,这些数可以移动,如果两个相同的数字在移动时相撞了,就可以彼此合并。 而这个 4 × 4 4times4 4 × 4 的方格,无非是一个矩阵。只需设计好移动逻辑,再用PyGame将这个方格表现出来就算大功告成。 2048只有

    2024年01月17日
    浏览(45)
  • 2048小游戏 java版(代码+注释)

            一个纯纯小白,想写点什么,也想学习一下怎么在这里写东西,就简单的写个2048小游戏。写的不好,大佬就不用看了,希望和大家交流学习,有写的不好或有更好的建议也欢迎提出来。(需要用的可直接粘贴复制)(轻喷) 目录 游戏展示 讲解  代码        

    2024年02月09日
    浏览(50)
  • 用JAVA写一个2048的小游戏。

    如图所示: 使用软件:eclipse2021-12版 JDK版本:JDK15.0.1 链接:https://pan.baidu.com/s/1NVWaklg9K2wRmBOLew6iMQ 提取码:ts08 1. Client.java: 2.Constant.java 3.Block.java 4.BlockLoader.java 5.Drawable.java 6.Moveable.java 7.MyFrame.java 提示:代码写的有些臃肿,其中也有一些BUG,理解源码以后可以修正。 链接:

    2024年02月10日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包