当前位置: 首页 > news >正文

做论坛网站4g空间够不够用汕头seo推广优化

做论坛网站4g空间够不够用,汕头seo推广优化,村建站全称,集团网站源码文章目录 一、项目要求 二、需求分析 三、实现效果 四、代码 一、项目要求 【1】主要实现#xff1a;游戏界面存在一条蛇#x1f40d;#xff0c;使用键盘wsad或者↑↓←→键盘可以控制蛇的行走方向。同时界面中会随机出现食物#xff0c;蛇可以吃食物#xff0c;然后…文章目录 一、项目要求 二、需求分析 三、实现效果 四、代码 一、项目要求 【1】主要实现游戏界面存在一条蛇使用键盘wsad或者↑↓←→键盘可以控制蛇的行走方向。同时界面中会随机出现食物蛇可以吃食物然后蛇的身体就会变长。吃完一个食物之后才会刷新另外一个食物。 【2】游戏结束蛇碰壁。 【3】玩家分数由蛇的存活时间以及长度综合计算。time为蛇存活的秒数lent-len0表示蛇增加的节点数量。同时玩家分数需要实时显示。 【4】重新开始点击相应的按钮。 【5】加速模式双击键盘可以加速蛇的移动。例如按两下w键蛇的速度变为原来的2倍。 【6】不同食物食物有多种类别不同的食物会导致蛇变长的长度不同。 二、需求分析 【1】针对主要实现 创建蛇(Snake)、食物(Food)和主要窗口(Widget)类。Snake类创建方法来实现蛇的移动头插一个尾删一个、蛇的方向检测根据键盘值、蛇是否死亡是否碰壁以及在窗口中绘制蛇通过传入painter。Food类创建方法来实现食物的坐标生成和类型生成利用随机数、在窗口中绘制食物。用type整型变量来标志食物类型当type1时蛇吃掉后加1节当type2时蛇吃掉后加2节以此类推。Widget类创建方法来实现整体的按键检测、绘制图像、计算玩家分数。为了让蛇不断移动使用定时器QTimer来周期性触发槽函数在槽函数中执行蛇吃食物、食物更新、画面更新等操作。按键控制①↑↓←→键盘控制蛇的移动②空格键控制游戏的开始/暂停控制定时器开始/停止。综合不同类的绘图将主要逻辑的Widget类中实例化的painter对象作为形参传入Snake和Food类中在它们各自的方法中进行各自的绘图操作。 【2】针对重新开始 在ui设计器中添加QPushButton并添加相应的槽函数。槽函数中将分数、暂停标志、时间计数器等属性恢复初始值。槽函数中将已有的蛇、食物对象delete再创建新的蛇、食物对象。槽函数中需要重新聚焦于gameWidget否则点击按钮后需要再点击gameWidget才能检测键盘的输入。重新聚焦调用ui-gameWidget-setFocus(); 【3】针对不同速度 在Snake类中创建属性speed当speed为1时表示每次触发定时器槽函数执行蛇前进1格当speed为2时表示每次触发定时器槽函数执行蛇前进2格。初始化speed为1当用户手动按下两下↑后会加速直到用户改变蛇的方向。 【4】针对不同食物 在Food类中创建属性type当type为1时表示食物类型为1蛇吃后增加1节当type为2时表示食物类型为2蛇吃后增加2节当type为3时表示食物类型为3蛇吃后增加3节。类型1设定为绿色的圆形。类型2设定为深蓝色的椭圆。类型3设定为浅蓝色的方形。 三、实现效果 四、代码 【1】food.h: #ifndef FOOD_H #define FOOD_H#include QWidget #include QPainter #include QRandomGenerator/************************************************************ 类名 Food* 摘要 食物类* 作者 柯同学* 注意 三种食物类型type值为几就加几节蛇身*********************************************************/ class Food : public QWidget {Q_OBJECT public:explicit Food(QWidget *parent nullptr);int getX(); //返回食物横坐标int getY(); //返回食物纵坐标int getRadius(); //返回食物半径int getType(); //返回食物类型void generateFood();//生成食物的坐标和类型void paintFood(QPainter painter);//绘制食物private:int foodX; //食物横坐标int foodY; //食物纵坐标int radius; //食物半径int type; //食物类型1类型为增加1节2类型增加2节3类型增加3节 };#endif // FOOD_H【2】food.cpp: #include food.h/************************************************************ 函数名Food* 功 能食物类的构造函数* 参 数parent父对象* 返回值无*********************************************************/ Food::Food(QWidget *parent): QWidget(parent), radius(15) {//初始的食物也随机generateFood(); }/************************************************************ 函数名getX* 功 能返回食物的横坐标* 参 数无* 返回值食物的横坐标*********************************************************/ int Food::getX() {return foodX; }/************************************************************ 函数名getY* 功 能返回食物的纵坐标* 参 数无* 返回值食物的纵坐标*********************************************************/ int Food::getY() {return foodY; }/************************************************************ 函数名getRadius* 功 能返回食物的半径* 参 数无* 返回值食物的半径*********************************************************/ int Food::getRadius() {return radius; }/************************************************************ 函数名getType* 功 能返回食物的类型* 参 数无* 返回值食物的类型*********************************************************/ int Food::getType() {return type; }/************************************************************ 函数名generateFood* 功 能随机生成食物的坐标、类型* 参 数无* 返回值无*********************************************************/ void Food::generateFood() {//随机生成坐标距边界radius降低反应难度foodX QRandomGenerator::global()-bounded(10 radius, 580 - radius * 2);foodY QRandomGenerator::global()-bounded(20 radius, 570 - radius * 2);//随机生成类型[1,4)type QRandomGenerator::global()-bounded(1, 4); }/************************************************************ 函数名paintFood* 功 能根据食物类型的不同绘制不同的食物类型。* 参 数painter---画家对象* 返回值无* 说 明type1---类型1绿色的圆形* type2---类型2深蓝色的椭圆形* type3---类型3淡蓝色的矩形*********************************************************/ void Food::paintFood(QPainter painter) {QPen pen;QBrush brush;//根据type不同绘制不同的食物switch (this-type){case 1:pen.setColor(QColor(43, 220, 112));brush.setColor(QColor(43, 220, 112));brush.setStyle(Qt::SolidPattern);painter.setPen(pen);painter.setBrush(brush);painter.drawEllipse(QRect(foodX, foodY, radius, radius));break;case 2:pen.setColor(QColor(0, 62, 146));brush.setColor(QColor(0, 62, 146));brush.setStyle(Qt::SolidPattern);painter.setPen(pen);painter.setBrush(brush);painter.drawEllipse(QRect(foodX, foodY, radius*2, radius));break;case 3:pen.setColor(QColor(29, 130, 154));brush.setColor(QColor(29, 130, 154));brush.setStyle(Qt::SolidPattern);painter.setPen(pen);painter.setBrush(brush);painter.drawRect(QRect(foodX, foodY, radius, radius));break;} }【3】snake.h: #ifndef SNAKE_H #define SNAKE_H#include QWidget #include QEvent #include QPaintEvent #include QPainter//枚举蛇前进的方向 enum Direct{MOVE_UP,MOVE_DOWN,MOVE_LEFT,MOVE_RIGHT };/************************************************************ 类名 Snake* 摘要 蛇类* 作者 柯同学* 注意 有两种速度speed为1就每次timeout前进1格以此类推。* 在原有方向的基础上再次按原方向键能切换到二倍速模式* 比如蛇在往上再次按up键就两倍速直到切换方向。*********************************************************/ class Snake : public QWidget {Q_OBJECT public:explicit Snake(QWidget *parent nullptr);void paintSnake(QPainter painter); //绘制蛇身void keyPress(QKeyEvent *event); //键盘控制移动方向void autoMove(); //沿着方向自动移动void frontAddBody(); //根据方向增加首节点QRect getSnakeHead(); //获取蛇的首节点信息int getLength(); //返回蛇身节点个数bool isOver(); //返回蛇是否死亡死亡为trueprivate:QListQRect body; //蛇身int nodeWidth; //节点宽度int nodeHeight; //节点高度int moveDirect; //移动方向int speed; //移动速度1表示默认速度2表示两倍速度 };#endif // SNAKE_H【4】snake.cpp: #include snake.h/************************************************************ 函数名Snake* 功 能蛇的构造函数* 参 数parent---父对象* 返回值无* 说 明初始化三节蛇身*********************************************************/ Snake::Snake(QWidget *parent): QWidget(parent), nodeWidth(20), nodeHeight(20), moveDirect(MOVE_LEFT), speed(1) {//初始给定三节蛇身body.append(QRect(400, 300, nodeWidth, nodeHeight));body.append(QRect(400 nodeWidth, 300, nodeWidth, nodeHeight));body.append(QRect(400 nodeWidth * 2, 300, nodeWidth, nodeHeight)); }/************************************************************ 函数名getLength* 功 能获取蛇身的长度即有几个节点* 参 数无* 返回值蛇身的长度*********************************************************/ int Snake::getLength() {return body.length(); }/************************************************************ 函数名isOver* 功 能判定蛇是否碰墙死亡* 参 数无* 返回值true---蛇死亡false---蛇没有死亡*********************************************************/ bool Snake::isOver() {if (body[0].y() 20 || body[0].y() nodeHeight 570 ||body[0].x() 10 || body[0].x() nodeWidth 580) {return true;}return false; }/************************************************************ 函数名keyPress* 功 能按键检测控制蛇的前进方向* 参 数event---按键的事件* 返回值无* 说 明在原有方向的基础上再次按原方向键能切换到二倍速模式*********************************************************/ void Snake::keyPress(QKeyEvent *event) {switch(event-key()) {case Qt::Key_Up://蛇往上if (MOVE_UP moveDirect){speed 2;}else if (moveDirect ! MOVE_DOWN){moveDirect MOVE_UP;speed 1;}break;case Qt::Key_Down://蛇往下if (MOVE_DOWN moveDirect){speed 2;}else if (moveDirect ! MOVE_UP){moveDirect MOVE_DOWN;speed 1;}break;case Qt::Key_Left://蛇往左if (MOVE_LEFT moveDirect){speed 2;}else if (moveDirect ! MOVE_RIGHT){moveDirect MOVE_LEFT;speed 1;}break;case Qt::Key_Right://蛇往右if (MOVE_RIGHT moveDirect){speed 2;}else if (moveDirect ! MOVE_LEFT){moveDirect MOVE_RIGHT;speed 1;}break;default:break;} }/************************************************************ 函数名autoMove* 功 能根据speed属性让蛇前进1格或2格* 参 数无* 返回值无* 说 明蛇的前进做法每次头插一个节点删除最后的一个节点*********************************************************/ void Snake::autoMove() {if (1 speed){frontAddBody();body.removeLast();}else if (2 speed){frontAddBody();frontAddBody();body.removeLast();body.removeLast();} }/************************************************************ 函数名frontAddBody* 功 能根据前进方向头插不同位置的节点* 参 数无* 返回值无* 说 明由于碰壁就死亡了无需越界判定*********************************************************/ void Snake::frontAddBody() {switch (moveDirect){case MOVE_UP:body.insert(0, QRect(body[0].x(), body[0].y() - nodeHeight, nodeWidth, nodeHeight));break;case MOVE_DOWN:body.insert(0, QRect(body[0].x(), body[0].y() nodeHeight, nodeWidth, nodeHeight));break;case MOVE_LEFT:body.insert(0, QRect(body[0].x() - nodeWidth, body[0].y(), nodeWidth, nodeHeight));break;case MOVE_RIGHT:body.insert(0, QRect(body[0].x() nodeWidth, body[0].y(), nodeWidth, nodeHeight));break;} }/************************************************************ 函数名getSnakeHead* 功 能返回首节点的拷贝以防外界修改。* 参 数无* 返回值无*********************************************************/ QRect Snake::getSnakeHead() {return body[0]; }/************************************************************ 函数名paintSnake* 功 能绘制蛇身遍历QList* 参 数painter---画家对象* 返回值无*********************************************************/ void Snake::paintSnake(QPainter painter) {//设置painterQPen pen(QColor(64, 65, 66));QBrush brush(QColor(183, 1, 1));painter.setPen(pen);painter.setBrush(brush);//绘制蛇身for (int i 0; i body.length(); i) {painter.drawRect(body[i]);} }【5】widget.h: #ifndef WIDGET_H #define WIDGET_H#include QWidget #include snake.h #include food.h #include QPainter #include QTimerQT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE/************************************************************ 类名 Widget* 摘要 主要界面类* 作者 柯同学* 注意 在该类中进行蛇吃食物、游戏结束等逻辑的实现*********************************************************/ class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void paintEvent(QPaintEvent *event) override; //绘图void keyPressEvent(QKeyEvent *event) override; //按键检测void snakeEatFood(); //蛇吃食物更新食物void computeScore(); //计算玩家分数private slots:void timeOut(); //定时器触发的槽函数void on_pushButton_clicked();//重新开始按钮的槽函数private:Ui::Widget *ui;Snake *snake; //蛇Food *food; //食物QTimer *timer; //定时器固定100ms触发bool isPause; //开始或暂停的标志true为暂停int timerCount; //定时器触发次数double score; //玩家分数 }; #endif // WIDGET_H【6】widget.cpp: #include widget.h #include ui_widget.h #include QDebug/************************************************************ 函数名Widget* 功 能主要窗口的构造函数* 参 数parent---父对象* 返回值无*********************************************************/ Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), isPause(true), timerCount(0), score(0) {ui-setupUi(this);//实例化蛇snake new Snake(ui-gameWidget);//实例化食物food new Food(ui-gameWidget);//设置定时器timer new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));//设置聚焦对象ui-gameWidget-setFocus(); }/************************************************************ 函数名~Widget* 功 能主要窗口的析构函数* 参 数无* 返回值无* 说 明由于QT的对象树机制绑定好父对象后无需手动delete其他空间*********************************************************/ Widget::~Widget() {delete ui; }/************************************************************ 函数名~Widget* 功 能主要窗口的析构函数* 参 数无* 返回值无*********************************************************/ void Widget::paintEvent(QPaintEvent *event) {Q_UNUSED(event)QPainter painter(this);//判定游戏是否结束结束则显示提示if (snake-isOver()) {//蛇死亡游戏结束timer-stop();isPause true;QFont font(宋体, 30, QFont::ExtraBold,false);painter.setFont(font);QRect showArea(200, 250, 200, 100);painter.drawText(showArea, Qt::AlignHCenter | Qt::AlignVCenter, 游戏结束);}//绘制蛇和食物snake-paintSnake(painter);food-paintFood(painter);//实时显示玩家分数ui-scoreLabel-setText(分数: QString::number(score)); }/************************************************************ 函数名keyPressEvent* 功 能重写的按键检测事件函数* 参 数event---按键事件* 返回值无* 说 明以防游戏结束后还能控制首先需要判定游戏是否结束*********************************************************/ void Widget::keyPressEvent(QKeyEvent *event) {//游戏未结束才进行按键控制if (!(snake-isOver())) {//按键控制蛇移动snake-keyPress(event);//按键控制暂停if (event-key() Qt::Key_Space) {if (isPause){isPause false;timer-start(100);}else {isPause true;timer-stop();}}} }/************************************************************ 函数名snakeEatFood* 功 能蛇与食物接触则给蛇加节点给食物重新生成坐标和类型* 参 数无* 返回值无* 说 明生成食物必须放在蛇加节点之后*********************************************************/ void Widget::snakeEatFood() {//蛇与食物接触if (abs(snake-getSnakeHead().x() - food-getX()) food-getRadius() abs(snake-getSnakeHead().y() - food-getY()) food-getRadius()){//蛇吃不同类型食物加不同节int count food-getType();while (count--){snake-frontAddBody();}//再次生成食物food-generateFood();} }/************************************************************ 函数名computeScore* 功 能计算玩家分数* 参 数无* 返回值无* 说 明分数由两部分构成时间分数、长度分数。* 每坚持1秒分数增加1分。* 每多一节身体分数增加10分。*********************************************************/ void Widget::computeScore() {double timeScore (timerCount / 10.0) * 1; //时间的分数每秒1分int lenScore (snake-getLength() - 3) * 10; //长度的分数增一节10分if (lenScore 0)this-score timeScore lenScore; }/************************************************************ 函数名timeOut* 功 能定时器的槽函数* 参 数无* 返回值无*********************************************************/ void Widget::timeOut() {//蛇自动移动吃食物snake-autoMove();snakeEatFood();//计算玩家分数timerCount;computeScore();//更新界面this-update(); }/****************************************************************** 函数名on_pushButton_clicked* 功 能重新开始按钮的槽函数* 参 数无* 返回值无* 说 明需要重新聚焦于gameWidget否则点击按钮后需要再点击gameWidget***************************************************************/ void Widget::on_pushButton_clicked() {//清除相关属性timerCount 0; //定时器计数清零score 0; //分数清零isPause true; //恢复暂停//删除已有成员对象if (snake) {delete snake;}if (food) {delete food;}//创建新对象snake new Snake(ui-gameWidget);food new Food(ui-gameWidget);//更新界面this-update();ui-gameWidget-setFocus();//重新聚焦于游戏窗口 }【7】main.cpp: 系统自动生成的没有改动。 #include widget.h#include QApplicationint main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }
http://www.dnsts.com.cn/news/203142.html

相关文章:

  • 网站做优化必须要ftp吗邢台网站设计哪家专业
  • 吕梁网站设计南京网站关键词优化咨询
  • 做风险投资网站校园推广渠道
  • 京东网站是谁做的智慧团建登录入口官方网站
  • 网站页面优化简单吗wordpress开通多站点好处
  • 用focusky做h5微网站昆明网站词排名优化
  • 松江微网站建设轻松筹网站可以做吗
  • 怎样做自己的 优惠卷网站免费建设网站入驻
  • 怎么用wordpress建电商网站中级经济师考试题库1000题
  • wordpress中添加登陆页面跳转临沂网站关键字优化
  • 模板网站建设 报价淄博做网站建设
  • 好看的网站在哪里好找org域名做网站
  • 太仓高端网站制作顺企网下载安装
  • 旅游网站开发的国内外现状wordpress 繁体转简
  • php 资讯网站个人网站做的类型
  • 宁波seo推广推荐网站seo基本流程
  • 佛山国内快速建站做网站广告中敏感词会涉及到工商
  • asp网站后台管理系统密码破解防盗网站人做清洁
  • 海南工程建设资料备案网站龙岩网站设计培训
  • 青岛君哲网站建设公司怎么样wordpress 评论栏
  • 优秀集团网站设计百度推广是必须先做网站吗
  • 建设网站的公司专业服务免费开源代码网站
  • 建设部网站有建筑施工分包商标注册查询网址
  • 我公司要网站建设北京网站优化企业
  • 维护网站一年多少钱长沙网站推广平台
  • wordpress 多站点 拷贝微信公众号管理工具
  • 凡科建站模板最好用的wordpress主题
  • 手机网站html5凡科网怎么建网站
  • 北京手机网站建设费用接收外国电视卫星天线
  • 企业网站建设项目计划书成免费crm软件