Qt项目-翻金币游戏

 

  • 项目概述
  • 项目预览
  • 项目框架
  • 项目代码
  • 项目总结

-项目概述-

Qt基础课程完结项目,完成一款小游戏并封装:翻金币游戏,通过点击金币进行翻面,让所有金币为同一面就游戏通过进入下一关。

过程中会使用前面学到的 “信号和槽”,“Qt图片资源显示”,“Qt播放音频”,“Qt绘图函数”,“Qt消息控件”等等知识。是一次前面所学知识的汇总。

 

-项目预览-

 

-程序框架- 

框架如下,(因为这个项目完成有些时间了,现在才记录下来,流程部分是看的当时的程序注释,有些不明白的地方可以私信我)

 

-代码资源下载-

 运行平台:

 

主界面代码:

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3 #include <QPainter>
 4 #include <QMenuBar>
 5 #include <QDebug>
 6 #include <QSound>
 7 #include <QTimer>
 8 #include "mybutton.h"
 9 
10 
11 MainWindow::MainWindow(QWidget *parent) :
12     QMainWindow(parent),
13     ui(new Ui::MainWindow)
14 {
15     ui->setupUi(this);
16 
17 
18 //-------------------------------------------------------------主窗口设置-------------------------------------------------------------------//
19     // 1.主窗口场景设置
20     this->setFixedSize(360, 360*1.7);
21     this->setWindowIcon(QPixmap(":/res/Coin0001.png"));
22     this->setWindowTitle("翻金币");
23 
24     // 2.主窗口控件设置
25     connect(ui->actionExit, &QAction::triggered, [=](){
26         this->close();
27     });
28 
29     // 3.创建关卡选择界面指针对象,同时监听关卡按钮前线发回的信号
30     this->CustomWidget = new ChooseCustoms;
31 
32     connect(CustomWidget, &ChooseCustoms::ChooseCustomBacksig, [=](){
33         this->setGeometry(CustomWidget->geometry());
34         CustomWidget->hide();
35         this->show();
36     });
37 
38     // 4.创建并移动开始按钮对象
39     MyButton *startBtn = new MyButton(":/res/MenuSceneStartButton.png");
40     startBtn->setParent(this);
41     startBtn->move((this->width() - startBtn->width())*0.5, this->height()*0.7);
42 
43     // 5.播放开始按钮点击音效
44     QSound *startSound = new QSound(":/res/TapButtonSound.wav", this);
45     
46     connect(startBtn, &MyButton::clicked, [=](){
47         qDebug() << "点击了开始按钮";        
48         startBtn->jumpDown();       
49         startSound->play();
50         startBtn->jumpUp();
51 
52         QTimer::singleShot(400, this, [=](){ this->hide(); CustomWidget->show(); });
53     });
54 }
55 
56 
57 
58 
59 //-------------------------------------------------------------主窗口绘图事件绘制界面-------------------------------------------------------------------//
60 void MainWindow::paintEvent(QPaintEvent *)
61 {
62     QPainter painter(this);
63 
64     // 绘制主场景背景界面
65     QPixmap pix;
66     pix.load(":/res/海滩.jpg");
67     painter.drawPixmap(QRect(0, 0, this->width(), this->height()), pix);
68 
69     // 绘制主场景图标
70     pix.load(":/res/Title.png");
71     pix = pix.scaled(pix.width()*0.7, pix.height()*0.7);
72     painter.drawPixmap(10, 30, pix.width(), pix.height() , pix);
73 }
74 
75 
76 MainWindow::~MainWindow()
77 {
78     delete ui;
79 }

 

 

 

 

关卡选择界面函数:

  1 #include "choosecustoms.h"
  2 #include <QMenuBar>
  3 #include <QPainter>
  4 #include <QSound>
  5 #include <QLabel>
  6 #include <QTimer>
  7 #include <QDebug>
  8 
  9 ChooseCustoms::ChooseCustoms(QWidget *parent) : QMainWindow(parent)
 10 {
 11 //-------------------------------------------------------------主窗口设置-------------------------------------------------------------------//
 12     // 1.场景以及图标,标题设置
 13     this->setFixedSize(360, 360*1.7);
 14     this->setWindowIcon(QPixmap(":/res/Coin0001.png"));
 15     this->setWindowTitle("翻金币");
 16 
 17     // 2.创建菜单栏,创建关闭按钮
 18     QMenuBar *bar = this->menuBar();
 19     this->setMenuBar(bar);
 20     QMenu *startMenu = bar->addMenu("开始");
 21     QAction *quitAction = startMenu->addAction("退出");
 22 
 23     connect(quitAction, &QAction::triggered, [=](){
 24         this->hide();
 25     });
 26 
 27     // 3.返回按钮,返回按钮点击后返回的信号
 28     MyButton *retBtn = new MyButton(":/res/BackButton.png", ":/res/BackButtonSelected.png");
 29     retBtn->setParent(this);
 30     retBtn->move(this->width()-retBtn->width(), this->height()-retBtn->height());
 31 
 32 
 33     connect(retBtn, &MyButton::clicked, [=](){
 34         qDebug() << "点击了返回按钮";
 35         QSound *retSound = new QSound(":/res/BackButtonSound.wav", this);
 36         retSound->play();
 37         QTimer::singleShot(400, this, [=](){ emit this->ChooseCustomBacksig(); });
 38     });
 39 
 40 //-------------------------------------------------------------for循环创建关卡选择按钮----------------------------------------------------------//
 41     // 4.创建关卡选择按钮
 42     for(int i = 0; i < 20; i++)
 43     {
 44         // 绘制按钮图标
 45         MyButton *customBtn = new MyButton(":/res/LevelIcon.png");
 46         customBtn->setParent(this);
 47         customBtn->move(45 + (i%4)*70 , 150 + (i/4)*70);  // 我们要一个4x5的矩阵
 48         customBtnArray[i] = customBtn;
 49 
 50         // 关联每一个按钮的启动函数
 51         connect(customBtn, &MyButton::clicked, [=](){
 52 
 53             // 关卡选择按钮上锁,其余的按钮不能点击
 54             for(int i = 0; i < 20; i++)
 55             {
 56                 customBtnArray[i]->isclick = true;
 57             }
 58             qDebug() << "选择了" << i+1 << "关卡";
 59             if(this->coinfligwidget == NULL)
 60             {              
 61                 customBtn->jumpDown();
 62                 customBtn->jumpUp();
 63                 QSound *chooseSound = new QSound(":/res/TapButtonSound.wav", this);
 64                 chooseSound->play();
 65 
 66                 QTimer::singleShot(400, this, [=](){
 67                     this->hide();
 68                     this->coinfligwidget = new CoinFligWidget(i+1);
 69                     coinfligwidget->setGeometry(this->geometry());
 70                     coinfligwidget->show();
 71 
 72                     // 关卡选择按钮解锁,其余的按钮可以点击
 73                     for(int i = 0; i < 20; i++)
 74                     {
 75                         customBtnArray[i]->isclick = false;
 76                     }
 77 
 78                     connect(coinfligwidget, &CoinFligWidget::CoinFligBacksig, [=](){
 79                         this->setGeometry(coinfligwidget->geometry());
 80                         this->show();
 81                         delete coinfligwidget;
 82                         coinfligwidget = NULL;
 83                     });
 84                 });
 85             }           
 86         });
 87 
 88         // 绘制按钮数字
 89         QLabel *label = new QLabel;
 90         label->setParent(this);
 91         label->setFixedSize(customBtn->width(), customBtn->height());
 92         label->setText(QString::number(i+1));
 93         label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
 94         label->move(45 + (i%4)*70 , 150 + (i/4)*70);
 95         label->setAttribute(Qt::WA_TransparentForMouseEvents,true);  // 鼠标事件穿透
 96     }
 97 }
 98 
 99 //-------------------------------------------------------------主窗口绘图事件绘制界面--------------------------------------------------------------//
100 
101 void ChooseCustoms::paintEvent(QPaintEvent *event)
102 {
103     QPainter painter(this);
104     QPixmap pix;
105     pix.load(":/res/海滩1.jpg");
106     painter.drawPixmap(0, 0, this->width(), this->height(), pix);
107 
108     pix.load(":/res/Title.png");
109     painter.drawPixmap((this->width() - pix.width())*0.5, 30, pix.width(), pix.height(), pix);
110 }

 

翻金币页面代码:

  1 #include "coinfligwidget.h"
  2 #include "dataconfig.h"
  3 #include "mybutton.h"
  4 #include <QPropertyAnimation>
  5 #include <QMenuBar>
  6 #include <iostream>
  7 #include <QPainter>
  8 #include <QDebug>
  9 #include <QSound>
 10 #include <QTimer>
 11 
 12 
 13 
 14 CoinFligWidget::CoinFligWidget(int index)
 15 {
 16 //-------------------------------------------------------------初始化数据-------------------------------------------------------------------//
 17     this->levalIndex = index;
 18     dataConfig config;
 19     for(int i = 0; i < 4; i++)
 20     {
 21         for(int j = 0; j < 4; j++)
 22         {
 23             gameArray[i][j] = config.mData[this->levalIndex][i][j];
 24         }
 25     }
 26 //-------------------------------------------------------------主窗口设置-------------------------------------------------------------------//
 27     // 1.场景以及图标,标题设置
 28     this->setFixedSize(360, 360*1.7);
 29 
 30     this->setWindowIcon(QPixmap(":/res/Coin0001.png"));
 31     this->setWindowTitle("翻金币");
 32 
 33     // 2.创建菜单栏,创建关闭按钮
 34     QMenuBar *bar = this->menuBar();
 35     this->setMenuBar(bar);
 36     QMenu *startMenu = bar->addMenu("开始");
 37     QAction *quickAction = startMenu->addAction("退出");
 38 
 39     connect(quickAction, &QAction::triggered, [=](){
 40         this->hide();
 41     });
 42 
 43     // 3.返回按钮,返回按钮发出的信号
 44     MyButton *retBtn = new MyButton(":/res/BackButton.png", ":/res/BackButtonSelected.png");
 45     retBtn->setParent(this);
 46     retBtn->move(this->width()-retBtn->width(), this->height()-retBtn->height());
 47 
 48     connect(retBtn, &MyButton::clicked, [=](){
 49         qDebug() << "点击了返回按钮";
 50         QSound *chooseSound = new QSound(":/res/TapButtonSound.wav", this);
 51         chooseSound->play();
 52         QTimer::singleShot(400, this, [=](){  emit this->CoinFligBacksig(); });
 53     });
 54 
 55     // 4.显示当前关卡
 56     QLabel *label = new QLabel(this);
 57     QFont font;
 58     font.setFamily("华文新魏");
 59     font.setPointSize(20);
 60     label->setFont(font);
 61     QString str = QString("Leavel: %1").arg(this->levalIndex);
 62     label->setText(str);
 63     label->setGeometry(QRect(20, this->height()-75, 120, 50));
 64 
 65     // 5.将胜利图片创建好,如果胜利触发了,将图片弹下去即可
 66     QLabel *winLabel = new QLabel(this);
 67     QPixmap temPix;
 68     temPix.load(":/res/LevelCompletedDialogBg.png");
 69     winLabel->setGeometry(0, 0, temPix.width(), temPix.height());
 70     winLabel->setPixmap(temPix);
 71     winLabel->move((this->width() - temPix.width())*0.5, -temPix.height());
 72 
 73     // 翻金币音效
 74     QSound *flipSound = new QSound(":/res/ConFlipSound.wav",this);
 75 
 76 
 77 //-------------------------------------------------------------金币初始化-------------------------------------------------------------------//
 78     for(int i = 0; i < 4; i++)
 79     {
 80         for(int j = 0; j < 4; j++)
 81         {
 82             // 5.创建金币背景图片
 83             QLabel *label = new QLabel(this);
 84             label->setGeometry(0, 0, 50, 50);
 85             label->setPixmap(QPixmap(":/res/BoardNode.png"));
 86             label->move(80 + i*50, 200 + j*50);
 87 
 88             // 6.初始化金币
 89             QString img;
 90             if(gameArray[i][j] == 1)
 91             {
 92                 img = ":/res/Coin0001.png";
 93             }
 94             else
 95             {
 96                 img = ":/res/Coin0008.png";
 97             }
 98 
 99             MyCoin *coin = new MyCoin(img);
100             coin->setParent(this);
101             coin->move(82 + i*50,203 + j*50);
102 
103             // 为每个金币属性赋值,1.记录坐标 2.记录正反
104             coin->posX = i;
105             coin->posY = j;
106             coin->flag = gameArray[i][j];
107             coinBtn[i][j] = coin;           
108 
109             // 7.监听每个按钮的点击
110             connect(coin, &MyCoin::clicked, [=](){
111                 flipSound->play();
112 
113                 // 在此颗金币点击的瞬间,其余金币全部禁用,鼠标拦截事件弹出
114                 for(int i = 0; i < 4; i++)
115                 {
116                     for(int j = 0; j < 4; j++)
117                     {
118                         this->coinBtn[i][j]->isWin = true;
119                     }
120                 }
121 
122                 // 翻转金币
123                 coin->changflag();
124                 this->gameArray[i][j] = this->gameArray[i][j] == 0 ? 1 : 0;
125 
126 //-------------------------------------------------------------周围金币翻转,并且判断输赢-------------------------------------------------------//
127                 QTimer::singleShot(300, this, [=](){
128                     this->aroundChang(i, j, coin);
129                     this->judgeWin(winLabel);
130                 });
131             });
132         }
133     }
134 }
135 
136 // ->将周围金币进行翻转
137 void CoinFligWidget::aroundChang(int i, int j, MyCoin *coin)
138 {
139     if(coin->posX+1 <= 3)
140     {
141         coinBtn[coin->posX+1][coin->posY]->changflag();
142         gameArray[coin->posX+1][coin->posY] = gameArray[i][j] == 0 ? 1 : 0;
143     }
144     if(coin->posX-1 >= 0)
145     {
146         coinBtn[coin->posX-1][coin->posY]->changflag();
147         gameArray[coin->posX-1][coin->posY] = gameArray[i][j] == 0 ? 1 : 0;
148     }
149     if(coin->posY+1 <= 3)
150     {
151         coinBtn[coin->posX][coin->posY+1]->changflag();
152         gameArray[coin->posX][coin->posY+1] = gameArray[i][j] == 0 ? 1 : 0;
153     }
154     if(coin->posY-1 >= 0)
155     {
156         coinBtn[coin->posX][coin->posY-1]->changflag();
157         gameArray[coin->posX][coin->posY-1] = gameArray[i][j] == 0 ? 1 : 0;
158     }
159 
160     for(int i = 0; i < 4; i++)
161     {
162         for(int j = 0; j < 4; j++)
163         {
164             this->coinBtn[i][j]->isWin = false;
165         }
166     }
167 }
168 
169 // ->判断是否胜利
170 void CoinFligWidget::judgeWin(QLabel *label)
171 {
172     this->isWin = true;
173     for(int i = 0; i < 4; i++)
174     {
175         for(int j = 0; j < 4; j++)
176         {         
177             if(this->coinBtn[i][j]->flag == false)
178             {
179                 this->isWin = false;
180                 break;
181             }          
182         }
183     }
184 
185     if(this->isWin)
186     {
187         qDebug() << "亲爱的,你的的确确是赢了!";
188         // 胜利按钮音效
189         QSound *winSound = new QSound(":/res/LevelWinSound.wav",this);
190         winSound->play();
191         QPropertyAnimation *animation = new QPropertyAnimation(label, "geometry");
192         animation->setDuration(1000);
193         animation->setStartValue(QRect(label->x(), label->y(), label->width(), label->height()));
194         animation->setEndValue(QRect(label->x(), label->y()+144, label->width(), label->height()));
195         animation->setEasingCurve(QEasingCurve::OutBounce);
196         animation->start();
197 
198         // 赢了之后禁止翻转按钮
199         for(int i = 0; i < 4; i++)
200         {
201             for(int j = 0; j < 4; j++)
202             {
203                 this->coinBtn[i][j]->isWin = true;
204             }
205         }
206     }   
207 }
208 
209 //-------------------------------------------------------------主窗口绘图事件绘制界面--------------------------------------------------------------//
210 void CoinFligWidget::paintEvent(QPaintEvent *event)
211 {
212     QPainter painter(this);
213     QPixmap pix;
214 
215     // 加载背景
216     pix.load(":/res/海滩.jpg");
217     painter.drawPixmap(QRect(0, 0, this->width(), this->height()), pix);
218 
219     // 加载标题
220     pix.load(":/res/Title.png");
221     pix = pix.scaled(pix.width()*0.5, pix.height()*0.5);
222     painter.drawPixmap(10,30,pix.width(),pix.height(),pix);
223 }

 

-总结-

  • 这一次项目让我有了对C++的重新审视,刚学的时候:哟,这不就是C嘛,中途:WOC,这是什么??? 做完项目:原来这就是C++啊<仍然懵。。。>
  • 要想开启一个项目,一定是先主体后局部,先框架后函数,以前我写代码总是热衷于函数某一个功能的优化,导致项目迟迟难以推进,这次真正见识到了,先搭框架后细化的感觉有多爽。
  • Qt的环境变量花了我大量时间配置......

 

本文转载于网络 如有侵权请联系删除

相关文章

  • 网站添加本站已稳定运行XX天的统计代码

    看到很多站长,都喜欢在自己网站的底部加入“本站已稳定运行多少天”的小功能下面用js把功能复现一遍JavaScriptfunctionshowsectime(){ varbirthDay=NewDate("2019-05-13"); //这里修改站点开启日期 vartoday=newDate(); vartimeold=today.getTime()-birthDay.getTime(); varsectimeold=timeold/1000 varsecondsold=Math.floor(sectimeold); varmsPerDay=24*60*60*1000;vare_daysold=timeold/msPerDay; vardaysold=Math.floor(e_daysold); vare_hrsold=(daysold-e_daysold)*-24; varhrsold=Math.floor(e_hrsold); vare_minsold=(hrsold-e_hrsold)*-60; varminsold=Math.floor((hrsold-e_h

  • Mysql主从同步报错解决:Error executing row event: Table zabbix.history-..

    报错信息: 因为之前在主数据库服务器上搭建了Zabbix,所以在配置主从时报错。 Errorexecutingrowevent:'Table'zabbix.history_uint'doesn'texist'...... Slave_IO_Running:Yes Slave_SQL_Running:No ...... Last_Error:Errorexecutingrowevent:'Table'zabbix.history_uint'doesn'texist' 复制在这里插入图片描述解决办法:只需要把主库服务器上的Zabbix数据库放到从库服务器上来就可以了。1.主数据库服务器备份Zabbix数据库[root@localhost~]#mysql-uroot-p123qqq...A mysql>showdatabases; +--------------------+ |Database| +--------------------+ |information_schema| |

  • Wiztalk | 096期 谢宁《面向极致互动体验的交互图形学技术-建模与人机交互》

    面向极致互动体验的交互图形学技术 Part2建模与人机交互分享专家:电子科技大学 谢宁老师内容简介:如何在有限样本中实现千差万别的数字建模?如何才可以实现云渲染?人机交互又有哪些新鲜的事儿?本期电子科技大学的谢宁老师将讲述他的团队在实现极致互动的道路上所做出的尝试。内容难度:★★☆(计算机专业或有一定计算机知识储备的大学生)以下为精彩视频关注更多精彩短视频,点击下方程序小卡片 也可点击“阅读原文”或打开“哔哩哔哩”搜索关注“Wiztalk”,一起开启科普知识分享“新视界”~—关于Wiztalk — Wiztalk是腾讯高校合作团队打造的一个短视频知识分享系列,每集10分钟左右,致力于跟随科技的发展以及时代的步伐,使用更为科普化的方式传播最新、最热门、最通用的知识。点击“阅读原文”,进入Bilibili关注“Wiztalk”

  • 2小时入门Spark之MLlib

    最近由于一直在用Spark搞数据挖掘,花了些时间系统学习了一下Spark的MLlib机器学习库,它和sklearn有八九分相似,也是Estimator,Transformer,Pipeline那一套,各种fit,transform接口。sklearn有多好学,MLlib就有多好学,甚至MLlib还要更加简单一些,因为MLlib库中支持的功能相对更少一些,并且MLlib基于DataFrame数据比sklearn基于numpyarray会更加直观一些。那学了这个MLlib有啥子用呢?主要有以下三方面用处。第一是对海量数据特征工程处理。如果有遇到需要对50G以上的数据进行Tf-idf特征提取,缺失值填充,特征筛选,最邻近查找等特征工程任务时,使用Pandas的同学可能要望洋兴叹了,这时候会使用SparkMLlib的同学就会露出迷之微笑。第二是提供机器学习模型的候选baseline。众所周知,目前工业界应用最主流的机器学习模型是xgboost,lightgbm,以及深度学习那一套。遗憾的是,MLlib原生并不带xgboost和lightgbm,对深度学习的支持也不多。但MLlib提供非常丰富的

  • 域渗透 | 白银票据利用

    目录0x01介绍0x02白银票据利用0x01介绍之前,我们已经详细说过Kerberos认证的流程,这次我们就来说说如何对其进行利用,这次主要说的是白银票据伪造(SilverTickets)白银票据伪造利用的是Kerberos认证中的第三个步骤,在第三步的时候,client会带着ticket向server的某个服务进行请求,如果验证通过就可以访问server上的指定服务了,这里ticket的格式是这样的:Serverhash(serversessionkey+clientinfo+endtime)复制其中clientinfo我们是很清楚的,endtime也可以根据自己当前的时间进行伪造,serversessionkey是TGS生成的,在未向server发送ticket的时候,server也是不知道serversessionkey是什么的,所以只要我们知道serverhash就可以去访问server中的指定服务了。其实与其说这是一种利用方式,倒不如说这是一个后门,在拥有serverhash的时候,可以随时去请求server。根据上面的攻击流程总结以下白银票据的攻击特点:1.不需要与KDC进

  • Lnc2Meth:与疾病相关的lncRNA上的甲基化位点

    欢迎关注”生信修炼手册”!DNA甲基化作为研究的最为广泛的一种表观遗传标记,其对基因表达的影响是研究的基本内容。随着lncRNA研究的发展,科学家将眼光放到了位于lncRNA基因上的DNA甲基化位点,通过lncRNA基因上的甲基化位点来找到疾病相关的lncRNA,并探究lncRNA在疾病中的作用。有学者收集类似的文献,并整理成了数据库Ln2Meth,网址如下http://bio-bigdata.hrbmu.edu.cn/Lnc2Meth/index.jsp该数据库提供了以下两种检索方式Disease-CentricTranscript-Centric 可以根据疾病或者lncRNA的名字进行检索,结果示意如下对于甲基化位点,给出了在患者中的表达模式,包括以下几种differentialmethylationhypermethylationhypomethylationmethylationdemethylation 对于DNA甲基化位点与lncRNA之间的关系,提出了以下3种模型1.Cis-MethylatedLncRNA(CML)2.Trans-MethylationDuetoLn

  • 手写dubbo框架2-服务治理(zookeeper探讨)

    博客中代码地址:https://github.com/farliu/farpc.git开始进入主题,本文主要介绍的是服务的注册和发现,也就是图片中的第1,2,3步,既然要实现服务治理,那么我们需要一个统一管理服务东西,也就是注册中心。我们需要选择的注册中心是zookeeper。 这里多说一句,图中的2,3很明显是分两步来处理。如果只是从注册中心拿到provider而已,那为什么要分两步呢?而且我所认识的单词也有限,要是我取名的话我可能会给它取名叫做get、return。那它为什么要叫subscribe、notify呢?这里是为了多个服务的动态发现。当你有一个provider宕机的时候,zookeeper肯定不能给一个宕机的provider给你,那么这时就需要notify了,而不get。我不知道我说清楚没。这里可以等看完本章内容后,再细细思考。分析实现方案按照开发惯例,先确定实现方案。要实现服务注册和发现,就相当于管理服务,管理意味着存储,我们可以先确定存储服务的结构。假如现在有一个服务为Dog.walk(),我们尝试使用Map来管理它,例如Map<service,provider

  • 如何实现登录、URL和页面按钮的访问控制

    作者:社会主义接班人 cnblogs.com/5ishare/p/10461073.html 用户权限管理一般是对用户页面、按钮的访问权限管理。Shiro框架是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理,对于Shiro的介绍这里就不多说。本篇博客主要是了解Shiro的基础使用方法,在权限管理系统中集成Shiro实现登录、url和页面按钮的访问控制。一、引入依赖使用SpringBoot集成Shiro时,在pom.xml中可以引入shiro-spring-boot-web-starter。由于使用的是thymeleaf框架,thymeleaf与Shiro结合需要引入thymeleaf-extras-shiro。<!--https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring-boot-web-starter--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>

  • CVPR 2019 Oral 论文解读 | 百度提出关于网络压缩和加速的新剪枝算法

    AI科技评论按:百度关于网络压缩和加速的论文《FilterPruningviaGeometricMedianforDeepConvolutionalNeuralNetworksAcceleration》被CCFA类学术会议CVPR2019收录为Oral论文,这篇论文提出了新的基于滤波器的几何中心(geometricmedian)的剪枝算法,来对神经网络进行压缩和加速。本文是论文作者之一何洋为AI科技评论提供的论文解读。 论文地址:https://arxiv.org/pdf/1811.00250.pdf Github地址:https://github.com/he-y/filter-pruning-geometric-median·1.背景·卷积神经网络(CNN)通常通过更深和更宽的结构实现了更好的性能,但是当神经网络需要部署到移动设备时,神经网络需要的资源远远超过了移动设备的限制。例如,ResNet-152拥有6020万个参数,需要231MB存储空间;此外,它还需要超过380MB的内存和11.3亿浮点运算(在CPU上耗时6秒钟)来处理单张图像。因此,我们需要找到高效率的模型来满足移动设

  • 干货 | 基于深度学习的目标检测算法综述(二)

    AI科技评论按:本文转载自美图技术公众号目标检测(ObjectDetection)是计算机视觉领域的基本任务之一,学术界已有将近二十年的研究历史。近些年随着深度学习技术的火热发展,目标检测算法也从基于手工特征的传统算法转向了基于深度神经网络的检测技术。从最初2013年提出的R-CNN、OverFeat,到后面的Fast/FasterR-CNN、SSD、YOLO系列,再到2018年最近的Pelee。短短不到五年时间,基于深度学习的目标检测技术,在网络结构上,从twostage到onestage,从bottom-uponly到Top-Down,从singlescalenetwork到featurepyramidnetwork,从面向PC端到面向手机端,都涌现出许多好的算法技术,这些算法在开放目标检测数据集上的检测效果和性能都很出色。基于深度学习的目标检测算法综述分为三部分:1.Two/Onestage算法改进。这部分将主要总结在two/onestage经典网络上改进的系列论文,包括FasterR-CNN、YOLO、SSD等经典论文的升级版本。2.解决方案。这部分我们归纳总结了目标检测的常见

  • 微信小程序能改变我们生活那些方式?

     微信小程序在去年年初正式在微信平台发布,一时间可成了互联网行业最热门的话题,从小程序在微信上发布到现在,时间差不多已经有一年多的时间,今天我们主要看看微信小程序能改变我们生活那些方式以此为主题。微信小程序进入我们的生活,改变了我们那些生活方式? 1、公交车信息查询 在以前我们一直在公交站焦急的等待着公交车,不知道公交车还离我们有多远,现在我们可以通过微信搜索本地公交车实时信息小程序,查看公交车离自己还有多少站。 2、在线预定用餐 小程序对于餐饮行业来说也是一种福利,餐饮行业可以通过搭建小程序,来为食客提供线上预约订餐、像在线排号、在线结账,等等都是可以通过微信小程序完成。 3、不用下载更多APP 以前我们为了能够体验到某个功能,我们要去下载一个一个APP,但是有微信小程序后,我们就不需要再去下载一个一个APP,我们直接在微信搜索该应用的小程序就有可以,基本上像电信这样的电信运营商都是在微信上搭建了小程序,像以前交宽带费用,我们需要去营业厅,现在直接在小程序就可以完成缴费。 4、不一样的在线购物 现在有很多的线上电子商务平台,但是都是需要下载APP才行,微信小程序商城就不一样,无需下载

  • 75亿美元之后,再也不能自由的同性交友了

    --------------------------------度娘分割线-------------------------------------------------------------------度娘分割线-----------------------------------度娘话多,不如一副图片来的清晰。《一图讲解github.jpg》那么,微软收购github,到底是喜还是忧?那几家欢喜那几家愁?我们先看看当事人和竞争对手是怎么说的。事实上,楼上三位说的都木有错,GitHub竞品之一的GitLab还顺势推出了从GitHub迁移到GitLab的工具,并且从6月4日零点开始,无论是Project还是Repository都瞬间迎来了迁移高峰。资深程序猿友情提示!!!!!!程序猿还有话要说!!!!!!最后预祝下office2020顺利添加新功能!!!

  • 每个Kaggle冠军的获胜法门:揭秘Python中的模型集成

    选自Dataquest 作者:SebastianFlennerhag机器之心编译集成方法可将多种机器学习模型的预测结果结合在一起,获得单个模型无法匹敌的精确结果,它已成为几乎所有Kaggle竞赛冠军的必选方案。那么,我们该如何使用Python集成各类模型呢?本文作者,曼彻斯特大学计算机科学与社会统计学院的在读博士SebastianFlennerhag对此进行了一番简述。在Python中高效堆叠模型集成(ensemble)正在迅速成为应用机器学习最热门和流行的方法。目前,几乎每一个Kaggle冠军的解决方案都使用了集成,很多数据科学pipeline也使用集成。简单来说,集成把不同模型的预测结果结合起来,生成最终预测,集成的模型越多,效果就越好。另外,由于集成结合了不同的基线预测,它们的性能至少等同于最优的基线模型。集成使得我们几乎免费就获得了性能提升!集成图示。输入数组X通过两个预处理pipeline输入至多个基学习器f(i)。集成将所有的基学习器的预测结果结合起来,导出最终的预测数组P。(图片来源:http://ml-ensemble.com/)本文介绍集成的基础知识:定义及工作原理,

  • Python这些问题你都会吗?

    距离Python圣诞学习狂欢夜还有4天点击进入详细了解final作用域的代码一定会被执行吗?正常的情况下,finally作用域的代码一定会被执行的,不管是否发生异常。哪怕是调用了sys.exit函数,finally也是会被执行的,那怎么样才能让finally代码不执行了。上面的代码主要是通过让流程停滞在try作用域里,从而实现了需求。上面的代码不排除有点投机取巧的意思,但是我们实习了题目的需求不是吗。可以对含有任意的元素的list进行排序吗?正常情况下:那是不是以为着,任何list都可以调用sort函数进行排序了?python里1j是一个特殊符号代表-1的平方根,出现这个问题的原因是sort函数调用的对象的lt函数来比较两个对象的,而复杂的数字类型是不可比较的,也就说没有实现lt函数,所以比较不了。因此,对于list里包含的对象如果都是可以比较的,也就是说实现了lt函数,那么对list调用sort函数是没问题的。Python可是使用++x或者x++之类的操作吗?1.++x操作是可以的,但是这个操作产生的结果和C语言里该操作产生的结果是不一样的,Python里++x操作里的加好只是一个一

  • 浅析蜜罐技术

    前言:蜜罐技术的出现改变了这种被动态势,它通过吸引、诱骗攻击者,研究学习攻击者的攻击目的和攻击手段,从而延缓乃至阻止攻击破坏行为的发生,有效保护真实服务资源。自网络诞生以来,攻击威胁事件层出不穷,网络攻防对抗已成为信息时代背景下的无硝烟战争。然而,传统的网络防御技术如防火墙、入侵检测技术等都是一种敌暗我明的被动防御,难以有效应对攻击者随时随地发起的无处不在的攻击和威胁。蜜罐技术的出现改变了这种被动态势,它通过吸引、诱骗攻击者,研究学习攻击者的攻击目的和攻击手段,从而延缓乃至阻止攻击破坏行为的发生,有效保护真实服务资源。一、什么是蜜罐技术国际蜜罐技术研究组织HoneynetProject的创始人LanceSpitzner给出了蜜罐的权威定义:蜜罐是一种安全资源,其价值在于被扫描、攻击和攻陷。蜜罐并不向外界用户提供任何服务,所有进出蜜罐的网络流量都是非法的,都可能预示着一次扫描和攻击,蜜罐的核心价值在于对这些非法活动进行监视、检测和分析。蜜罐是用来吸引那些入侵者,目的在于了解这些攻击。蜜罐看起来就是一台有一个或者多个可以被攻击者利用漏洞的服务器或计算机主机。他们简单的就如同一个默认安装的操

  • 腾讯云英文作文批改纯文本英语作文批改

    1.接口描述接口请求域名:ecc.tencentcloudapi.com。 接口请求域名:ecc.tencentcloudapi.com纯文本英语作文批改 默认接口请求频率限制:1000次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:ECC。 Version 是 String 公共参数,本接口取值:2018-12-13。 Region 否 String 公共参数,本接口不需要传递此参数。 Content 是 String 作文文本,必填 Title 否 String 作文题目,可选参数 Grade 否 String 年级标准,默认以cet4为标准,取值与意义如下:elementary小学,grade7grade8grade9分别对应初一,初二,初三

  • 冲刺的第二阶段第二天

      登陆参数可以传进去了,但是接口的返回值是json格式的,而我们以前模拟的都是xml格式的,解析的方法不一样了,要重新学

  • [已解决] 数据库连接问题Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection;

    我在学习SSM框架做一个小demo时遇到了这个问题,具体的报错时 Errorqueryingdatabase.Cause:org.springframework.jdbc.CannotGetJdbcConnectionException:FailedtoobtainJDBCConnection;nestedexceptionisjava.sql.SQLException:AnattemptbyaclienttocheckoutaConnectionhastimedout.复制 我的问题是一个jdbc的版本问题 这里还有一篇关于其它问题的解答: https://www.cnblogs.com/TTTTT/p/5926107.html——阳台煮酒 在maven中我引入的是8.0.13版本  <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13<

  • flatten linked list

      A->B->C->D->E | V M | V N 有right和down的linkedlist,要求更新linkedlist变成A->M->N->B->C->D->E,注意M可以还有right,B也可以有down,其实就是递归输出。然后我做了一会才做出,之前有个大神的面经里发过,但我没仔细看很后悔。我昨晚发现这tmd不是inordertraversal么复制   //Classtorepresentanode classNode{ chardata; Nodenext,down; publicNode(chardata){ this.data=data; this.next=null; this.down=null; } } //Methodtoflattenthelist StringflattenList(Nodehead){ if(head==null) return""; //Belowlinesarewritteninthismannertoincreasethecoderead

  • Notepad++删除空行的多种实现办法

    Notepad++支持基础的正则表达式,同时由于自身丰富的插件和功能,所以删除空行或有空格的空行,有多种实现办法,条条大路通罗马,闪电博客抛砖引玉,供大家参考。 一、删除空行(不包括有空格类符号的空行) 1、\r\n转义符替换 按ctrl+h,跳出搜索替换框,把查找模式定义为扩展(\n,\r…) 查找目标:\r\n\r\n 替换为:\r\n 有编程基础的读者应该知道是什么意思了。 2、Textfx插件 先选中要删部分文本内容,如果是整个文件那就全选Ctrl+A,然后使用Notepad++自带的Textfx插件,在长长的列表中找到DeleteBlankLines,点击即可。 注意Notepad++的正则表达式与转义符等之间不兼容,所以局限性较大,不可以直接用正则表达式替换。 二、删除有空格的空行 1、先删除空格,后删除空行 如何删除只有空格行的空格? 在菜单编辑中找到BlankOperations(行编辑),点击移除行尾空白,再用上面的方法删除空行。 2、使用正则表达式删除空格行空格 替换中查找模式

  • mac office 设置默认视图显示比例

    1、打开word 2、fn+option+F11,选中Normal,右键插入模块,复制以下脚本到编辑器中 SubAutoOpen() ActiveWindow.ActivePane.View.Zoom.Percentage=200 EndSub复制 3、关闭重新启动word即可   

相关推荐

推荐阅读