摘要
本课程设计旨在数码管上编写一个有完整环节的可联机游戏,在课程设计中采用了设置中断,编写回调函数的方法,将学习板的运行程序多线程化并使用485通信实现双机联机游戏的功能。并在本次课程设计中成功完成了一款有完整环节的可联机游戏。
关键字:数码管,联机,游戏,485,回调函数,中断,多线程
绪论
课程设计的主题是实现一个在数码管显示通过按键操作的联机游戏;由于STC-B学习板的使用的是数码管显示同时按键个数较少,可以实现的游戏种类单一且大部分为单机游戏,本次课程设计旨在设计一款在STC-B上运行的具有完整环节和一定趣味性的可联机游戏,以填补在数码管上显示的游戏部分空白,同时锻炼学习相关的中断和回调函数之间的灵活运用。
正文
功能介绍:
在学习板上按键key3为切换单机和联机模式,初始为单机模式,在单机情况下游戏初始界面如下图:
此界面为游戏准备阶段右边的7个数码管为上次游戏所得分数这里初始为0,最左边的数码管显示的是“拼图碎片”,在游戏开始时如上图右图所示通过导航按键的上下可以操作最左边的“拼图碎片”同时左边会随机出现一个缺一角的“图片”当左边的拼图碎片与右边的图形合在一起恰好形成一个带小数电的数字8时(即合起来恰好数码管全点亮)则得一分,并继续游戏,在游戏中按下key1会暂停游戏,这时数码管上回固定你的拼图碎片同时在右侧显示出目前的得分,再次按下key1后可以继续游戏(此时会触发游戏暂停惩罚图形会往前移一格)。若失败则学习板发出提醒声音游戏结束,在右侧显示本次游戏的得分(如下图)。(与暂停时情况类似但此时key1无法开始游戏),在游戏任何时候按下key2可以重新开始游戏(但分数会归0)。
在游戏进行时随着游戏得分的增加,图形移动速度也会增加,得分每多5分游戏速度会升一级最高5级。
游戏任何时候按下key3切换模式,切换到联机模式时,在联机模式中双方初始状态如下
左侧数码管显示为双方目前的得分,右边的两个数码管靠左的数码管显示的是设置的难度等级,最右边的数码管显示的是对方下一次游戏时会出现的图形。此时通过key1,key2可以对难度和图形进行设置,设置完成后往下按下导航按键,此时对方进入游戏,出现的难度和图形与自己设置一致,设置难度越高对方成功拼图后得分也越高,对方若失败则学习板发出提醒声音对方游戏结束
对方此时不能再进入游戏得分但可以继续设置难度和图形发送,当双方玩家均失败后得分高的玩家会播放胜利音乐,若分数相同则双方都播放音乐。播放音乐过程中或播放结束都可以重新开始游戏,而一旦任何一方重新开始游戏双方分数都会清零然后重新开始游戏。
设计思路
1,碎片和图形的设计:
在单机模式中为了在数码管上显示出自己想要的图形,在main.H中修改了decode_table数组将自己设计的图形数据添加进去。
2,游戏速度的实现:
为了做出游戏速度加快的效果在回调函数进行计数,根据计数的情况来运行程序,然后修改计数的量就可以达到每次修改运行程序的时间不同以达到修改游戏时间的目的
3,单机联机的模式切换:
采用定义全局变量为标志位,通过标志位的不同从而运行不同的程序,这样在按键回调函数改变标志位的值就能够实现模式的转换
4,联机对方和己方的识别:
在485通信中除了2个字节的信息还有对方板子的信息包括对方的得分以及对方游戏的状态以及发送时的状态
5,数码管的实时更新:
在1ms的中断回调函数中更新数码管的信息这样程序在任意位置改变数码管的信息时都能及时的显示在数码管上
总体设计方案
1,数码管的实时更新函数:
void updatadisp() //显示更新函数
{
Seg7Print(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7]);
}
2,游戏的回调函数
在标志位format取不同值时,进行不同的模式在单机和联机模式中的游戏进行时都会进行计数操作来达到改变游戏速度的功能
void Play_callback() //游戏回调函数
{
if (format == 0)
{
if (flag == 0)
{
time++;
if (time == delay)
{
PlayGame();
time = 0;
if (score1 < 5)
delay = 100;
else if (score1 < 10)
delay = 80;
else if (score1 < 15)
delay = 50;
else if (score1 < 20)
delay = 40;
else if (score1 < 25)
delay = 35;
else
delay = 30;
}
}
else
PlayGame();
}
if (format == 1)
{
if (flag2 == 0)
PlayGameTogater();
else
{
time++;
if (time == delay)
{
PlayGameTogater();
time = 0