有一套密室专用的模块硬件
硬件接口上是包含输入输出接口,以及密室中常用的灯锁接口
再就是像音乐播放,灯光控制等等接口了
二楼直接放个案例看看
2-案例演示-语音版打地鼠
1-游戏玩法:
1-上个机关启动之后,所有的指示灯闪烁3次,开始播放循环播放北京音效,该游戏启动。
2-此时,随机播放一首音效(1-5首其中一个),并且对应的灯箱亮起,
如果,如果在3秒内按下对应的地鼠按键,灯箱熄灭,连续击中N(可以设置)次之后,所有地鼠快速闪烁5次,播放成功音效,电磁锁打开。
3-如果在规定时间内,没有击中对应的地鼠,或者击错地鼠,游戏失败,播放错误音效,需要从头开始。
2-视频演示:
3-程序源码:
#include "user_file.h"
/**********************************************************************************
+---------------------------------------------------------+
用户函数部分(user_file.h里面有详细使用介绍)
+---------------------------------------------------------+
- 目前进展:
- 日期 :2018-09-08
- 作者 :意想意创.
- 硬件环境:意想意创-A0001-2.6代黑色盒子-音乐模块。
- 软件版本号:V1.0
- 技术论坛:XXXXXXX
- 备注 :本示例在 TKStudio 开发环境下,用2.6代-音乐模块调试OK。
- Copyright(C):青岛意想意创技术发展有限公司。
- All rights reserved
**********************************************************************************/
MODU_Game_Tim Game_Tim={//游戏计时变量
0,0,0
};
uchar Game_Right_Num=0; //游戏成功的次数标记
uchar Game_isGo=0; //游戏流程标记
/*==============================
功能:这是一个串口接受函数,接受到的数据都在buf中配合S(uchar *buf,uchar len)使用
参数:发送的数据和数据长度;
返回:无;
===============================*/
void UART_ReceiveBuffer(uchar *buf,uchar len)
{
/*下面这个历程,接受到什么数据,在转发出去的功能*/
UART1_SendBuffer(buf,len);
}
/*==============================
功能://这是一个1毫秒的中断函数;
参数:无;
返回:无;
===============================*/
void PF_Tim0_1msIT(void)
{
Game_ADD_Tim();
return ;
}
/***************************************
功能:游戏启动函数;
参数:无;
返回:成功1,失败0;
***************************************/
uchar Game_Star(void)//游戏启动函数
{
uchar i=0;
for(i=0;i<3;i++){ //游戏启动之后,所有灯箱闪烁三次
OutSet(0xFF,ENABLE);
delay_ms(500);
OutSet(0xFF,DISABLE);
delay_ms(500);
}
return 1;
}
/***************************************
功能:游戏随机播放音效函数;
参数:无;
返回:返回随机的音乐编号;
***************************************/
uchar Game_Rand_Music(void)//音乐随机播放音效函数
{
uchar Value=0;
while(1){
Value=rand()%6; //随机数值应该比实际需要的数值大1
if(Value!=NO){
Music_Play(Value); //播放对应的音效
return Value;
}
}
}
/***************************************
功能:游戏按键值比对函数;
参数:无;
返回:成功返回1,失败返回2;
***************************************/
uchar Game_Key_ComPare(uchar Value) //游戏按键比对函数;
{
uchar i=0;
static uchar Key_Index[5]={0,0,0,0,0};
for(i=1;i<=5;i++){ //扫描5个地鼠按键
if((Read_Input(i)==1) && (Key_Index[i-1]==NO)){ //如果有按键按下
Key_Index[i-1]=YES;
if(i==Value){
return 1;
}
else{
return 2;
}
}
else if((Read_Input(i)==0) && (Key_Index[i-1]==YES)){
Key_Index[i-1]=NO;
}
}
return 0;
}
/***************************************
功能:地鼠在线定时器函数;
参数:无;
返回:无;
***************************************/
uchar Game_ADD_Tim(void)//游戏计时函数;
{
if(Game_Tim.Star==YES){
if(++Game_Tim.Sec>=1000){
Game_Tim.Sec=NO;
if(++Game_Tim.Cnt>=GAME_TIME){
Game_Tim.Star=second;Game_Tim.Cnt=Game_Tim.Sec=NO; //GAME_TIME秒计时函数
}
}
}
return 1;
}
/***************************************
功能:游戏流程执行函数;
参数:无;
返回:成功返回1,失败返回2;
***************************************/
uchar Game_result(void)//游戏效果执行函数
{
static uchar Index=0;
static uchar Music_Num=0;
uchar Sta=0;
if(Index==NO){
Music_Num=Game_Rand_Music(); //随机播放一首音效
OutSet(Music_Num,ENABLE); //打开对用的灯箱
Game_Tim.Star=YES;Game_Tim.Sec=Game_Tim.Cnt=NO; //打开按键定时器函数
Index=YES;
}
else if(Index==YES){
Sta=Game_Key_ComPare(Music_Num); //按键值和随机的音效值进行比较
if(Sta==YES){ //表示此次按键按对
Game_Tim.Star=Game_Tim.Cnt=Game_Tim.Sec=NO;
Index=NO;
return 1;
}
else if(Sta==second){ //表示是此次按键按错
Index=NO;
Game_Tim.Star=Game_Tim.Cnt=Game_Tim.Sec=NO;
return 2;
}
}
if(Game_Tim.Star==second){
Game_Tim.Star=Game_Tim.Cnt=Game_Tim.Sec=NO;
Index=NO;return 2;
}
return 0;
}
/***************************************
功能:游戏正确效果执行函数;
参数:无;
返回:成功1次返回1,全部成功返回2,;
***************************************/
uchar Game_Right(void)//游戏正确结果执行函数
{
uchar i=0;
Game_Right_Num++;
/*======游戏过关效果=======*/
if(Game_Right_Num>=GAME_TURE_NUM){ //游戏过关之后
Music_Play(6); //游戏过关之后,播放成功音效,并且让所有的地鼠闪烁5次
LockSet(POWEROPEN); //打开电磁锁
for(i=0;i<5;i++){
OutSet(0xFF,ENABLE);
delay_ms(300);
OutSet(0xFF,DISABLE);
delay_ms(300);
}
return 2;
}
/*=======击中一次地鼠效果=======*/
OutSet(0xFF,DISABLE); //关闭正确的灯箱
return 1;
}
/***************************************
功能:游戏错误执行函数;
参数:无;
返回:执行完毕返回1,失败返回0;
***************************************/
uchar Game_Wrong(void)//游戏错误效果执行函数
{
static uchar Index=0;
Game_Right_Num=NO; //清空地鼠的连击次数
OutSet(0xFF,DISABLE); //所有灯箱的灯熄灭
if(Index==NO){
Music_Play(7); //播放错误的地鼠音效
Index=YES;
}
else if((Index==YES) && (Music_Read_FeedBack()==1)){ //等待错误的效果执行完毕
Index=NO;
return 1;
}
return 0;
}
/***************************************
功能:这是一个执行一次的任务;
参数:无;
返回:无;
***************************************/
void Master_Setup()
{
Game_Star(); //游戏启动函数
}
/**************************************
功能:这是一个循环函数;
参数:无;
返回:无;
PS:1-上个机关启动之后,所有的指示灯闪烁3次,开始播放循环播放北京音效,该游戏启动。
2-此时,随机播放一首音效(1-5首其中一个),并且对应的灯箱亮起,
如果,如果在3秒内按下对应的地鼠按键,灯箱熄灭,连续击中N(可以设置)次之后,所有地鼠快速闪烁5次,播放成功音效,电磁锁打开。
3-如果在规定时间内,没有击中对应的地鼠,或者击错地鼠,游戏失败,播放错误音效,需要从头开始。
**************************************/
void Master_Loop()
{
uchar Sta=0;
switch (Game_isGo)
{
case 0:
Game_isGo=Game_result(); //游戏结果函数
break;
case 1:
Sta=Game_Right();
if(Sta==YES){
Game_isGo=NO;
}
else if(Sta==second){
Game_isGo=3;
}
break;
case 2:
if(Game_Wrong())Game_isGo=NO;
break;
default:
break;
}
}