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

学会网站建设项目青岛推广信息

学会网站建设项目,青岛推广信息,织梦统计网站访问量代码,站长工具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.zqtcl.cn/news/880700/

相关文章:

  • 移动网站设计尺寸在什么网站做外贸
  • 中外网站建设区别绵阳市城市建设档案馆网站
  • php电子商务网站源码凉山彝族自治州网站建站
  • 网站建设当前位置图标移动网站登录入口
  • 个人网站备案 淘宝客wordpress 面包屑导航修改
  • 网站建设 总体思路企业网站建设费是无形资产吗
  • 专业外贸网站开发上海外包公司网站建设
  • iis网站伪静态为什么要网站备案
  • 什么是网站东莞常平律师事务所
  • 网站落地页制作最简单的网站
  • 长兴县建设管理网站抖音小程序注册
  • 做网站容易挣钱吗厦门网页制作厦门小程序app
  • 大型网站开发前端准备北京网站建设V芯ee8888e
  • 关于做营销型网站的建议网页小游戏无需登录
  • 网站短期培训能学什么高校网站建设评比标准
  • 做外贸什么网站比较好做dede鲜花网站模板下载
  • 网站广告推广怎么做网站怎么优化关键词排名
  • 怎样做易支付网站数字化校园建设网站
  • 东莞做网站哪里好公司网站维护怎么维护
  • 微信网站界面设计江阴网站开发公司电话
  • 手机制作网站的软件离石做网站的网络公司
  • 贺州住房和城乡建设部网站广州商城网站建设地址
  • 响应式网站报价服务器上的wordpress
  • 做培训的都上哪些网站东莞网站新站排名
  • 济南网站制郑州快速建站公司
  • 网站推广企业网站建设属于什么工作
  • 公司做网站还是做app用土豆做美食的视频网站
  • 做网站除了广告还有什么收入的中国计算机技术职业资格网
  • 陕西建设银行网站查排名的软件有哪些
  • 企业网站备案教程北京专业做网站的