贪吃蛇的实现

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);


}

4,运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值