项目源码地址:class02_Qt贪吃蛇: 计算机软件实习项目2 (gitee.com)
一、需求分析
玩家可以控制贪吃蛇在屏幕上移动,屏幕上会随机出现“食物”,贪吃蛇碰到食物自身长度加一,得分加一,当蛇碰到墙壁或自身,游戏结束
二、界面设计
两个界面:开始界面(用于选择关卡难度)、主游戏界面
开始界面
通过下拉选项框进行难度的选择
点击开始游戏后,窗口将下拉列表的序号返回一个值,这个值我们用游戏窗口接收,并用它表示难度,即速度
主游戏界面
具体界面生成实现在代码中
三、算法设计
由于涉及按钮点击,界面绘制,所以选择重写事件函数来进行游戏。
先来了解一下qt事件机制,事件机制是Qt最难以理解且最为精妙的一部分。事件主要分为两种:
在与用户交互时发生。比如按下鼠标(mousePressEvent),敲击键盘(keyPressEvent)等。
系统自动发生,比如计时器事件(timerEvent)等。
在发生事件时(比如说上面说的按下鼠标),就会产生一个QEvent对象(这里是QMouseEvent,为QEvent的子类),这个QEvent对象会传给当前组件的event函数。如果当前组件没有安装事件过滤器(这个下文会提到),则会被event函数发放到相应的xxxEvent函数中(这里是mousePressEvent函数)。
在这个游戏中我们需要重写绘制事件,定时事件,按键事件
void paintEvent(QPaintEvent *event);
void timerEvent(QTimerEvent *event);
void keyPressEvent(QKeyEvent *event);
绘制事件:负责绘制食物和蛇,使用QPainter类来进行页面的绘画,QPainter也只能在绘制事件中使用,QPainter类方法主要有drawArc()画弧,drawChord()画弦,drawEllipse()画椭圆,drawLine()
定时事件:实现移动和判断游戏结束。开始定时事件使用startTimer()函数,参数为多久调用一次。为了实现蛇的移动,在定时事件中调用update()即再次进行绘制事件,更新界面
按键事件:实现按键的点击,每进行一次点击QEvent类会接收一个key,通过key()方法判断该按键,进行坐标增减