池塘夜降彩虹雨

#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>


#pragma comment(lib,"winmm.lib")


#define rainspeed 37
#define waterstep 1


typedef struct{
int wx,wy;
int wnum;
int ci;
}wave;


typedef struct raindrop{
int color;
int startx,starty;
int endx,endy;
int x,y;
int size;
int flag;
wave rainwave;
struct raindrop *next;
}raindrop;


raindrop *rainhead;
int rainnum;
char isthunder='s';


void clearrain(raindrop *r);
void clearwave(raindrop *r,int a);
void createrain();
void drawrain();
void drawwave(raindrop *r,int a);
void flushrain(raindrop *p);
void rain();
void pool();
void thunder();
void rainsound();
int raintype(int a);
raindrop *initrain();


void drawrain(raindrop *r){
setcolor(r->color);
line(r->startx,r->starty,r->x,r->y);
}


void clearrain(raindrop *r){
if(r->starty<=430)
setcolor(BLACK);
else 
setcolor(BLUE);
line(r->startx,r->starty,r->x,r->y);
}


void drawwave(raindrop *r,int a){
setcolor(r->color);
ellipse(r->endx-a*3,r->endy-a,r->endx+a*3,r->endy+a);
}


void clearwave(raindrop *r,int a){
setcolor(BLUE);
ellipse(r->endx-a*3,r->endy-a,r->endx+a*3,r->endy+a);
}


raindrop *initrain(){
raindrop *r;
int R,G,B;
r=(raindrop*)malloc(sizeof(raindrop));
R=rand()%255;
G=rand()%255;
B=rand()%255;
r->color=RGB(R,G,B);
r->startx=rand()%800;
r->starty=rand()%600;
r->endx=r->startx;
r->endy=450+rand()%150;
r->size=10;
r->x=r->startx;
r->y=r->starty+r->size;
r->flag=0;
r->rainwave.wx=r->endx;
r->rainwave.wy=r->endy;
r->rainwave.wnum=rand()%10;
r->rainwave.ci=1;
r->next=NULL;
return r;
}


int raintype(int a){
int num;
switch(a){
case 1:
num=57;
break;
case 2:
num=97;
break;
case 3:
num=270;
break;
case 4:
num=370;
break;
case 5:
num=570;
break;
default:
num=rand()%370+57;
break;
}
return num;
}


void createrain(){
raindrop *r1,*r2;
int i;
r1=initrain();
rainhead=r1;
for(i=0;i<rainnum;i++){
r2=initrain();
r1->next=r2;
r1=r2;
}
}


void flushrain(raindrop *p){
raindrop *f,*n;
int tag=0;
for(p=rainhead;p;p=p->next){
if(p->rainwave.ci > p->rainwave.wnum)
p->flag=2;
if(p->y <= p->endy){
p->starty = p->y;
p->y = p->y + p->size;
}
else if(p->flag == 2 && p->y > p->endy){
if(p==rainhead){
tag++;
rainhead=rainhead->next;
}
else {
tag++;
f->next=p->next;
p=f;
}
}
else
p->flag=1;
f=p;
}
for(;tag>0;tag--){
n=initrain();
f->next=n;
f=f->next;
}
}


void rain(){
raindrop *p;
createrain();
while(!kbhit()){
int thunrand=rand()%100;
pool();
if(thunrand==50&&isthunder=='y')
thunder();
rainsound();
for(p=rainhead;p;p=p->next){
if(p->flag==0)
drawrain(p);
if(p->flag==1)
drawwave(p,p->rainwave.ci);
}
Sleep(rainspeed);
for(p=rainhead;p;p=p->next){
if(p->flag==0)
clearrain(p);
if(p->flag==1)
clearwave(p,p->rainwave.ci++);
}
p=rainhead;
   flushrain(p);
}
}


void rainsound(){
int z;
if(rainnum<200) z=1;
else if(rainnum>=200&&rainnum<=360) z=2;
else z=3;
switch(z){
case 1:
mciSendString("open res//rain.mp3 alias BackMusic",NULL,0,NULL);
break;
case 2:
mciSendString("open res//heavyrain.mp3 alias BackMusic",NULL,0,NULL);
break;
case 3:
default:
mciSendString("open res//storm.mp3 alias BackMusic",NULL,0,NULL);
break;
}
mciSendString("setaudio BackMusic volume to 300",NULL,0,NULL);
mciSendString("play BackMusic repeat", NULL, 0, NULL);
}


void pool(){
setcolor(BLUE);
rectangle(0,430,800,600);
setfillcolor(BLUE);
fillrectangle(0,430,800,600);
}


void thunder(){
int i;
setcolor(BLACK);
rectangle(0,0,800,300);
PlaySound("res//thunder.wav", NULL, SND_FILENAME | SND_ASYNC);
for(i=0;i<256;i++){
setfillcolor(RGB(255-i,255-i,255-i));
fillrectangle(0,0,800,430);
Sleep(1);
}
}


int main(){
int n,i=0;
printf("    请输入雨类型: (1、小雨,2、中雨,3、大雨,4、暴雨,5、大暴雨)\n");
printf("-------------------------------------------------------------------退出请按“0”\n");
printf("   ********************输入非0数之后按下任意键重新开始*********************** \n\t");
scanf("%d",&n);
getchar();
while(n){
if(i!=0){
printf("    请输入雨类型: (1、小雨,2、中雨,3、大雨,4、暴雨,5、大暴雨)\n");
printf("-------------------------------------------------------------------退出请按“0”\n");
printf("   ********************输入非0数之后按下任意键重新开始*********************** \n\t");
scanf("%d",&n);
getchar();
}
if(n==0) break;
printf("   *************是否要加入闪电效果?是按“y”,否按其他任意键**************** \n\t");
scanf("%c",&isthunder);
getchar();
srand((unsigned)time(NULL));
initgraph(800,600);
rainnum=raintype(n);
rain();
getch();
closegraph();
mciSendString("close BackMusic", NULL, 0, NULL);
i=1;
isthunder='s';
system("cls");
}
return 0;
}
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值