C语言的问题

 

昨天把下雨的题终于编完了。对Graphics.h里面的一些函数有了一个初步的了解。我觉得我设计的这个程序是一种多线程的程序的雏形,因为两个雨滴是相互独立的,互不影响。这是放在一个数组里面实现的。目前的问题是如果把间隔时间设置的相对短些的话,动画要光滑些,但是有闪烁的感觉。这也是所有编程语言的擦坪函数所带来的,怎么解决,确实是一个问题。

 

后面附上源程序:

#include <stdio.h>
#include <math.h>
#include <graphics.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#include <conio.h>

#define PI 3.1415926

#define RAINDROPLEN 15 /*  The length of a raindrop */
#define RAINTANGLE 0 /*  The tangle of each raindrop */
#define RAINDROPZ 0  /* The internal of each raindrop */
#define RAINCOLOR white /* The color of each raindrop */
#define RAINWAVELEVEL 40 /* The level of each wave */
#define DELAYTIME 2000 /* The internal of each flash of the screen */

/* Calculate the next X,Y of a raindrop */
#define RAINDROPNEXTX(n,m) (int)((RAINDROPLEN/m+n)*sin(RAINTANGLE*(PI/180)))
#define RAINDROPNEXTY(n,m) (int)((RAINDROPLEN/m+n)*cos(RAINTANGLE*(PI/180)))

#define RAINDROPS 100 /*  The total numbers of raindrops */

 

struct raindrop
{
 int posx;
 int posy;
 int state; /* The current state of raindrop. 1 for raindrop. 2 for wave. */
 int wavelevel; /* The current wave level */
};

void Init(struct raindrop *drops);
void DrawDrops(struct raindrop *drops); /* Draw all the raindrops */
void CalDrops(struct raindrop *drops); /* Calculate the next raindrops position */

 

int main(void)
{
 struct raindrop drops[RAINDROPS];
 int gdriver=DETECT,gmode,i=0;
 initgraph(&gdriver,&gmode,""); /* Init graphic mode */
 Init(drops);
 setbkcolor(0);
 while(!kbhit())
 {
  cleardevice();
  DrawDrops(drops);
  delay(DELAYTIME);
  CalDrops(drops);
 }
 return 0;
}


void Init(struct raindrop *drops)
{
 int i;
 randomize();
 for(i=0;i<RAINDROPS;i++,drops++)
 {
  drops->posx=random(600);
  drops->posy=random(300);
  drops->state=1;
  drops->wavelevel=0;
 }
}

void DrawDrops(struct raindrop *drops)
{
 int i;
 int endx,endy;
 setcolor(WHITE);
 for(i=0;i<RAINDROPS;i++,drops++)
 {
  if (drops->state==1)
  {
   endx=RAINDROPNEXTX(0,1);
   endy=RAINDROPNEXTY(0,1);
   line(drops->posx,drops->posy,drops->posx+endx,drops->posy+endy);
  }
  else
  {

    ellipse(drops->posx,drops->posy,0,360,1+(drops->wavelevel)*0.75,0.05+(drops->wavelevel)*0.15);
  }
 }
}

void CalDrops(struct raindrop *drops)
{
 int i;
 int endx,endy;
 int temp;
 for(i=0;i<RAINDROPS;i++,drops++)
 {
  if (drops->state==1)
  {
   endx=RAINDROPNEXTX(RAINDROPZ,10);
   endy=RAINDROPNEXTY(RAINDROPZ,10);
   if ((endx+drops->posx)>=640||(endy+drops->posy)>=400)
   {
    temp=random(100);
    if (temp%2==0||(endx+drops->posx)>=680||(endy+drops->posy)>=550)
    {
     drops->state=2;
     drops->wavelevel=1;
    }
    else
    {
     drops->posx=drops->posx+endx;
     drops->posy=drops->posy+endy;
    }

   }
   else
   {
    drops->posx=drops->posx+endx;
    drops->posy=drops->posy+endy;
   }
  }
  else
  {
   if ((drops->wavelevel)<RAINWAVELEVEL)
   {

     drops->wavelevel++;
   }
   else
   {
    drops->posx=random(600);
    drops->posy=random(100);
    drops->wavelevel=0;
    drops->state=1;
   }
  }
 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值