QT 贪食蛇

4 篇文章 0 订阅

贪吃蛇:
属性:
食物 QLabel*
蛇 QList<QLabel*>
方向 枚举
步长 int
定时器 定时器事件处理(定时处理)
最大长度 int

功能:
控制蛇的方向(键盘事件处理函数)
控制蛇的移动 (槽函数)
产生新的食物

#include
#include
#include
#include
enum Direction{
D_Up,D_DOWN, D_LEFT, D_RIGHT
};
class SnakeGame : public QDialog{
Q_OBJECT
private:
QLabel* food;
QList<QLabel*> snake;
int footLen;//步长
QTimer* timer;
Direction dire;
int maxLen;// 最大长度

public:
SnakeGame();
~SnakeGame();

public:
void keyPressEvent(QKeyEvent* e);
//蛇根据方向移动,调用一次移动一个步长
public slots:
void snakeMove();
public:
// 产生食物
QLabel* GetFood();

};

SnakeGame::SnakeGame()
{
this->resize(800,700);
footLen=40;//像素

snake.push_back(getFood());
food=getFood();

timer=new QTimer();
timer->SetInterval(200);
timer->start();
dire = D_RIGHT;
maxLen=5;

connect(timer,SIGNAL(timeout()), this, SLOT(snakeMove()));

}

SnakeGame::~SnakeGame()
{
}

void SnakeGame::keyPressEvent(QKeyEvent* e)
{
switch(e->key())
{
case Qt::Key_Up:
dire=D_UP;
break;
case Qt::Key_Down:
dire=D_DOWN;
break;
case Qt::Key_Left:
dire=D_LEFT;
break;
case Qt::Key_Right:
dire=D_RIGHT;
break;
}

}

//蛇根据方向移动,调用一次移动一个步长
void SnakeGame::snakeMove()
{
// 蛇头原位置
int sx=snake[0]->x();
int sy=snake[0]->y();

// 当蛇达到最大长度的时候
if(snake.size()>=maxLen)
{
QMessageBox msg;
msg.setText(“snake is maxlen, Game Over?”);
msg.setStandardButtons(QMessageBox::Yes|QMessage::No);
if(QMessageBox::Yes == msg.exec()){
this->close();
}else{
maxLen=2*maxLen+1;
}

// 撞墙
if(sx<0 || sy<0 || sx>this->width() || sy>this->height())
{
QMessageBox msg;
msg.setText(“game over”);
msg.exec();
this->close();
}

// 当食物和蛇头重合时就吃掉食物
if(sx == food->x() && sy == food->y())
{
snake.push_back(food);
//
food=getFood();
}
// 食物跟着蛇头跑,后一个元素移动到前一个元素位置
for(int i=snake.size()-1; i>0; i–)
{
snake[i]->move(snake[i-1]->x(), snake[i-1]->y());
}

switch(dire)
{
case D_UP:
sy=sy-footLen;
break;
case D_DOWN:
sy=sy+footLen;
break;
case D_LEFT:
sx=sx-footLen;
break;
case D_RIGHT:
sx=sx+footLen;
break;

}
// 蛇头移到新坐标
snake[0].move(sx, sy);

}

// 产生食物
#include
#include
QLabel* SnakeGame::GetFood()
{
food = new QLabel(this);
food->resize(footLen,footLen);
food->setAutoFillBackground(true);
// 随机颜色
food->setPallete(QPallete(QColor(qrand()%256,qrand()%56,qrand()%256)));
food->setFrameShape(QFrame::Box);
// 1 随机位置 2 界面范围以内 3 foolen的整数倍
int height=this->height()-footLen;// 防止避免出界面
int width= this->width()-footLen;
food->move((qrand()%width)/footLenfootLen,(qrand()%height)/footLenfootLen);
food->show();
return food;
}

#include "snakegame.h”
#include
int main(int argc, char** argv)
{
QApplication app(argc,argv);
SnakeGame sg;
sg.show();
return app.exec();
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值