长沙网站seo技巧,如何做营销型单页网站,wordpress菜单显示用户信息,做球形全景的网站贪吃蛇Greedy Snake
1分析
首先这是一个贪吃蛇界面#xff0c;由一个长方形边框和一只贪吃蛇组成 默认开局时#xff0c;贪吃蛇身体只有3个小方块#xff0c;使用画笔画出
1.1如何移动
对于蛇的移动#xff0c;有2种方法
在一定时间范围内(定时器)#xff0c;未对游戏…贪吃蛇Greedy Snake
1分析
首先这是一个贪吃蛇界面由一个长方形边框和一只贪吃蛇组成 默认开局时贪吃蛇身体只有3个小方块使用画笔画出
1.1如何移动
对于蛇的移动有2种方法
在一定时间范围内(定时器)未对游戏做出操作前后左右移动则整个身体向面朝方向移动一格在一定时间范围内(定时器)未对游戏做出操作前后左右移动则身体最前面加上一格方块身体最后面减去一个方块
这里使用第2种方法
如图有4个坐标AC分别是原蛇的头部方格的两个坐标
则新产生的方格的B点为(x1y1-方格高度)D点(x3y3-方格高度) 注意
向某个方向增加不能无限增加下去当触碰到顶部时我们可以设置条件
死亡穿过从另一个方向开始
这里我们采用第2种方式
1.2向上
如图此时BD点已经超过x轴即高度为0的位置 因此我们可以判断当蛇头部的方格A/C的高度 - 1个方格的高度 0 时则从底部开始进入 移动前x3x1蛇宽度y3y1 移动后x2x1y2窗口高度-蛇宽度x4x2蛇宽度y4y2
1.3向下
同理向下走只要最下面增加最上面减少即可 移动前x4x2蛇宽度y2y4 移动后x1x2y10x3x1蛇宽度y3蛇高度
1.4向左 移动前x3x2蛇宽y3y2蛇高 移动后x1x2-蛇宽y1y2x4x2y4y3 穿越
x2窗口宽度-蛇宽y2y1x3窗口宽度y3y4 1.5向右 移动前x4x1蛇宽y4y1蛇高 移动后x2x1蛇宽y2y1x3x4蛇宽y3y4 穿越
x20y2y1x3蛇宽y3y4 2如何成长
在界面的不同地方会默认刷新出一个球蛇吃了这个球身体就会增加一格同时球消失刷新出现在其他地方 判断球是否被吃掉即判断蛇的身体是否与球重合如果重合增加身体1同时刷新球出现的位置
3代码
widget.h
#ifndef WIDGET_H
#define WIDGET_H#define OUTTIME 100 //超时时间
#define SNAKE_WIDTH 20 //蛇的一个方格宽度
#define SNAKE_HEIGHT 20 //蛇的一个方格高度
#include QWidget
#includeQKeyEvent
#includeQDebug
#includeQTimer
#includeQPixmap
#includeQPainter
#includerandom
#includeQTime
#include QRandomGenerator/*0.创建蛇要求可以实现前面删除后面增加可以用LIST链表1.按键处理2.使用定时器2.1关联信号槽2.2启动定时器2.3实现对应的超时处理(timeOut)函数3.渲染图像
*/QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
//定义方向
enum Direction
{LEFT,RIGHT,UP,DOWN
};
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent nullptr);~Widget();
protected://按键处理void keyPressEvent(QKeyEvent *event);//添加头部void addTOP();void addBUTOM();void addLEFT();void addRIGHT();//绘制界面void paintEvent(QPaintEvent *event);//删除尾部void deleLAST();//初始化食物void initFood();//判断是否碰撞bool isIntersect();
private:Ui::Widget *ui;int moveFlag UP; //方向标志bool gameStatu false;//游戏状态//bool isIntersect false;//定时器QTimer *timer;//事物QRectF food;//创建蛇QListQRectF snake;
protected slots:void timeOut();//超时函数
};
#endif // WIDGET_Hwidget.cpp
#include widget.h
#include ui_widget.hWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);this-resize(450,300);//使用定时器timer new QTimer();//发出信号//连接信号connect(timer,SIGNAL(timeout()),this,SLOT(timeOut()));//初始化蛇QRectF rect(this-width()/2,this-height()/2,SNAKE_WIDTH,SNAKE_HEIGHT);snake.append(rect); //蛇身1addTOP(); //蛇身1addTOP();//初始化食物initFood();
}Widget::~Widget()
{delete ui;
}//按键绑定控制方向
void Widget::keyPressEvent(QKeyEvent *event)
{switch(event-key()){case Qt::Key_Up:if(moveFlag ! DOWN){moveFlag UP;}break;case Qt::Key_Down:if(moveFlag ! UP){moveFlag DOWN;}break;case Qt::Key_Left:if(moveFlag ! RIGHT){moveFlag LEFT;}break;case Qt::Key_Right:if(moveFlag ! LEFT){moveFlag RIGHT;}break;case Qt::Key_Space:if(!gameStatu){gameStatu true;//启动定时器timer-start(OUTTIME);}else{gameStatu false;timer-stop();}break;default:return;break;}
}//顶部增加
void Widget::addTOP()
{QPointF leftTop; //左上点QPointF rightBotom; //右下点if(snake[0].y() - SNAKE_HEIGHT 0 ) //如果超过顶部{leftTop QPoint(snake[0].x(),this-height() - SNAKE_HEIGHT);rightBotom QPoint(snake[0].x() SNAKE_WIDTH,this-height());}else //未超过顶部{leftTop QPointF(snake[0].x(),snake[0].y() - SNAKE_HEIGHT);rightBotom snake[0].topRight();}snake.insert(0,QRectF(leftTop,rightBotom));
}void Widget::addBUTOM()
{QPointF leftTop;QPointF rightBotom;if(snake[0].y() 2*SNAKE_HEIGHT this-height() ) //如果超过底部{leftTop QPointF(snake[0].topLeft().x(),0);// 原x 0rightBotom QPointF(snake[0].bottomRight().x(),SNAKE_HEIGHT);// 右下x蛇宽 蛇高}else //未超过底部{leftTop snake[0].bottomLeft();rightBotom snake[0].bottomRight()QPointF(0,SNAKE_HEIGHT);}snake.insert(0,QRectF(leftTop,rightBotom));
}void Widget::addLEFT()
{QPointF leftTop;QPointF rightBotom;if(snake[0].x()-SNAKE_WIDTH 0 ) //超过边缘{leftTop QPointF(this-width()-SNAKE_WIDTH,snake[0].topLeft().y());// 窗口宽-蛇宽 左上原y不变rightBotom QPointF(this-width(),snake[0].bottomRight().y());// 窗口宽 右下原y不变}else //未超过{leftTop QPointF(snake[0].topLeft().x()-SNAKE_WIDTH,snake[0].topLeft().y());// 左上x-蛇宽 左上原y不变rightBotom QPointF(snake[0].bottomRight().x()-SNAKE_WIDTH,snake[0].bottomRight().y());// 右下x-蛇宽 右下原y不变}snake.insert(0,QRectF(leftTop,rightBotom));
}void Widget::addRIGHT()
{QPointF leftTop;QPointF rightBotom;if(snake[0].x()SNAKE_WIDTH*2 this-width() ) //超过边缘{leftTop QPointF(0,snake[0].topLeft().y());// 0 左上原y不变rightBotom QPointF(SNAKE_WIDTH,snake[0].bottomRight().y());// 蛇宽 右下原y不变}else //未超过边缘{leftTop QPointF(snake[0].topLeft().x()SNAKE_WIDTH,snake[0].topLeft().y());// 左上x-蛇宽 左上原y不变rightBotom QPointF(snake[0].bottomRight().x()SNAKE_WIDTH,snake[0].bottomRight().y());// 右下x-蛇宽 右下原y不变}snake.insert(0,QRectF(leftTop,rightBotom));
}//绘制界面
void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPen pen;//画笔QBrush brush;//画刷//加载背景图片QPixmap pix;pix.load(:/background/bg_1.jpg);painter.drawPixmap(0,0,pix.width(),pix.height(),pix);//绘制蛇pen.setColor(Qt::black); //设定画笔颜色brush.setColor(Qt::darkMagenta);//画刷颜色brush.setStyle(Qt::SolidPattern);//画刷风格painter.setPen(pen); //画家配置画笔painter.setBrush(brush);//画家配置画刷for(int i0;isnake.length();i){painter.drawRect(snake[i]);//画家进行绘画}//绘制食物brush.setColor(Qt::yellow);//画刷颜色brush.setStyle(Qt::SolidPattern);//画刷风格painter.setPen(pen); //画家配置画笔painter.setBrush(brush);//画家配置画刷painter.drawEllipse(food);//绘制结束面板if(isIntersect()){QFont font(微软雅黑,30,QFont::ExtraLight,false);painter.setFont(font);painter.drawText(this-width()/2-120,this-height()/2,QString(GAME OVER!));timer-stop();}
}//去尾
void Widget::deleLAST()
{snake.removeLast();
}// 初始化食物
void Widget::initFood()
{ //QRandomGenerator::global()-generate()随机生成数字food QRectF(QRandomGenerator::global()-generate()%(this-width()/20)*20,QRandomGenerator::global()-generate()%(this-height()/20)*20,SNAKE_WIDTH,SNAKE_HEIGHT);
}//是否碰撞
bool Widget::isIntersect()
{for(int i1;isnake.length();i){if(snake[0] snake[i]){return true;}}return false;
}//超时函数
void Widget::timeOut()
{int count 1;if(snake[0].intersects(food)){count;//重新初始化食物即令其刷新位置initFood();}while(count--){switch (moveFlag){case UP:addTOP();break;case DOWN:addBUTOM();break;case LEFT:addLEFT();break;case RIGHT:addRIGHT();break;default:return;break;}}deleLAST();update(); //重新绘制即更新图像
}4效果
//重新初始化食物即令其刷新位置 initFood(); } while(count–) { switch (moveFlag) { case UP: addTOP(); break; case DOWN: addBUTOM(); break; case LEFT: addLEFT(); break; case RIGHT: addRIGHT(); break; default: return; break; } } deleLAST(); update(); //重新绘制即更新图像 } ## 4效果