基于QT5.4的C++贪吃蛇小游戏

栏目: 编程工具 · 发布时间: 5年前

内容简介:游戏核心代码:向上走为例:运行效果图:

游戏核心代码:

void myWidget::timerEvent(QTimerEvent *e){//定时器
    if(e->timerId() == timerId && gamePause){
        if(direction == s_right){
            goRight();
        }else if(direction == s_up){
            goUp();
        }else if(direction == s_down){
            goDown();
        }else if(direction == s_left){
            goLeft();
        }
        //qDebug()<<score;
        if(isEated){
            strScore = QString::number(score);
            ui->label->setText(strScore);
        }
        update();

        if(crashed){
            player->stop();
            player_gg->play();
            Sleep(1000);
            MessageBox(0, TEXT("不要灰心!继续游戏??"), TEXT("Sorry,defeat!!"), 0);//游戏结束时
            gamePause = !gamePause;
            init();
            strScore = QString::number(score);
            ui->label->setText(strScore);
        }
    }
}

void myWidget::keyPressEvent(QKeyEvent *e){//键盘事件监听
   // qDebug()<<(char)e->key();
    if(gameStart){//游戏开始时才可以手动
        if(e->key() == Qt::Key_W){
            if(direction == s_down) return;//不做处理
            direction = s_up;
            //if(e->isAutoRepeat())//重复按下再快跑会有迟钝效果。。
            goUp();
            if(isEated)
                createApple();//随机产生苹果位置
        }else if(e->key() == Qt::Key_S){
            if(direction == s_up) return;//不做处理
            direction = s_down;
            goDown();
            if(isEated)
                createApple();//随机产生苹果位置
        }else if(e->key() == Qt::Key_A){
            if(direction == s_right) return;//不做处理
            direction = s_left;
            goLeft();
            if(isEated)
                createApple();//随机产生苹果位置
        }else if(e->key() == Qt::Key_D){
            if(direction == s_left) return;//不做处理
            direction = s_right;
            goRight();
            if(isEated)
                createApple();//随机产生苹果位置
        }

        strScore = QString::number(score);
        ui->label->setText(strScore);

        update();
    }

}


void myWidget::paintEvent(QPaintEvent *)
{
    //QPainter p(this);
    QPainter p;//创建画家对象
    p.begin(this);//指定当前窗口为绘图设备
    //绘图操作
    //p.drawPixmap(0,0,width(),height(),QPixmap("../image/bg.jpg"));//背景图
    if(bg)
        p.drawPixmap(rect(),QPixmap("../image/bg.jpg"));//背景图
    else{
        p.drawPixmap(rect(),QPixmap("../image/bg.png"));//背景图
    }

    //定义画笔
    QPen pen;
    pen.setWidth(6);
    pen.setColor(RGB(60,60,60));
    p.setPen(pen);//把画笔交给画家

   // p.drawRect(startX,startY,Cwidth,Cheight);//画出游戏边界

    for(int i=-1;i<=W;i++){//画出游戏边界
        p.drawPixmap(i*Bsize+startX,-1*Bsize+startY,Bsize,Bsize,QPixmap("../image/shitou.png"));
        p.drawPixmap(i*Bsize+startX,21*Bsize+startY,Bsize,Bsize,QPixmap("../image/shitou.png"));
    }
    for(int j=0;j<H;j++){//画出游戏边界
        p.drawPixmap(-1*Bsize+startX,j*Bsize+startY,Bsize,Bsize,QPixmap("../image/shitou.png"));
        p.drawPixmap(25*Bsize+startX,j*Bsize+startY,Bsize,Bsize,QPixmap("../image/shitou.png"));
    }

    if(Sround == 1){//画出第一关障碍物
        for(int i=4;i<=8;i++){
            p.drawPixmap(6*Bsize+startX,i*Bsize+startY,Bsize,Bsize,QPixmap("../image/wall.png"));
            p.drawPixmap(18*Bsize+startX,i*Bsize+startY,Bsize,Bsize,QPixmap("../image/wall.png"));
        }
        for(int i=11;i<=15;i++){
            p.drawPixmap(6*Bsize+startX,i*Bsize+startY,Bsize,Bsize,QPixmap("../image/wall.png"));
            p.drawPixmap(18*Bsize+startX,i*Bsize+startY,Bsize,Bsize,QPixmap("../image/wall.png"));
        }
        for(int i=7;i<=10;i++){
            p.drawPixmap(i*Bsize+startX,4*Bsize+startY,Bsize,Bsize,QPixmap("../image/wall.png"));
            p.drawPixmap(i*Bsize+startX,15*Bsize+startY,Bsize,Bsize,QPixmap("../image/wall.png"));
        }
        for(int i=14;i<=17;i++){
            p.drawPixmap(i*Bsize+startX,4*Bsize+startY,Bsize,Bsize,QPixmap("../image/wall.png"));
            p.drawPixmap(i*Bsize+startX,15*Bsize+startY,Bsize,Bsize,QPixmap("../image/wall.png"));
        }
    }

    /*pen.setWidth(1);//重新设置画笔宽度
    p.setPen(pen);//把画笔交给画家
    for(int i=startX,j=startY;j<startY+Cheight;j+=Bsize){//画格子辅助线
       p.drawLine(i,j,i+Cwidth,j);
    }
    for(int i=startX,j=startY;i<startX+Cwidth;i+=Bsize){
        p.drawLine(i,j,i,j+Cheight);
    }*/

    strScore = QString::number(score);//刷新分数
    ui->label->setText(strScore);

    if(appleX%2==0)//画苹果
        p.drawPixmap(posAppleX,posAppleY-2,appleW,appleH,QPixmap("../image/apple1.png"));
    else//画月饼
        p.drawPixmap(posAppleX,posAppleY,Bsize,Bsize,QPixmap("../image/shead.png"));
    if(isEated){
        createApple();//随机产生苹果位置
        update();
    }

    for(std::vector<Point>::iterator it=s.snakeBody.begin();it!=s.snakeBody.end();it++){//遍历蛇身,画蛇
        Smap[(*it).x()][(*it).y()] = 1;
        if(it == s.snakeBody.end()-1){//vector数组尾作为蛇头,红点
            headX = (*it).x();//蛇头坐标
            headY = (*it).y();//蛇头坐标
            int posHeadX = headX*Bsize+startX;//蛇头像素位置
            int posHeadY = headY*Bsize+startY;//蛇头像素位置
            if(direction == s_up){
                p.drawPixmap(posHeadX-10,posHeadY-15,2*Bsize,2*Bsize,QPixmap("../image/shead_up.png"));
            }else if(direction == s_down){
                p.drawPixmap(posHeadX-10,posHeadY-5,2*Bsize,2*Bsize,QPixmap("../image/shead_down.png"));
            }else if(direction == s_left){
                p.drawPixmap(posHeadX-15,posHeadY-10,2*Bsize,2*Bsize,QPixmap("../image/shead_left.png"));
            }else if(direction == s_right){
                p.drawPixmap(posHeadX-5,posHeadY-10,2*Bsize,2*Bsize,QPixmap("../image/shead_right.png"));
            }
        }else{//蛇身黑点
            int xx=(*it).x()*Bsize+startX;
            int yy=(*it).y()*Bsize+startY;
            p.drawPixmap(xx,yy,Bsize,Bsize,QPixmap("../image/snake1.png"));
        }
        if (headX == appleX && headY == appleY){//吃到了!
            isEated = true;
        }
    }


    p.end();
}


void init() {//每次游戏开始的数据初始化
    for (int i = 0; i < W; i++)
        for (int j = 0; j < H; j++)
                Smap[i][j] = 0;
    s.snakeBody.clear();
    direction = s_right;
    crashed = false;
    gameStart = false;
    score = 0;
    gameStartClickCount = 0;
    snakeInit();//初始化蛇身
    setRound();//设置第几关
    createApple();//随机产生苹果位置
}
void createApple() {//随机产生苹果位置
    if (isEated){
        player_eat->play();//吃到音效
        score += 10;
    }
    while (true) {
        srand((int)time(NULL));
        int row = rand() % 21;//产生0~24的随机数
        int col = rand() % 25;
        if (Smap[col][row] == 0) {
            //Smap[row][col] = 1;
            appleX = col;
            appleY = row;
            posAppleX = appleX*Bsize+startX;//像素位置与坐标转换
            posAppleY = appleY*Bsize+startY;
            break;
        }
    }
    isEated = false;//刚产生的苹果吃不到!
}

向上走为例:

void goUp() {    //五种情况①撞墙;②撞苹果;③撞自己;④都不撞;⑤撞障碍物
    direction = s_up;
    if (!((headX == appleX) && (headY - 1 == appleY)) && (headY - 1 >= 0) && (Smap[headX][headY - 1] == 0)) {//都不撞(头插一点,尾删一点)
        s.snakeBody.push_back(Point(headX, headY - 1));//头插一点
        //Smap[headX][headY - 1] = 1;
        std::vector<Point>::iterator it = s.snakeBody.begin();//找到第一个点(尾部)
        Smap[(*it).x()][(*it).y()] = 0;
        s.snakeBody.erase(it);//尾删一点
    }
    else if ((headX == appleX) && (headY - 1 == appleY)) {//撞苹果,吃到(头插一点,尾不删)
        s.snakeBody.push_back(Point(headX, headY - 1));//头插一点
        //Smap[headX][headY - 1] = 1;
        isEated = true;
    }else if(Smap[headX][headY - 1]==1){
        crashed = true;
        return;
    }
    else if (headY - 1 < 0) {//不是撞苹果->撞墙:GameOver
        crashed = true;
        return;
    }
    else{//撞自己
        crashed = true;
        return;
    }
}

运行效果图:

基于QT5.4的C++贪吃蛇小游戏

基于QT5.4的C++贪吃蛇小游戏

完整代码及图片音频下载地址: https://download.csdn.net/download/qq_35294564/10699690


以上所述就是小编给大家介绍的《基于QT5.4的C++贪吃蛇小游戏》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

家事的撫慰(下冊)

家事的撫慰(下冊)

Cheryl Mendelson / 甘錫安 / 大家出版社 / 2014-1-28 / NT$520

家事界暢銷參考書籍 各大媒體一致盛讚 亞馬遜讀者四星半高度評鑑 誠品、博客來、香港誠品 三選書 家務界經典暢銷書│各大媒體一致盛讚│讀者四星半高度評鑑 「這個世代最重要的家事著作!」──《大西洋月刊》 恢復家務打理者應有的地位,賦予應有的尊嚴和價值。 以生理的勞動、心力的投入,以及正確的持家知識,換得情感上的溫暖與安全。 .家裡空氣有異味,用香味來......一起来看看 《家事的撫慰(下冊)》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具