相信大家都玩过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. Codeforces - 527C 平衡树维护几何

    题意:给定一个矩形\(W*H\),一共\(n\)次切割操作(水平/垂直),求每次操作后得出的最大面积 随机按tag扫CF题目找到的题,可以分别用平衡树维护割边的位置和长度(\(x/y\)各两个) 具体 ...

  2. POJ - 3735 循环操作

    构造n+1元组,m次方的矩阵代表循环操作 本题尚有质疑之处(清零操作的正确性还有单位矩阵的必要性),题解可能会改正 #include<iostream> #include<algor ...

  3. JOB&paper

    我突然想到,不管我最终有没有获得一份可观的工作,但是每个公司都最终会收到我的一份简历 (3)熟悉面向对象编程: (4)熟悉TCP/IP, Http等网络协议和网络编程:   2.熟练掌握MFC.STL ...

  4. js去掉浏览器右键点击默认事件(+vue项目开启右键行为)

    js去掉浏览器右键点击默认事件 1.阻止整个页面所有的右击事件 document.oncontextmenu = function(){ return false;} 2.特定的区域/元素 docum ...

  5. tp5.0

    入口文件绑定 : define('BIND_MODULE','admin/index'); 配置 auto_bind_moudle = ture|false.  入口自动绑定模块 入口文件 defin ...

  6. Blockly

    Blockly简介 A library for building visual programming editors.  Blockly 是个库,可用来构建可视化编程编辑器 Blockly is b ...

  7. Oracle RAC集群添加节点

    一,节点环境 所有节点分发/etc/hosts,这里我添加两个节点,一个是上次删除的节点,另一个是什么都没有的节点,尝试添加 服务器介绍什么的都在这hosts文件了,大家自己琢磨下 [grid@nod ...

  8. c# 跨平台ide JetBrains Rider

    https://www.jetbrains.com/rider/ et框架 调试hotfix用的,说是vs调试容易崩溃 破解方法 https://zhile.io/2018/08/18/jetbrai ...

  9. 资料收集:学习 Linux/*BSD/Unix 的 30 个最佳在线文档

    文章转自:https://linux.cn/article-10311-1.html 手册页(man)是由系统管理员和 IT 技术开发人员写的,更多的是为了作为参考而不是教你如何使用.手册页对于已经熟 ...

  10. github不支持tlsv1.1后, 出现SSL connect error

    过完年回来, github不安分了, 发了博文说不支持TLSv1/TLSv1.1: Weak cryptographic standards removed, 没看到这篇博文之前, 还以为是代理问题, ...