QT实现一个简单的打字游戏
1.使用容器来存放字符的坐标点
1.1 创建一个容器QList<QPoint> disPos;
1.2 在构造函数中初始化这些坐标点;
for(int i = 0;i<10;i++)
{
dispPos << QPoint(qrand()%width(),
qrand()%height()-height());
}
2.使用容器来存放字符
1.1 创建一个容器QList<char> letter; 存放所有字符,可在构造函数中将需要的字符放入其中;
for(i = 0;i < 26 ;i++)
{
letters << 'a' + i;
}
for(i = 0;i < 26 ;i++)
{
letters << 'A' + i;
}
for(i = 0;i < 10 ;i++)
{
letters << '0' + i;
}
1.2 创建一个容器QList<char> dispLetter;用来存放将要显示在窗口中的字符。可以和坐标点一起初始化。
for(int i = 0;i<10;i++)
{
dispPos << QPoint(rand()%width(),
rand()%height()-height());
dispLetters << letters[(qrand()%letters.count())];
}
3.在窗口中显示这些字符
3.1 在paintEvent事件中使用drawText方法来显示。
QPainter p(this);
for(int i = 0;i<dispLetters.count();i++)
{
p.drawText(dispPos[i],
QString((QChar)dispLetters[i]));
}
4.通过在timerEvent中编程来使字符掉落
4.1 开启定时器startTimer(100);
4.2 每次调用事件使每个字符的y坐标增加一,在窗口上显示就是字符下落;
4.3 对于掉落到底部的字符,使其从顶部随机位置重新出现且更换字符。
4.4 增加分数机制,对于在掉落到底部之前没有按下的分数减10.
4.5 结束后不要忘了更新界面。
for(int i = 0
{
dispPos[i].setY(dispPos[i].y() + 1)
if(dispPos[i].y() >= height())
{
dispPos[i].setY(0)
dispPos[i].setX(qrand()%width())
score -= 10
dispLetters[i] = letters[qrand()%letters.count()]
}
}
update()
5.通过键盘按下相同的字符来消除字符
5.1 使用keyPressEvent(QKeyEvent *event)事件
5.2 使用event->text()来获取键盘输入的字符串
5.2 使用event->text().contains()来判断输入的字符串中是否包含窗口上正在掉落的字符。
5.3 如果存在,则将其"消除":本质是将其y坐标置0,字符重新随机。
5.4 同样有分数机制,每消失一个字符则分数加10.
for(int i = 0;i<dispLetters.count();i++)
{
if(event->text().contains(dispLetters[i]))
{
dispPos[i].setY(0);
dispPos[i].setX(qrand()%width());
score += 10;
dispLetters[i] = letters[qrand()%letters.count()];
}
}
6.显示分数
6.1 在类中创建一个全局变量score
6.2 使用drawText在固定位置显示分数
p.drawText(20,40,QString("%1").arg(score))
6.可优化的地方
6.1 按下按键后只有y坐标最大的字符消失,其余就算和它相同的字符也不会受到影响。
6.2 按下的字符如果在屏幕上没有的话,分数会减少。
6.3 其余未想到的地方。