概述
- 很多人第一眼看到就想到了rank()函数;但是这个函数生成的随机数是一个伪随机数,这就意味着每次断电后重新启动就会和上一次出现的随机数一模一样的顺序,这就导致了每次方块的顺序都是一样的。
- 还有一个函数就是srand();函数,他可以改变rank函数产生伪随机数的顺序,所以我们要两个函数一起调用,就可以产生一个比较接近的真随机数。
- 在一般数字电路中使用到的ADC在正常情况下由于环境噪声的普遍存在,ADC产生的数据最后一位总是在变化,而且是完全随机的变化,利用这一点即可产生随机数。
示例代码如下:
srand(Get_Adc(ADC_Channel_1));
what=rand()%19+1;//what就代表着不同俄罗斯方块
下面再给一个配置stm32adc的程序:
#include "adc.h"
/*******************************************************************************
* 函 数 名 : ADCx_Init
* 函数功能 : ADC初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ADCx_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//ADC
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//1个转换在规则序列中 也就是只转换规则序列1
ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
ADC_Cmd(ADC1, ENABLE);//开启AD转换器
ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
}
/*******************************************************************************
* 函 数 名 : Get_ADC_Value
* 函数功能 : 获取通道ch的转换值,取times次,然后平均
* 输 入 : ch:通道编号
times:获取次数
* 输 出 : 通道ch的times次转换结果平均值
*******************************************************************************/
u16 Get_ADC_Value(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5); //ADC1,ADC通道,239个周期,提高采样时间可以提高精确度
for(t=0;t<times;t++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
temp_val+=ADC_GetConversionValue(ADC1);
}
return temp_val/times;
}
到这里就整体的就差不多完成了,下一篇介绍一下游戏机里面几个页面的切换,包括结束游戏和统计分数。
总工程文件:点击下载
最后
以上就是饱满店员为你收集整理的基于stm32的俄罗斯方块游戏机(5、俄罗斯方块产生的随机函数)(大三寒假)的全部内容,希望文章能够帮你解决基于stm32的俄罗斯方块游戏机(5、俄罗斯方块产生的随机函数)(大三寒假)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复