相信大家都玩过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. [转] 运维小技巧:使用ss命令代替 netstat,和netstat说再见

    [From] https://blog.csdn.net/fenglailea/article/details/51810977 ss是Socket Statistics的缩写. 顾名思义,ss命令可 ...

  2. Q680 验证回文字符串 Ⅱ

    给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "abca" 输出: ...

  3. (转)数位dp

    原博客 https://blog.csdn.net/wust_zzwh/article/details/52100392 建议原博客看到hdu 不要62,然后看我分割线后两道题,然后再回来看原博.-- ...

  4. hcheck 脚本

    hcheck.sql - Script to Check for Known Problems in Oracle8i, Oracle9i, Oracle10g, Oracle 11g and Ora ...

  5. ZABBIX 监控基本报警故障

    CPU触发器: 1)Processor load is too high on {HOST.NAME} {HOST.NAME}上处理器负载太高 触发器表达式:{Zabbix server:system ...

  6. [Activator-HelloAkka] Define our Actors

    The Actor is the unit of execution in Akka. Actors are object-oriented in the sense that they encaps ...

  7. java中static方法的继承性

    首先需要知道的是,java中所有的public实例方法都默认是virtual的,static方法不是virtual的,所以static方法可以被覆盖(new),但不可被重写(override) 1.被 ...

  8. React.js 小书 Lesson11 - 配置组件的 props

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson11 转载请注明出处,保留原文链接和作者信息. 组件是相互独立.可复用的单元,一个组件可能在不 ...

  9. 《Python编程从入门到实践》_第三章_列表简介

    什么是列表呢? 官方说明就是由一些列按特点顺序排列的元素组成.其实可以看出很多个字符串的有序组合吧,里面的内容可以随时的删除,增加,修改. 下面这个就是一个列表,python打印列表的时候会将中括号和 ...

  10. 分支结构case……end

    语法: case when 条件1 then 结果1 when 条件2 then 结果2 ……….. else 其它结果 end 执行顺序: 条件1成立执行结果1 条件2成立执行结果2 如果所有的wh ...