加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

qt小项目——贪吃蛇

(2015-07-10 10:42:13)
标签:

it

qt

贪吃蛇

最近有空余的时间,一直在学习QT上的知识,现在也可以说刚刚入门了吧  ,这一个星期一直在看传一学院的视频——贪吃蛇。看完后,总体上,我将其实现了,现在来分享一下我的经验,以及一些注意事项。

 

开发环境:QT 4.7.0 

 


为了让运行的程序跟实验结果放在同一个文件目录下,我在snake目录下,又创建了一个snake目录,用于放置代码。

 http://s8/mw690/003duHwJgy6TIPBWmW307&690

http://s14/mw690/003duHwJgy6TIPFrjml8d&690

http://s12/mw690/003duHwJgy6TIPFtPpVdb&690

http://s9/mw690/003duHwJgy6TIPFvoKI68&690


 

 

 

 

new一个c++ class 用于存放 游戏界面的代码。

 

 

 http://s12/mw690/003duHwJgy6TIPHLIsHfb&690


http://s9/mw690/003duHwJgy6TIPHNL2o98&690

运行一遍,会生产一个snake-build-desktop的文件夹,在该文件夹里面建立img文件夹,用于存放图片。

以下是我个人找的素材图片

http://s3/mw690/003duHwJgy6TIPKrsOKe2&690

 

Back_img用作背景,game_img用过游戏界面背景,qq_img4张图片就是蛇其他四个方向,exti_img是推出按钮,qq_img又是进入游戏按钮(没图片素材),food就是食物,一个大美女~

 

先运行一下,我已经写好的程序:

http://s6/mw690/003duHwJgy6TIPM6RMN95&690

这是我程序的界面的主窗口,点击开始按钮。

http://s3/mw690/003duHwJgy6TIPM8NsSa2&690

 

这个是游戏界面,点击开始就可以开始游戏了。

 

之后就可以开始我们的代码开发工作了

 

http://s2/mw690/003duHwJgy6TIPPzvO1d1&690

从上到下,依次是,设置窗口尺寸、设置图标、设置标题。

然后用调色板QPalette 画出背景,其中scaled是改变图片的尺寸。

接着是new一个新的按键,给按键设置图标、大小、以及在窗口的位置、去掉边框。

最后建立信号槽,当检测到按键被按下的时候,执行槽函数。

 http://s13/mw690/003duHwJgy6TIPQW18Ubc&690


 

上图就是按键的槽函数,函数btn_exti是退出函数,跳出弹出框询问框,点击yes,退出游戏.

 而函数btn_start是进入游戏界面的,其中gamewigdet,是我们刚刚创建的窗口,要把它show出来。

MainWigdet.h:

 

 http://s2/mw690/003duHwJgy6TIPSXOLfe1&690


接着,来看一下我们的游戏窗口函数。

 http://s10/mw690/003duHwJgy6TIPUT1oZf9&690


 

从上到下,我这个游戏界面有13*13个方格,你也可以理解成坐标,只有的UPDOWN等,是区别方向定义的,因为你可以通过游戏界面的按钮操控snake的方向。

setAutoFillBackground是设置可以覆盖上一层,这里也就是可以覆盖mainWidget,设置窗口的尺寸,建议跟主窗口的大小一样。

之后也是用调色板设置背景。

 http://s16/mw690/003duHwJgy6TIPWsDYr1f&690


再接着就是 new一些按钮出来,然后设置按键的位置

 

 

之后跟前面一样,建立槽函数,让按键被点击后,会执行操作。

Direction是方向,一进入游戏界面,snake就要有一个前进的方向,当你点击开始的时候,snake可以根据这个方向前进。

然后是snake的坐标,也是随机的。因为snake以后吃到food的时候会变长,所以用一个二维数组放置它的身体。

接着是food的坐标随机,foodcount是用来记录snake吃到food的个数的,也就是蛇身的长度。

最后,就是new一个定时器了,蛇在运动其实只是一个假象,其实程序做的是,刷新,重新绘制,改变坐标。一样的建立一个槽函数,当设置的timeout的时候,可以执行函数timeoutslot

 

 

 

 http://s9/mw690/003duHwJgy6TIPZs2Zae8&690


http://s11/mw690/003duHwJgy6TIPZtWpc0a&690

说明一下,paintEvent这个函数并不是我定义的,是QT本身就有的。当被重定义后,系统本身就会调用该函数 ,感觉就像自动运行的一样。

接着就是放置foodsnake的位置了。

 

 http://s6/mw690/003duHwJgy6TIQ1clal85&690


然后,我们来看一下,各个槽函数:

 

UPDOWNLEFTRIGHT,只是改变direction的值,而开始按钮,则是开启定时器。而返回按钮是delete当前窗口。

 http://s11/mw690/003duHwJgy6TIQ3r6f81a&690


http://s16/mw690/003duHwJgy6TIQ3sZ9Zaf&690

http://s15/mw690/003duHwJgy6TIQ3uCV8ae&690

接着就是最后一个槽函数timeoutslot

 

 

 

从上到下:当snakefood的坐标一样的时候,也就snake吃到food的时候,产生另一个food foodcount自增。

memcpy(snake_save,snake,sizeof(snake));是保存snake的当前坐标,用于蛇撞墙或自杀死后,可以显示最后一个动作,而不会跑过界。

 

然后是自杀程序,判断条件:只要蛇头坐标等于任意的蛇身坐标。

 

接着是定义好蛇身坐标以及蛇头坐标,用于下一次刷新是的绘制。

 

最后是撞墙判断:当snake头的坐标超出设置的边界,就游戏结束。

 

下图是gamewidget.h:

 

 

 http://s2/mw690/003duHwJgy6TIQ5C4qBa1&690


看了之后有什么不懂的可以留言一下,需要源码的也可以@我一下。希望有自己见解的朋友可以指点一下,比较学习QT才半个月。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有