當前位置:編程學習大全網 - 源碼下載 - qt打字小遊戲

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

原文:/sinat_24880087/article/details/52433687

版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

  • 上一篇:鴻蒙OS之後,華為還有後手?36萬臺華為平板安裝極光操作系統
  • 下一篇:徐霞客《遊嵩山日記》解析
  • copyright 2024編程學習大全網