Qt 制作2048小游戏
相信大家都玩过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小游戏的更多相关文章
- 【2048小游戏】——CSS/原生js爬坑之纯CSS模态对话框&游戏结束
引言:2048小游戏的结束界面,使用纯CSS制作模态对话框,一般做模态对话框都会使用BootStrap自带的模态对话框组件方便使用,但在制作要运行在移动端的小项目时,就不能使用BootStrap,因为 ...
- .NET手撸2048小游戏
.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
- C# 开发2048小游戏
这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...
- Swift实战之2048小游戏
上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...
- 如何在CentOS上安装一个2048小游戏
如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...
- js、jQuery实现2048小游戏
2048小游戏 一.游戏简介: 2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合 ...
- 用js实现2048小游戏
用js实现2048小游戏 笔记仓库:https://github.com/nnngu/LearningNotes 1.游戏简介 2048是一款休闲益智类的数字叠加小游戏.(文末给出源代码和演示地址) ...
- 2048小游戏代码解析 C语言版
2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图: 游 ...
随机推荐
- [八分之一的男人]POJ - 1743 后缀数组 height分组 带详解
题意:求最长不可重叠的相同差值子串的长度 这道题算是拖了好几个月,现在花了点时间应该搞懂了不少,尝试分析一下 我们首先来解决一个退化的版本,求最长不可重叠的相同子串(差值为0) 比如\(aabaaba ...
- [转] git忽略已经被提交的文件
[From] https://segmentfault.com/q/1010000000430426 正确的做法应该是:git rm --cached logs/xx.log,然后更新 .gitign ...
- PIE SDK打开矢量数据
1. 功能简介 GIS将地理空间数据表示为矢量数据和栅格数据.矢量数据模型使用点.线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点.河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联. ...
- PIE SDK矢量分级渲染
1. 功能简介 分级渲染是矢量的一种数据表达方式.通过选取一个字段,并根据实际需要对字段的数据进行分级,并对每一级设置不同的符号,已达到区分显示的效果. 2. 功能实现说明 2.1. 实现思路及原理说 ...
- spark第七篇:Spark SQL, DataFrame and Dataset Guide
预览 Spark SQL是用来处理结构化数据的Spark模块.有几种与Spark SQL进行交互的方式,包括SQL和Dataset API. 本指南中的所有例子都可以在spark-shell,pysp ...
- 使用 Ninject
在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事情,续这篇文章之后,本文将用一个实际的示例来 ...
- C#知识点提要
本篇博文主要对asp.net mvc开发需要撑握的C#语言知识点进行简单回顾,尤其是C# 3.0才有的一些C#语言特性.对于正在学asp.net mvc的童鞋,不防花个几分钟浏览一下.本文要回顾的C# ...
- 怎么理解impala(impala工作原理是什么)
下面给大家介绍怎么理解impala,impala工作原理是什么. Impala是hadoop上交互式MPP SQL引擎, 也是目前性能最好的开源SQL-on-hadoop方案. 如下图所示, impa ...
- C#下查找并杀死子进程(进程树)
参考:如何杀死进程及子进程 /** * 传入参数:父进程id * 功能:根据父进程id,杀死与之相关的进程树 */ public static void KillProcessAndChildren( ...
- bzoj 5329: [Sdoi2018]战略游戏
Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...