1,按键的设置
连接键盘按键的代码
#include<QKeyEvent>
方向的设置
typedef enum Direct{
DIR_LEFT,
DIR_RIGHT,
DIR_UP,
DIR_DOWN
}dir_t;
void keyPressEvent(QKeyEvent*event) ;
//朝上下左右加一个小方块
void addTop();
void addDown();
void addRight();
void addLeft();
向上移动,通过向上加一个方块,向下减一个方块实现。同时也规定了向上时不能按向下按键。
其他方向同理。
void Widget::keyPressEvent(QKeyEvent*event)
{
switch (event->key()) {
case Qt::Key_W://上
if(moveFlag !=DIR_DOWN)
{
moveFlag= DIR_UP;
}
break;
}
void Widget::addTop()
{
QPointF leftTop;
QPointF rightBottom;
leftTop=QPointF(snake[0].x(),snake[0].y()-nodeHeight);
rightBottom=snake[0].topRight();
snake.insert(0,QRectF(leftTop,rightBottom));//左上角和右下角的位置确定
}
2,游戏启动
通过按键p来实现游戏途中的启动与暂停
Qt::Key_P://按键p 启动暂停
if (gameStart==false)
{
gameStart=true;
//启动定时器
timer->start(time);
}
else
{
gameStart=false;
timer->stop();
}
这里用到了定时器 ,关联信号槽 ,启动定时器和 实现对应的超时函数处理,也可以改变time的数值来改变蛇的速度。
timer= new QTimer();
//信号槽 信号与对应函数关联
connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
QTimer *timer;
int time= 100;//超时时间间隔,毫秒
3,贪吃蛇的实现
首先使用的是paintEvent,通过该代码来实现对蛇的绘画,以及奖励和背景的实现。
此外还使用了随机函数来随机显示奖励的位置。
void Widget::paintEvent(QPaintEvent *event)
{
//背景图片
QPixmap pix;
pix.load ("D:/qt/project/snake.JPG");//背景图片位置
QPainter painter(this);
painter.drawPixmap(0,0,800,400,pix);//图片高度宽度
//蛇
QPen pen;
QBrush brush;
pen.setColor(Qt::blue);//笔的颜色
brush.setColor(Qt::green);//填充颜色
brush.setStyle(Qt::SolidPattern);//设置风格
painter.setPen(pen);
painter.setBrush(brush);
for (int i = 0; i< snake.length(); i++) {
painter.drawRect(snake[i]);
}
//吃的
pen.setColor(Qt::blue);//笔的颜色
brush.setColor(Qt::red);//填充颜色
brush.setStyle(Qt::SolidPattern);//设置风格
painter.setPen(pen);
painter.setBrush(brush);
//painter.drawRect(rewardNode);//方形
painter.drawEllipse(rewardNode);//椭圆
//碰撞
if(checkContact())
{
QFont font("微软雅黑",30,QFont::ExtraLight,false);
painter.setFont(font);
painter.drawText((this->width()-200)/2,
(this->height()-40)/2,
QString("游戏结束"));
timer->stop();
}
//右
if (snake[0].x()+nodeWidth*2>this->width())//右
{
QFont font("微软雅黑",30,QFont::ExtraLight,false);
painter.setFont(font);
painter.drawText((this->width()-200)/2,
(this->height()-40)/2,
QString("游戏结束"));
timer->stop();
}
//左
if(snake[0].x()-nodeWidth<0)
{
QFont font("微软雅黑",30,QFont::ExtraLight,false);
painter.setFont(font);
painter.drawText((this->width()-200)/2,
(this->height()-40)/2,
QString("游戏结束"));
timer->stop();
}
//下
if (snake[0].y()+nodeHeight*2>this->height())
{
QFont font("微软雅黑",30,QFont::ExtraLight,false);
painter.setFont(font);
painter.drawText((this->width()-200)/2,
(this->height()-40)/2,
QString("游戏结束"));
timer->stop();
}
//上
if (snake[0].y()-nodeHeight<0)
{
QFont font("微软雅黑",30,QFont::ExtraLight,false);
painter.setFont(font);
painter.drawText((this->width()-200)/2,
(this->height()-40)/2,
QString("游戏结束"));
timer->stop();
}
QWidget::paintEvent(event);
}
void Widget::addNewreward()
{
rewardNode=QRectF
(
rand()%(this->width()/20)*20,
rand()%(this->height()/20)*20,
nodeHeight,nodeWidth);
}