qt打字小游戏

最好有源码

1.打字训练游戏

typeGame QDialog
1-1 字母 / 砖块 绘制
paintEvent() ---- update()
QPainter 类

资源清单: 26个字母 砖块 背景

数据处理:
struct _STCH
QString szPath
QPoint cPos

QSize 砖块大小
QPoint 桌上角第一块砖的位置

const int max_ch = 5
最多5个字母同时出现

1.绘制砖头 40*40
800/40 = 20 col
640/40 = 16 row

13 14 15
2.处理数据********

3.随机出现字母

字母图片和位置

4.捕获用户按键

KeyPressEvent
5.计分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

首先建一个文件叫typeGame 选择 基类 QDialog
名字设为dialog

1.dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

#include <QMessageBox>

// 声明它是一个外部变量
extern int gScore;

void Dialog::on_startBtn_clicked()
{
initImgList(); // 1.初始化图片路径
initPosList(); // 2.初始化图片位置
// initWallList(); // 3.初始化砖头列表
checkCrash(); // 4.检查字母是否撞倒砖头
// 3.定义控制字母下移的定时器
QTimer *pDownTimer = new QTimer;
connect(pDownTimer,SIGNAL(timeout()),
this,SLOT(updateMap()));
pDownTimer->start(1000);

// 4.定义产生字母的定时器
QTimer *pCharTimer = new QTimer;
connect(pCharTimer,SIGNAL(timeout()),
this,SLOT(createChar()));
pCharTimer->start(3000);
// 5.定义一个刷新显示分数的定时器
QTimer *pScoreTimer = new QTimer;
connect(pScoreTimer,SIGNAL(timeout()),
this,SLOT(updateScore()));
pScoreTimer->start(500);
// 6.定义一个刷新计时的定时器
QTimer *pTimeTimer = new QTimer;
connect(pTimeTimer,SIGNAL(timeout()),
this,SLOT(updateTime()));
pTimeTimer->start(1000);
}

Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog),
m_iTime(60)
{
ui->setupUi(this);
initWallList();
checkCrash();
}

Dialog::~Dialog()
{
delete ui;
}

void Dialog::paintEvent(QPaintEvent * event)
{
QPainter p(this);
// 1.绘制背景
p.drawPixmap(0,0,800,640,QPixmap(":image/back.jpg"));
// 2.绘制砖头
for(int i = 0; i < m_WallList.size(); ++i)
{
int x = m_WallList.at(i).x();
int y = m_WallList.at(i).y();
p.drawPixmap(x,y,40,40,QPixmap(":image/wall.jpg"));
}

// 3.绘制随机产生的字母
for(int i = 0; i < m_CharList.size(); ++ i)
{
int x = m_CharList.at(i).x;
int y = m_CharList.at(i).y;
int iIndex = m_CharList.at(i).iIndex;
p.drawPixmap(x,y,40,40,QPixmap(m_ImgList.at(iIndex)));
}
}

// 按键事件
void Dialog::keyPressEvent(QKeyEvent * event)
{
m_key = event->key();
m_key += 32;
for(int i = 0; i < m_CharList.size(); ++ i)
if( m_key == m_CharList.at(i).value)
{
m_CharList.removeAt(i);
gScore += 10;
break;
}
update();
return ;
}

// 更新地图
void Dialog::updateMap()
{
// 1.改变字母的位置
for(int i = 0; i < m_CharList.size(); ++ i)
m_CharList[i].y += 40;
// 2.检查字母是否撞倒砖头
checkCrash();
// 3.重绘地图
update();
return ;
}

// 产生字母
void Dialog::createChar()
{
if( m_CharList.size() > 4)
return ;

STCHAR stChar;
stChar.iIndex = rand()%m_ImgList.size();
stChar.x = m_PosList.at(stChar.iIndex%20).x();
stChar.y = m_PosList.at(stChar.iIndex%20).y();
stChar.value = stChar.iIndex + 'a';

m_CharList.append(stChar);
return ;
}

// 1.初始化图片路径
void Dialog::initImgList()
{
for(char i = 'a'; i<='z'; ++i)
{
QString szPath = QString(":image/%1.jpg").arg(i);
m_ImgList.append(szPath);
}
return ;
}
// 2.初始化图片位置
void Dialog::initPosList()
{
for(int iCol = 0; iCol < 20; ++iCol)
m_PosList.append(QPoint(iCol*40,0));
return ;
}
// 3.初始化砖头列表
void Dialog::initWallList()
{
for(int iRow = 13; iRow < 16; ++ iRow)
for(int iCol = 0; iCol < 20; ++iCol)
m_WallList.append(QPoint(iCol*40,iRow*40));
return ;
}

// 4.检查字母是否撞倒砖头
void Dialog::checkCrash()
{
for(int i = 0; i < m_CharList.size(); ++i)
for(int j = 0; j < m_WallList.size(); ++j)
{
int x1 = m_CharList.at(i).x;
int y1 = m_CharList.at(i).y;
int x2 = m_WallList.at(j).x();
int y2 = m_WallList.at(j).y();
if ( x1 == x2 && y1 == y2)
{
m_CharList.removeAt(i);
m_WallList.removeAt(j);
gScore -=5;
return ;
}
}
}

// 5.定义一个刷新显示分数
void Dialog::updateScore()
{
ui->scoreLcd->display(gScore);
return ;
}

// 5.定义一个刷新显示时间
void Dialog::updateTime()
{
ui->timeLcd->display(m_iTime--);
if( m_iTime < 0 )
close();
return ;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186

2.dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QPainter>
#include <QTimer>
#include <QKeyEvent>

// 字符信息结构体
typedef struct _STCHAR
{
int iIndex; // 字母索引值
int x; // 字母X坐标
int y; // 字母Y坐标
int value; // 字母值
}STCHAR;

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
void initImgList(); // 1.初始化图片路径
void initPosList(); // 2.初始化图片位置
void initWallList(); // 3.初始化砖头列表
void checkCrash(); // 4.检查字母是否撞倒砖头
protected:
void paintEvent(QPaintEvent * event); // 绘图事件
void keyPressEvent(QKeyEvent * event); // 按键事件
public slots:
void updateMap(); // 更新地图
void createChar(); // 创建字符
void updateScore(); // 更新分数
void updateTime(); // 更新时间
private slots:
void on_startBtn_clicked();

private:
Ui::Dialog *ui;
QList<QString> m_ImgList; // 字母图片路径
QList<QPoint> m_PosList; // 字母初始位置
QList<STCHAR> m_CharList; // 字符链表
QList<QPoint> m_WallList; // 砖头列表
int m_key; // 用户输入Key
int m_iTime; // 计时时间
int gScore = 0;
};

#endif // DIALOG_H
---------------------
作者:王木木界
来源:CSDN
原文:https://blog.csdn.net/sinat_24880087/article/details/52433687
版权声明:本文为博主原创文章,转载请附上博文链接!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-01-10
金山打字
相似回答