贪吃蛇的实现

该文详细介绍了如何控制贪吃蛇的方向,通过增加和删除棋子来移动,并处理穿墙效果。同时,文章讲解了如何生成和检查奖励,以及判断吃掉奖励的条件。当蛇头与蛇身或奖励重合时,游戏会相应地进行下一步操作,如结束或增殖。代码基于Qt库中的QRectF对象来表示蛇和奖励的位置。
摘要由CSDN通过智能技术生成

目录

游戏功能

游戏界面

控制方向

增添奖励

吃掉奖励

游戏结束

添加背景等


游戏功能

  1. 设计了一个贪吃蛇游戏,游戏分为两个模式,一个模式为娱乐模式,玩家通过吃铲子累计积分;另一个模式为生存模式,玩家通过吃铲子减缓自己的速度(当速度达到一定的程度,直接失败)。
  2. 玩家在娱乐模式中的积分记录被保存在txt文件中,作为历史记录。
  3. 该贪吃蛇游戏分为两个界面,一个界面为开始/结束界面,另一个界面为游戏界面。
  4. 两个界面可以通过BACK/退出切换。

游戏界面

 

 

控制方向

首先控制贪吃蛇方向,通过增加第一个棋子和删除最后一个棋子的方式。由于贪吃蛇有穿墙的功能,所以要特判如果当企鹅在窗口时,它将在对面窗口的对应位置出现。

void Widget::addTOP(){
    QPointF leftTop;
    QPointF rightButtom;

    if(snake[0].y()-nodeHeight<0){
        leftTop=QPointF(snake[0].x(),this->height()-nodeHeight);
        rightButtom=QPointF(snake[0].x()+nodeWidth,this->height());
    }
    else{
        leftTop=QPointF(snake[0].x(),snake[0].y()-nodeHeight);
        rightButtom=snake[0].topRight();
    }

    snake.insert(0,QRectF(leftTop,rightButtom));
}
void Widget::addDown(){
    QPointF leftTop;
    QPointF rightButtom;

    if(snake[0].y()+2*nodeHeight>this->height()){
        leftTop=QPointF(snake[0].x(),0);
        rightButtom=QPointF(snake[0].x()+nodeWidth,nodeHeight);
    }
    else{
        leftTop=snake[0].bottomLeft();
        rightButtom=snake[0].bottomRight()+QPointF(0,nodeHeight);
    }

    snake.insert(0,QRectF(leftTop,rightButtom));
}
void Widget::addLeft(){
    QPointF leftTop;
    QPointF rightButtom;

    if(snake[0].x()-nodeWidth<0){
        leftTop=QPointF(this->width()-nodeWidth,snake[0].y());
        rightButtom=leftTop+QPointF(nodeWidth,nodeHeight);
    }
    else{
        leftTop=snake[0].topLeft()-QPointF(nodeWidth,0);
        rightButtom=leftTop+QPointF(nodeWidth,nodeHeight);
    }

    snake.insert(0,QRectF(leftTop,rightButtom));
}
void Widget::addRight(){
    QPointF leftTop;
    QPointF rightButtom;

    if(snake[0].x()+2*nodeWidth>this->width()){
        leftTop=QPointF(0,snake[0].y());
        rightButtom=leftTop+QPointF(nodeWidth,nodeHeight);
    }
    else{
        leftTop=snake[0].topRight();
        rightButtom=leftTop+QPointF(nodeWidth,nodeHeight);
    }

    snake.insert(0,QRectF(leftTop,rightButtom));
}

增添奖励

由于奖励是随机生成的,可能与蛇身重合,所以要判断生成的奖励是否与蛇身重合,如果重合则删去,反之则是生成成功。

void Widget::addNewReward(){
    rewardNode=new QRectF;
    bool a;
    do{
        a=true;
        *rewardNode=QRectF(
                    qrand()%(this->width()/80)*80,
                    qrand()%(this->height()/80)*80,
                    nodeWidth,
                    nodeHeight);
        for(int i=0;i<snake.length();i++){
            if(snake[i]==*rewardNode)a=false;
        }
    }while(!a);
}

吃掉奖励

当蛇头与奖励的坐标重合时,则被认为是成功吃掉奖励,返回是true。

bool Widget::rewardEat(){
    if(snake[0]==*rewardNode)return true;
    else return false;
}

游戏结束

当蛇头与身体的某一个部分重合时,则被认为游戏结束,返回true。

bool Widget::checkContact(){
    for(int i=0;i<snake.length();i++){
        for(int j=i+1;j<snake.length();j++){
            if(snake[i]==snake[j]){
                return true;
            }
        }
    }

    return false;
}

添加背景等

通过画笔的形式为游戏添加背景,音乐等,增添游戏效果。

void Widget::paintEvent(QPaintEvent *event){
    QPainter painter(this);
    QPen pen;
    QBrush brush;
    //背景图片
    QPixmap pix;
    pix.load("C:/Qt/tanchSnake/tanchSnake/cxk.png");
    //图片大小
    painter.drawPixmap(0,0,800,640,pix);
     //画奖品
    QPixmap c;
    c.load("C:/Qt/tanchSnake/tanchSnake/reward.png");
    painter.drawPixmap(rewardNode->x(),rewardNode->y(),nodeWidth,nodeHeight,c);
    //画蛇
       QPixmap a;
       a.load("C:/Qt/tanchSnake/tanchSnake/head.png");
       QPixmap b;
       b.load("C:/Qt/tanchSnake/tanchSnake/body.png");
       painter.drawPixmap(snake[0].x(),snake[0].y(),nodeWidth,nodeHeight,a);
    for(int i=1;i<snake.length();i++){
        painter.drawPixmap(snake[i].x(),snake[i].y(),nodeWidth,nodeHeight,b);
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值