qt小项目——贪吃蛇
标签:
itqt贪吃蛇 |
最近有空余的时间,一直在学习QT上的知识,现在也可以说刚刚入门了吧
开发环境:QT
4.7.0
为了让运行的程序跟实验结果放在同一个文件目录下,我在snake目录下,又创建了一个snake目录,用于放置代码。
http://s14/mw690/003duHwJgy6TIPFrjml8d&690
http://s12/mw690/003duHwJgy6TIPFtPpVdb&690
http://s9/mw690/003duHwJgy6TIPFvoKI68&690
在new一个c++ class 用于存放 游戏界面的代码。
http://s9/mw690/003duHwJgy6TIPHNL2o98&690
运行一遍,会生产一个snake-build-desktop的文件夹,在该文件夹里面建立img文件夹,用于存放图片。
以下是我个人找的素材图片~
http://s3/mw690/003duHwJgy6TIPKrsOKe2&690
Back_img用作背景,game_img用过游戏界面背景,qq_img等4张图片就是蛇其他四个方向,exti_img是推出按钮,qq_img又是进入游戏按钮(没图片素材),food就是食物,一个大美女~
先运行一下,我已经写好的程序:
http://s6/mw690/003duHwJgy6TIPM6RMN95&690
这是我程序的界面的主窗口,点击开始按钮。
http://s3/mw690/003duHwJgy6TIPM8NsSa2&690
这个是游戏界面,点击开始就可以开始游戏了。
之后就可以开始我们的代码开发工作了 。
http://s2/mw690/003duHwJgy6TIPPzvO1d1&690
从上到下,依次是,设置窗口尺寸、设置图标、设置标题。
然后用调色板QPalette 画出背景,其中scaled是改变图片的尺寸。
接着是new一个新的按键,给按键设置图标、大小、以及在窗口的位置、去掉边框。
最后建立信号槽,当检测到按键被按下的时候,执行槽函数。
上图就是按键的槽函数,函数btn_exti是退出函数,跳出弹出框询问框,点击yes,退出游戏.
MainWigdet.h:
接着,来看一下我们的游戏窗口函数。
从上到下,我这个游戏界面有13*13个方格,你也可以理解成坐标,只有的UP、DOWN等,是区别方向定义的,因为你可以通过游戏界面的按钮操控snake的方向。
setAutoFillBackground是设置可以覆盖上一层,这里也就是可以覆盖mainWidget,设置窗口的尺寸,建议跟主窗口的大小一样。
之后也是用调色板设置背景。
再接着就是 new一些按钮出来,然后设置按键的位置
之后跟前面一样,建立槽函数,让按键被点击后,会执行操作。
Direction是方向,一进入游戏界面,snake就要有一个前进的方向,当你点击开始的时候,snake可以根据这个方向前进。
然后是snake的坐标,也是随机的。因为snake以后吃到food的时候会变长,所以用一个二维数组放置它的身体。
接着是food的坐标随机,foodcount是用来记录snake吃到food的个数的,也就是蛇身的长度。
最后,就是new一个定时器了,蛇在运动其实只是一个假象,其实程序做的是,刷新,重新绘制,改变坐标。一样的建立一个槽函数,当设置的timeout的时候,可以执行函数timeoutslot
http://s11/mw690/003duHwJgy6TIPZtWpc0a&690
说明一下,paintEvent这个函数并不是我定义的,是QT本身就有的。当被重定义后,系统本身就会调用该函数 ,感觉就像自动运行的一样。
接着就是放置food跟snake的位置了。
然后,我们来看一下,各个槽函数:
UP、DOWN、LEFT、RIGHT,只是改变direction的值,而开始按钮,则是开启定时器。而返回按钮是delete当前窗口。
http://s16/mw690/003duHwJgy6TIQ3sZ9Zaf&690
http://s15/mw690/003duHwJgy6TIQ3uCV8ae&690
接着就是最后一个槽函数timeoutslot:
从上到下:当snake跟food的坐标一样的时候,也就snake吃到food的时候,产生另一个food ,foodcount自增。
memcpy(snake_save,snake,sizeof(snake));是保存snake的当前坐标,用于蛇撞墙或自杀死后,可以显示最后一个动作,而不会跑过界。
然后是自杀程序,判断条件:只要蛇头坐标等于任意的蛇身坐标。
接着是定义好蛇身坐标以及蛇头坐标,用于下一次刷新是的绘制。
最后是撞墙判断:当snake头的坐标超出设置的边界,就游戏结束。
下图是gamewidget.h:
看了之后有什么不懂的可以留言一下,需要源码的也可以@我一下。希望有自己见解的朋友可以指点一下,比较学习QT才半个月。

加载中…