先将当前的数据读取下来,保存,再加入上一次的数据,混合,再发声。
F(n)=F(n)+F(n-1);
如果是多路回放,F(n)=F(n)+F(n-1)+F(n-2)........
#include <graphics.h>#include <conio.h>//easyx 输入输出(由三部分组成)
#include<time.h>
#include<stdlib.h>
#include <stdio.h>
#include "win32timer.h"
//处理鼠标点击事件,返回值为整数,代表不同的点击区间。
int panduan()
{
int p=0
MOUSEMSG m
FlushMouseMsgBuffer()//清空鼠标缓存区
while(p==0)
{
m = GetMouseMsg()// 获取一条鼠标消息
//m.uMsg整数,判断是点击鼠标事件类型,左键单击,左键双击,右键单击,右键双击。。。。。。
//m.x表示鼠标点击坐标的x轴数值
//m.y表示鼠标点击坐标的y轴数值
if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>20&&m.y<100)
{
p=1//用户单击鼠标左键,并且点击位置的x坐标在300到400之间,y坐标在20到100之间的区域,函数返回整数1
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>20&&m.y<100)
{
p=2
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>20&&m.y<100)
{
p=3
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>100&&m.y<180)
{
p=4
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>100&&m.y<180)
{
p=5
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>100&&m.y<180)
{
p=6
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>180&&m.y<260)
{
p=7
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>180&&m.y<260)
{
p=8
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>180&&m.y<260)
{
p=9
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>260&&m.y<340)
{
p=10
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>260&&m.y<340)
{
p=11
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>260&&m.y<340)
{
p=12
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>340&&m.y<420)
{
p=13
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>340&&m.y<420)
{
p=14
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>340&&m.y<420)
{
p=15
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>420&&m.y<500)
{
p=16
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>420&&m.y<500)
{
p=17
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>420&&m.y<500)
{
p=18
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>500&&m.x<600&&m.y>500&&m.y<520)
{
p=19//退出
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>400&&m.x<500&&m.y>500&&m.y<520)
{
p=20//重新开始
}
if (m.uMsg == WM_LBUTTONDOWN&&m.x>300&&m.x<400&&m.y>500&&m.y<520)
{
p=21//查看答案
}
}
return p
}
int cnt = 0
int stop = 0
void myISR_Called_Per_1000ms(void)//1000毫秒触发一次
{
char time[20]
if(stop ==0){
sprintf(time,"时间: %d秒 ",cnt++)
outtextxy(200,500,time)//在屏幕上显示
}
}
/*
* 使用说明:
*
* 1. 用户程序需要 #include "win32timer.h"
* 2. 用户需要将 win32timer.c 添加至根目录,或添加至工程
*3. 用户程序直接调用UserTimerSet(uDelay,UserFun)即可,
*其中,uDelay为定时调用的定时周期,单位为毫秒(ms),
*UserFun为用户被调函数void ISR(void)的函数名ISR。
* 4. 可以同时使用多个timeSetEvent,每个timeSetEvent都可以
*返回定时器编号,详细见MSDN关于timeSetEvent的说明。
*/
void main()
{
IMAGE a,b,shangbiao,xiabiao,kandaan,chenggong
//将图片转化成二进制数据
int c,z=0,e=0
int butong[18]
initgraph(600, 520)//初始化图形系统,参数定义窗口大小
int i,p,w1=0
char x[10],y[10],w[10]
loadimage(&shangbiao,"shangbiao.jpg")//装载图片到内存变量
loadimage(&xiabiao,"xiabiao.jpg")//装载图片到内存变量
loadimage(&kandaan,"kandaan.jpg")//装载图片到内存变量
loadimage(&chenggong,"chenggong.jpg")//装载图片到内存变量
loadimage(&a,"a.jpg")//装载图片到内存变量
loadimage(&b,"b.jpg")//装载图片到内存变量
c=2
UserTimerSet ( 1000, myISR_Called_Per_1000ms ) //新加;设置定时器,每秒钟触发一次,调用myISR_Called_Per_1000ms函数
do{
stop = 0//重新初始化计数器
cnt= 0
z=0,e=0
putimage(0,20,&a)//在坐标(0,20)处绘制图形a.jpg
putimage(0,0,&shangbiao)//在坐标(0,0)处绘制图形shangbiao.jpg
putimage(0,500,&xiabiao)//在坐标(0,500)处绘制图形xiabiao.jpg。
putimage(300,20,&b)//在坐标(300,20)处绘制图形b.jpg。
putimage(300,500,&kandaan)//在坐标(300,500)处绘制图形kandaan.jpg。
for(i=0i<18i++)//利用循环对数组butong赋初值为0
{
butong[i]=0
}
butong[0]=11
butong[1]=18
sprintf(x,"%d",c)//数值变量c的初值为2,此处将数值c的值转换为字符串形式,存储在字符数组变量x中,即x中存储的是“2”。
outtextxy(70,500,x)//在坐标(70,500)处,打印显示x字符串内容“2”。表示 总错数:2
sprintf(y,"%d",z)//数值变量z的初值为0,此处将数值z的值转换为字符串形式,存储在字符数组变量y中,即y中存储的是“0”。
outtextxy(170,500,y)//在坐标(170,500)处,打印显示y字符串内容“0”。表示 找到数:0
sprintf(w,"点击次数:%d次",w1)
outtextxy(0,420,w)
do{
p=panduan()//调用pandun函数,进行鼠标点击事件的处理。
w1=w1+1
sprintf(w,"点击次数:%d次",w1)
outtextxy(0,420,w)
if(p==20){
stop = 0
cnt = 0//新加。清除计时器
w1=0
break//函数返回20表示点击的是“重新开始”。跳出该次do-while;因为p=20,所以继续执行外层的do-while。
}
if(p==19)exit(0)//函数返回10表示点击的是“退出游戏”,exit函数结束程序执行。
if(p==21) //函数返回21表示点击的是“查看答案”
{
stop=-1//新加,查看答案时,停止计时器。
setlinecolor(BLUE)//设置划线的颜色
for(i=0i<ci++)//c为总的不同数2,循环2次。
{ //butong 数组前两个变量被定义为11,18
e=butong[i]
if(e==18)
{
rectangle(500,420,600,500)//e==18时执行;界面中绘制矩形图形,参数为矩形的左上顶点坐标和右下顶点坐标
}
else{
rectangle(400,260,500,340)
}
}
}
for(i=0i<ci++)//循环查看是否找到不同
{
if(p==butong[i])//返回值p是否与不同数组中预制的数值 11 18 相同,相同即认为找到。
{
setlinecolor(RED)//设置划线颜色为红色
if(p==18)//p为18
{
rectangle(500,420,600,500)//在18对应的位置绘制矩形
}
else
{
rectangle(400,260,500,340)//在11对应的位置绘制矩形
}
z=z+1//找到数 加1
sprintf(y,"%d",z)//数值z转换为字符串存入到y中
outtextxy(170,500,y)//界面中更新找到数
}
}
}while(z<c)//只有找到数小于总错误数,循环继续执行。否则循环退出。
if(z=c&&p!=20)//判断总错数是否和找到数相同,并且是否p不等于20
{
putimage(200,100,&chenggong) //绘制图形成功
stop=-1//新加,成功时,停止计时器。
p=panduan()//继续等待用户选择命令。但此处用户选择“重新开始”则游戏重新开始,用户点击其他任意一点,程序都会退出。
}
}while(p==20)
}
1.udelay()mdelay()ndelay()实现的原理本质上都是忙等待,ndelay和mdelay都是通过udelay衍生出来的,我们使用这些函数的实现往往会碰到编译器的警告implicit declaration of function'udelay',这往往是由于头文件的使用不当造成的。在include/asm-???/delay.h中定义了udelay(),而在include/linux/delay.h中定义了mdelay和ndelay.
udelay一般适用于一个比较小的delay,如果你填的数大于2000,系统会认为你这个是一个错误的delay函数,因此如果需要2ms以上的delay需要使用mdelay函数。
2.由于这些delay函数本质上都是忙等待,对于长时间的忙等待意味这无谓的耗费着cpu的资源,因此对于毫秒级的延时,内核提供了msleep,ssleep等函数,这些函数将使得调用它的进程睡眠参数指定的时间。
应用层:
#include <unistd.h>
1、unsigned int sleep(unsigned int seconds)秒级
2、int usleep(useconds_t usec) 微秒级:1/10^-6
#define _POSIX_C_SOURCE 199309
#include <time.h>
3、int nanosleep(const struct timespec *req, struct timespec *rem)
struct timespec {
time_t tv_sec /* seconds */
long tv_nsec /* nanoseconds */
}
// The value of the nanoseconds field must be in the range 0 to 999999999.
内核层:
include <linux/delay.h>
1、void ndelay(unsigned long nsecs)纳秒级:1/10^-10
2、void udelay(unsigned long usecs)微秒级: 1/10^-6
3、void mdelay(unsigned long msecs)毫秒级:1/10^-3
sleep_on(), interruptible_sleep_on()
sleep_on_timeout(), interruptible_sleep_on_timeout()
根据你的情况选用这些函数,注意: sleep *** 作在kernel必须小心、小心。。。
udelay()等函数是cpu忙等,没有传统意义上的sleep。这些函数相当于我们平时的阻塞读、写之类的语义,主要用于等外设完成某些 *** 作
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)