准备素材
添加数据成员
enum Direct{Left,Right,Up,Down};
QList snake;//贪吃蛇本体
int snakeNodeWidth = 20;
int snakeNodeHeight = 20;
QTimer *timer;
int time = 150;
int moveFlage = Up;
bool gameStart = false;
QRectF rewardNode;
添加方法的声明
protected:
void paintEvent(QPaintEvent *);
void keyPressEvent(QKeyEvent *);
void addTop();
void addDown();
void addLeft();
void addRight();
void deleteLast();
bool checkContact();
void addNewReward();
添加槽函数
protected slots:
void timeOut();
构造函数
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
resize(600, 368);
snake.append(QRectF(300,180,snakeNodeWidth,snakeNodeHeight));
addTop();
addTop();
timer = new QTimer;
connect(timer, SIGNAL(timeout()),this,SLOT(timeOut()));
addNewReward();
}
按键时间处理
#include
void Widget::keyPressEvent(QKeyEvent *event)
{
switch(event->key()){
case Qt::Key_Up:
if(moveFlage != Down){
moveFlage = Up;
}
break;
case Qt::Key_Down:
if(moveFlage != Up){
moveFlage = Down;
}
break;
case Qt::Key_Right:
if(moveFlage != Left){
moveFlage = Right;
}
break;
case Qt::Key_Left:
if(moveFlage != Right){
moveFlage = Left;
}
break;
case Qt::Key_Space:
if(!gameStart){
timer->start(time);
gameStart = true;
}else {
timer->stop();
gameStart = false;
}
break;
default:
break;
}
}
超时事件处理
void Widget::timeOut()
{
int count = 1;
if (snake.at(0).intersects(rewardNode)) {
addNewReward();
count++;
}
while (count--) {
switch (moveFlage) {
case Up:
addTop();
break;
case Down:
addDown();
break;
case Right:
addRight();
break;
case Left:
addLeft();
break;
default:
break;
}
}
deleteLast();
update();
}
添加新方块
void Widget::addNewReward() {
rewardNode = QRectF(
qrand()%(this->width()/20)*20,
qrand()%(this->height()/20)*20,
snakeNodeWidth,
snakeNodeWidth);
}
各个方向的运动实现
//向上移动
void Widget::addTop()
{
QPointF leftTop;
QPointF rightBotom;
if(snake.at(0).y()-snakeNodeHeight < 0){
leftTop = QPointF(
snake.at(0).x(), //左上角x坐标
this->height()-snakeNodeHeight); //左上角y坐标
rightBotom = QPointF(
snake.at(0).x()+snakeNodeWidth,
this->height());
}else{
leftTop = QPointF(snake.at(0).x(),
snake.at(0).y() - snakeNodeHeight);
rightBotom = snake.at(0).topRight();
}
snake.insert(0, QRectF(leftTop, rightBotom));
}
//向下移动
void Widget::addDown()
{
QPointF leftTop;
QPointF rightBotom;
if(snake.at(0).y()+snakeNodeHeight*2 > this->height()){
leftTop = QPointF(snake.at(0).x(), 0);
rightBotom = QPointF(snake.at(0).x()+snakeNodeWidth, snakeNodeHeight);
}else{
leftTop = snake.at(0).bottomLeft();
rightBotom = snake.at(0).bottomRight() + QPointF(0, snakeNodeHeight);
}
snake.insert(0, QRectF(leftTop, rightBotom));
}
//向左移动
void Widget::addLeft()
{
QPointF leftTop;
QPointF rightBotom;
if(snake.at(0).x()-snakeNodeWidth < 0){
leftTop = QPointF(this->width() -snakeNodeWidth, snake[0].y());
}else{
leftTop = snake[0].topLeft() - QPointF(snakeNodeWidth, 0);
}
rightBotom = leftTop + QPointF(snakeNodeWidth, snakeNodeHeight);
snake.insert(0, QRectF(leftTop, rightBotom));
}
//向右移动
void Widget::addRight()
{
QPointF leftTop;
QPointF rightBotom;
if(snake.at(0).x()+snakeNodeWidth*2 > this->width()){
leftTop = QPointF(0, snake[0].y());
}else{
leftTop = snake[0].topRight();
}
rightBotom = leftTop + QPointF(snakeNodeWidth, snakeNodeHeight);
snake.insert(0, QRectF(leftTop, rightBotom));
绘制贪食蛇
#include
#include
#include
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen pen; //画笔,用于绘制轮廓
QBrush brush; //画刷,用于填充
QPixmap pix;
pix.load("D:/tmp/snake.jpg");
painter.drawPixmap(0,0, 600, 368,pix);
//反锯齿
painter.setRenderHint(QPainter::Antialiasing);
pen.setColor(Qt::black);
brush.setColor(Qt::darkMagenta);
for(int i=0; i
失败检测
//判断蛇头是否和蛇身相撞, 以及蛇身和蛇身相撞
bool Widget::checkContact()
{
for(int i=0; i
游戏结束效果
今天的分享就到这里了,大家要好好学C语言/C++哟~
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
C语言C++编程学习交流圈子,QQ群:763855696【点击进入】
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习视频分享: