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

扬州高端网站建设教育网站制作下载

扬州高端网站建设,教育网站制作下载,爱站网 关键词挖掘工具站长工具,企业网搭建照例先演示一下#xff1a; 一个简单的Qt贪吃蛇#xff0c;所有的图片都是我自己画的#xff08;得意#xff09;。 大致的运行逻辑和之前那个200行写一个C小黑窗贪吃蛇差不多#xff0c;因此在写这个项目的时候#xff0c;大多情况是在想怎么通过Qt给展现出来。 背景图…照例先演示一下 一个简单的Qt贪吃蛇所有的图片都是我自己画的得意。 大致的运行逻辑和之前那个200行写一个C小黑窗贪吃蛇差不多因此在写这个项目的时候大多情况是在想怎么通过Qt给展现出来。 背景图片 由于背景图片是自己画的因此大小是刚刚好符合我设定的主窗口大小的直接是把背景图放大两倍然后放在坐标为0,0的位置上下面这段代码写在绘画事件的函数里窗口初始化的时候系统会自动调用绘画事件因此我们不用手动去调用就可以实现背景图片的渲染。 QPainter* paint new QPainter(this);//画背景,可以修改为可选背景,感兴趣可以自己去搞一下QPixmap background;background.load(:/image/background.png);backgroundbackground.scaled(background.width()*2, background.height()*2);paint-drawPixmap(0,0,background); 那么除了背景图片以外还有要画的就是蛇和食物了这里的食物我画了我最喜欢的水果——芭乐应该看得出来叭所以在主窗口里需要有对应的蛇和食物的类并且这些类里需要有它们所在位置的坐标然后再绘画事件里根据它们的坐标来绘制。 画食物比较简单直接在食物的坐标上绘制就行。 有界面的贪吃蛇和小黑窗不一样我们需要展示出蛇的移动方向也就是说不同的移动方向蛇头 应该看起来是不一样的所以在绘画蛇头的时候我们需要判断蛇的移动方向以此来决定蛇头应该用哪个图片。直接旋转图片有些麻烦所以我直接画了四个方向的蛇头图片。 蛇身子应该也是要根据移动的情况而绘制不同的图片的但是逻辑太复杂了不仅要考虑蛇的每一节身子是上下方向的还是左右方向的甚至有些身子是弯曲的转向的所以我直接投降了把蛇的身子画成圆乎乎的这样就分辨不出什么方向什么的了统一用同一个图片就好啦。 蛇尾和蛇头类型也是要根据具体情况来绘制不同的图片不过和蛇头不一样的是蛇尾的图片不取决与蛇的移动方向因为蛇尾具有滞后性所以判断的依据是蛇的最后一节身子。 if (isBegin) { //当游戏开始时才画蛇和食物//画食物QPixmap bale;bale.load(:/image/bale.png);paint-drawPixmap(food[0],food[1],bale);//画蛇头QPixmap snakeHead;//根据蛇移动的方位来改变蛇头的图片if(greedysnake.directionr)snakeHead.load(:/image/head(right).png); else if(greedysnake.directionl)snakeHead.load(:/image/head(left).png);else if(greedysnake.directionu)snakeHead.load(:/image/head(up).png);else snakeHead.load(:/image/head(down).png);paint-drawPixmap(greedysnake.head[0], greedysnake.head[1], snakeHead);//画蛇身for (auto body : greedysnake.body) {QPixmap snakeBody;snakeBody.load(:/image/body.png);paint-drawPixmap(body[0], body[1], snakeBody);}//画蛇尾QPixmap snakeTail;vectorintlastbody *(greedysnake.body.end() - 1);//根据蛇的最后一节身子来改变蛇尾的图片if (greedysnake.tail[0] lastbody[0]) {if (greedysnake.tail[1] lastbody[1]) snakeTail.load(:/image/tail(up).png);else snakeTail.load(:/image/tail(down).png);}else if (greedysnake.tail[1] lastbody[1]) {if (greedysnake.tail[0] lastbody[0]) snakeTail.load(:/image/tail(left).png);else snakeTail.load(:/image/tail(right).png);}paint-drawPixmap(greedysnake.tail[0],greedysnake.tail[1],snakeTail);} 生成食物 生成食物的时间点在游戏刚开始的时候以及蛇吃掉食物以后。 生成食物其实就是更新食物的坐标我们使用随机数去生成并且我这边设置的是食物大小是50*50像素的并且蛇的每一节身子都是50*50像素的所以我们在生成坐标的时候需要保证生成出来的坐标是50的倍数包括蛇自身的坐标。 并且生成出来的坐标不能在蛇身上。 void MainUI::createFood(){//生成食物std::uniform_int_distributionintuw(0,1300/50-1);std::uniform_int_distributionintuh(1,800/50-1);bool flag true;while (1) {flag true;int x uw(e)*50; int y uh(e)*50;//不能生成在蛇头的位置if (x greedysnake.head[0] y greedysnake.head[1]) continue;//不能生成在蛇尾的位置if (x greedysnake.tail[0] y greedysnake.tail[1]) continue;//不能生成在蛇身的位置for (const auto body : greedysnake.body) {if (body[0] x body[1] y) {flag false;break;}}if (flag) {food[0] x, food[1] y;qDebug() x y endl;break;}} } 让蛇动起来 Qt有定时器这是对比小黑窗来说比较方便的一个点我们可以通过定时器每个一段时间就更新蛇的坐标然后再更新绘图以此来达到让蛇移动的效果。 每次移动蛇我们就把蛇头的坐标按照移动的方向来做出改变。而蛇的身子要达到移动的效果则是把最后一节身子的坐标从身子里删去然后在存放身子的容器的开头加上移动前蛇头的坐标这样蛇的身子也就可以达到移动的效果了。 而蛇的尾部只需要更新成移动前蛇的最后一节身子的坐标即可。 在移动的时候我们还应该有个判断如果吃到了芭乐即新蛇头的坐标等于芭乐的坐标那么身子加长并且重新生成新的芭乐。加长身子是将移动前头的坐标加入到蛇身子的容器的开头而芭乐的坐标成为新的蛇头的坐标这样就达到了增长的效果。 除了判断食物我们还应该判断如果吃到了自己的身体我们就应该弹出一个消息提示框可以选择是否重新开始一局游戏。 如果蛇移动移出了边界那么可以判断是失败了而我这里的处理是可以穿越到界面的另一侧继续游戏这样降低了难度增加了可玩性。 void MainUI::timerEvent(QTimerEvent* e){ //定时器if (isBegin) { //如果开始游戏//蛇的移动greedysnake.body.insert(greedysnake.body.begin(), greedysnake.head);greedysnake.tail *(greedysnake.body.end() - 1);greedysnake.body.pop_back();if (greedysnake.direction r) greedysnake.head[0] greedysnake.speed;else if (greedysnake.direction l) greedysnake.head[0] - greedysnake.speed;else if (greedysnake.direction u) greedysnake.head[1] - greedysnake.speed;else greedysnake.head[1] greedysnake.speed;for (auto body : greedysnake.body) {//如果碰到身体if (body[0] greedysnake.head[0] body[1] greedysnake.head[1]) {isBegin false;killTimer(TimerID);QMessageBox::StandardButton ans QMessageBox::question(this, game over, QString::fromLocal8Bit(你吃到了自己,游戏结束,是否在来一把));if (ans QMessageBox::No) {exit(0);}else {//手动初始化一下蛇greedysnake.head { 650,350 };greedysnake.body {{ 600, 350 }};greedysnake.tail { 550,350 };beginGame();}return;}}if (greedysnake.head[0] food[0] greedysnake.head[1] food[1]) {//如果吃到食物,身体变长并且重新生成食物.greedysnake.body.insert(greedysnake.body.begin(), greedysnake.head);if (greedysnake.direction r) greedysnake.head[0] greedysnake.speed;else if (greedysnake.direction l) greedysnake.head[0] - greedysnake.speed;else if (greedysnake.direction u) greedysnake.head[1] - greedysnake.speed;else greedysnake.head[1] greedysnake.speed;//增加难度,加快速度,不要也可以if (greedysnake.body.size() 5) { killTimer(TimerID);TimerID startTimer(200); //通过改变调用定时器的频率来达到改变蛇的速度}else if (greedysnake.body.size() 10) {killTimer(TimerID);TimerID startTimer(180);}else if (greedysnake.body.size() 15) {killTimer(TimerID);TimerID startTimer(150);}else if (greedysnake.body.size() 20) {killTimer(TimerID);TimerID startTimer(120);}else if (greedysnake.body.size() 25) {killTimer(TimerID);TimerID startTimer(100);}createFood();}//全屏移动,即可以从下面穿过,到达上面if (greedysnake.head[0] 0) greedysnake.head[0] 1250;if (greedysnake.head[0] 1300)greedysnake.head[0] 0;if (greedysnake.head[1] 800) greedysnake.head[1] 50;if (greedysnake.head[1] 0) greedysnake.head[1] 800;update(); //更新绘图} } 按键事件 主要的核心功能就在上面了我这里最后补充一个按键操控蛇的点。 我们可以通过重写窗口的按键事件来获取到玩家按下的按钮。 通过e-key()来获取一个整型数据,每个按钮都对应一个数值我一个个把按键试出来了然后写了个逻辑如果在一开始的时候我们除了可以通过鼠标点击来开始游戏也可以通过按下回车键来开始另外也可以按下空格来开始游戏但是实际上我没有写关于空格的逻辑但是它就是可以通过空格来触发那个按钮。 另外在游戏中可以按下空格来暂停游戏。 值得一提的是在改变蛇的移动方向的时候需要注意不能直接180°转弯。 void MainUI::keyPressEvent(QKeyEvent* e){int nowKey e-key();if (nowKey 16777220) { //回车键if(begin!nullptr) begin-click();}if (isBegin) {//修改运动方向,注意不能直接180°转弯if ((nowKey 87 || nowKey 16777235) greedysnake.direction ! d) greedysnake.direction u;else if ((nowKey 83 || nowKey 16777237) greedysnake.direction ! u) greedysnake.direction d;else if ((nowKey 65 || nowKey 16777234) greedysnake.direction ! r) greedysnake.direction l;else if ((nowKey 68 || nowKey 16777236) greedysnake.direction ! l)greedysnake.direction r;else if (nowKey 32) isBeginfalse;}else {if (nowKey 32) isBegin true;} } 小结 我的评价是不管是学习什么技术最好的练手项目就是写一个贪吃蛇之前学CjavapythonC的时候都写了贪吃蛇而现在学了qt也写了个贪吃蛇这对于巩固基础有着非常好的效果。 想要源码的小伙伴可以直接在我CSDN的主页里找到对应的资源免费下载我已经上传到SCDN了也可以关注我的微信公众号折途想要敲代码回复关键词“qt贪吃蛇”领取完整的源码。
http://www.hkea.cn/news/14314333/

相关文章:

  • 西充县住房和城乡建设局网站做pc端网站资讯
  • wordpress恢复老版本班级优化大师头像
  • 找设计公司上哪个网站58同城成都网站建设名录
  • 卖房子上哪个网站最好卖地方门户
  • 成都郫县网站建设学校网站建设及使用
  • 中国建设银行车主卡网站小程序是怎么制作出来的
  • 查建设工程业绩在哪个网站域名备案要多久
  • 水果商城网站模板网站做seo推广方案
  • asp网站生成静态广东企业网站建设哪家好
  • 手机网站建设视频小说网站分页关键字怎么做
  • 深圳企业建网站公司网站开发的初级技术员
  • 做公司网站需要什么手续吉林住房和城乡建设部网站
  • 网站建设辅助导航天水市建设银行官方网站
  • 最新某地方装修门户源码 php装饰公司程序 dede行业网站模板wordpress postmeta表
  • 网站做很多关键词网站空间管理信息
  • 深圳个人做网站我想来做外贸网站来推广
  • 申请网站一年多少钱网络会议
  • 园林绿化网站建设怎么网上宣传自己的产品
  • 如何建设销售型企业网站佛山网络公司哪家便宜
  • 个人网站建设教程视频免费windows云服务器
  • 怎样做微商网站做网站推广有什么升职空间
  • 怎样制作网站工装效果图网站
  • 免费英文网站建设网站后台内容管理
  • 免费网站建设方案优化做网站平台
  • 做学校和企业对接的网站看电视剧的免费网站大全
  • 国外图片设计网站有哪些网站代码案例
  • 营销型网站建设风格设定wordpress 段落显示
  • 垂直门户网站有哪些医院网站建设方案计划书
  • 广告品牌设计机构网站织梦模板建标网
  • 网页托管平台排名工具seo