相信大家都玩过2048把,下面是我用qt写得2048小游戏。

2048.pro

HEADERS += \
Widget.h SOURCES += \
Widget.cpp \
main.cpp QT += widgets gui RESOURCES += \
ico.qrc RC_ICONS = .ico

widget.h

#ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QKeyEvent>
#include <QPushButton>
#include <QPainter>
#include <QTime> class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = );
void paintEvent(QPaintEvent *);
void keyPressEvent(QKeyEvent *event); void PressUp();
void PressDown();
void PressLeft();
void PressRight();
void myRand(); QPushButton *button;
int s[][];
int score;
bool state; struct Ns{ //保存空格
int i;
int j;
}; signals: public slots:
void slotStart();
}; #endif // WIDGET_H

widget.cpp

#include "Widget.h"
#include <QMessageBox> #include <QDebug> Widget::Widget(QWidget *parent) :
QWidget(parent),score(),state(false)
{
for(int i=;i<;i++)
for(int j=;j<;j++)
s[i][j]=; button = new QPushButton("开始游戏",this);
button->setGeometry(,,,);
qsrand(QTime(, , ).secsTo(QTime::currentTime()));//随机函数
connect(button,SIGNAL(clicked()),this,SLOT(slotStart())); //connect(timer,SIGNAL(timeout()),this,SLOT(update()));
} void Widget::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.setBrush(Qt::blue);
p.setFont(QFont("微软雅黑",,,false)); QString strscore;
p.drawText(QPoint(,),"分数:"+QString::number(score)); for(int i=;i<;i++)
for(int j=;j<;j++){
p.setPen(Qt::transparent);
if(s[i][j] == ){
p.setBrush(Qt::gray);
p.drawRect(i*+,j*+,,);
}
else if(s[i][j] == ){
p.setBrush(Qt::red);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter));
}
else if(s[i][j] == ){
p.setBrush(Qt::darkRed);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter)); }
else if(s[i][j] == ){
p.setBrush(Qt::green);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter)); }
else if(s[i][j] == ){
p.setBrush(Qt::darkGreen);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter)); }
else if(s[i][j] == ){
p.setBrush(Qt::yellow);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter)); }
else if(s[i][j] == ){
p.setBrush(Qt::darkYellow);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter)); }
else if(s[i][j] == ){
p.setBrush(Qt::cyan);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter)); }
else if(s[i][j] == ){
p.setBrush(Qt::darkCyan);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter)); }
else if(s[i][j] == ){
p.setBrush(Qt::magenta);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter)); }
else if(s[i][j] == ){
p.setBrush(Qt::darkMagenta);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter)); }
else if(s[i][j] == ){
p.setBrush(Qt::blue);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(),QTextOption(Qt::AlignCenter)); }
else{
p.setBrush(Qt::darkBlue);
p.drawRect(i*+,j*+,,);
p.setPen(Qt::black);
p.setFont(QFont("微软雅黑",,,false));
p.drawText(QRectF(i*+,j*+,,),QString::number(s[i][j]),QTextOption(Qt::AlignCenter));
} }
} void Widget::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 Widget::slotStart()
{
QMessageBox::about(this,"游戏规则","亲!~用W,S,A,D分别控制方块上下左右移动,知道了吗?");
score = ;
for(int i=;i<;i++)
for(int j=;j<;j++)
s[i][j]=;
button->setText("重新游戏"); int randi = qrand() % ;
int randj = qrand() % ;
s[randi][randj] = ; state = true;
update(); } void Widget::PressUp()
{
//移动
for(int i=;i<;i++)
for(int j=;j<;j++){
if(s[i][j] == ){
continue;//前格子为空
}
for(int p=;p<j;p++){
if(s[i][p] == ){//查看前面是否有空格可移入 {
s[i][p] = s[i][j];
s[i][j] = ;
break;
}
}
}
//相加
for(int i=;i<;i++)
for(int j=;j<;j++){
if(s[i][j] == s[i][j+]){
s[i][j] = s[i][j]*;
s[i][j+] = ;
score += s[i][j];
for(int p=j+;p<;p++)
s[i][p-] = s[i][p];
} }
} void Widget::PressDown()
{
//移动
for(int i=;i<;i++)
for(int j=;j>=;j--){
if(s[i][j] == ){
continue;//前格子为空
}
for(int p=;p>j;p--){
if(s[i][p] == ){//查看前面是否有空格可移入
s[i][p] = s[i][j];
s[i][j] = ;
break;
}
}
}
//相加
for(int i=;i<;i++)
for(int j=;j>;j--){
if(s[i][j] == s[i][j-]){
s[i][j] = s[i][j]*;
s[i][j-] = ;
score += s[i][j];
for(int p=j-;p>=;p--)
s[i][p+] = s[i][p];
} }
} void Widget::PressLeft()
{
//移动
for(int j=;j<;j++)
for(int i=;i<;i++){
if(s[i][j] == ){
continue;//前格子为空
}
for(int p=;p<i;p++){
if(s[p][j] == ){//查看前面是否有空格可移入
s[p][j] = s[i][j];
s[i][j] = ;
break;
}
}
}
//相加
for(int j=;j<;j++)
for(int i=;i<;i++){
if(s[i][j] == s[i+][j]){
s[i][j] = s[i][j]*;
s[i+][j] = ;
score += s[i][j];
for(int p=i+;p<;p++)
s[p-][j] = s[p][j];
} } } void Widget::PressRight()
{
//移动
for(int j=;j<;j++)
for(int i=;i>=;i--){
if(s[i][j] == ){
continue;//前格子为空
}
for(int p=;p>i;p--){
if(s[p][j] == ){//查看前面是否有空格可移入
s[p][j] = s[i][j];
s[i][j] = ;
break;
}
}
}
//相加
for(int j=;j<;j++)
for(int i=;i>;i--){
if(s[i][j] == s[i-][j]){
s[i][j] = s[i][j]*;
s[i-][j] = ;
score += s[i][j];
for(int p=i-;p>=;p--)
s[p+][j] = s[p][j];
} } } void Widget::myRand()
{
int i,j;
//找出空的格子
struct Ns n[];
int ni=;
for(i=;i<;i++)
for(j=;j<;j++){
if(s[i][j] == )
{
n[ni].i=i;
n[ni].j=j;
++ni;
}
} //判断游戏是否结束
if(ni == ){
for(i=;i<;i++)
for(j=;j<;j++)
if(s[i][j] == s[i][j+])
return;
for(j=;j<;j++)
for(i=;i<;i++)
if(s[i][j] == s[i+][j])
return;
QMessageBox::about(this,"游戏失败","亲! 你失败了哟~~ 当前分数:"+QString::number(score)+" ");
return;
} int rand = qrand() % (ni);
s[n[rand].i][n[rand].j] = ; }

main.cpp

#include "Widget.h"
#include <QApplication> int main(int argc,char** argv)
{
QApplication app(argc,argv); Widget w;
w.setFixedSize(,);
w.setWindowTitle("");
w.setWindowIcon(QIcon(":/2048.ico"));
w.show(); return app.exec();
}

比起一大堆啰嗦的文字,我还是觉得代码更靠谱。

Qt 制作2048小游戏的更多相关文章

  1. 【2048小游戏】——CSS/原生js爬坑之纯CSS模态对话框&游戏结束

    引言:2048小游戏的结束界面,使用纯CSS制作模态对话框,一般做模态对话框都会使用BootStrap自带的模态对话框组件方便使用,但在制作要运行在移动端的小项目时,就不能使用BootStrap,因为 ...

  2. .NET手撸2048小游戏

    .NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...

  3. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  4. C# 开发2048小游戏

    这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...

  5. Swift实战之2048小游戏

    上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...

  6. 如何在CentOS上安装一个2048小游戏

    如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...

  7. js、jQuery实现2048小游戏

    2048小游戏 一.游戏简介:  2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合 ...

  8. 用js实现2048小游戏

    用js实现2048小游戏 笔记仓库:https://github.com/nnngu/LearningNotes 1.游戏简介 2048是一款休闲益智类的数字叠加小游戏.(文末给出源代码和演示地址) ...

  9. 2048小游戏代码解析 C语言版

    2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图:  游 ...

随机推荐

  1. JedisPool

    package redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis. ...

  2. linux下安装软件的方法(mariadb)

    一.方式 1. rpm (不推荐使用) 2. yum 安装(非常方便快捷) 3. 编译安装(需要自定制的时候才使用) 二.技术栈 #闭源收费的技术栈: svn + java + apache(web服 ...

  3. 使用JWT来实现单点登录功能

    出处: https://www.cnblogs.com/zexin/p/10389541.html 我们平时自己开发项目,分布式的结构时,访问量不大,但是又不想搭建redis服务器,这时我觉得jwt不 ...

  4. (转)IPC相关的命令

    IPC相关的命令 原文:http://www.cnblogs.com/jjzd/p/6773090.html 进程间通信概述 进程间通信有如下的目的: 1.数据传输,一个进程需要将它的数据发送给另一个 ...

  5. 安装cloudermanager时出现Acquiring installation lock问题(图文详解)

    不多说,直接上干货! 问题详情 解决办法 哪一个节点被锁就删除哪一个. 解决办法:进入/tmp 目录,ls -a查看,删除scm_prepare_node.*的文件,以及.scm_prepare_no ...

  6. 案例47-crm练习登录校验拦截器

    1 LoginInterceptor package www.test.web.interceptor; import java.util.Map; import com.opensymphony.x ...

  7. sourceTree免登陆

    https://www.cnblogs.com/dereckbu/articles/7659674.html

  8. c#委托、泛型、反射的使用情况

    委托:当你传递的参数不是 变量 时,想把一个方法作为参数传递,此时委托就可以做到这点 泛型:当你传递的参数是一个类时,此时用泛型 反射:都说反射是一种耗时的操作,但是却很有用,所以反射他不是拿来滥用的 ...

  9. 已知tomcat应用名称,如何查询该应用端口号

    假设应用名称叫pear,并假设路径为:/datong/tomcat-pear/ 方法一,根据PID查找应用端口号,前提是应用已经运行 1,找到改应用的PID:ps -ef | grep pear | ...

  10. 【转】Python中不尽如人意的断言Assertion

    原文地址:Python中不尽如人意的断言Assertion Python Assert 为何不尽如人意 Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛 ...