tc 模拟生命繁殖

该博客展示了一个模拟生命繁殖的C语言程序。程序中定义了个体信息结构体,包含性别、年龄等属性。通过随机数生成函数模拟各种随机情况,如灾害、移动等。同时考虑了食物更新、个体的死亡、进食、移动和繁殖等行为,并使用图形界面进行展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*一个模拟生命繁殖的程序*/
#include<stdio.h>/*这个程序有待加强在于:食物生产而不是天然存在!*/
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define mx 60 /*国家横坐标的最大值*/
#define my 60 /*国家纵坐标的最大值*/
#define mp 3600 /*国家最大人口限制*/

float random()/*随即数生成函数,加入了时间变量目的在于加强它的随机性*/
{float aa;
 int i,j;
 struct time t;
 gettime(&t);
 i=(t.ti_min+t.ti_hour+t.ti_sec+t.ti_hund)%3;
 for(j=0;j<i;j++)
 rand();
 aa=rand()/32767.0;
 return aa;/*返回产生的随机数(0-1)*/
}

main()
{
struct geti /*用于记录个体信息*/
 {
 int sex; /*性别 0:女,1:男,2:无纪录*/
 int age; /*年龄(1-100)*/
 int food;/*没有得到食物周期数(0-4)*/
 int x;   /*个体x坐标(1-200)*/
 int y;   /*个体y坐标(1-200)*/
 int flag;/*个体纪录的有效性0:无效,1:有效*/
 }people[mp];

int cycle=40;/*更新食物的周期数,改进后不使用这个变量*/
int population=350,popm=0,popf=0,mpop=0;/*初始人口数量*/
int map [mx][my];/*纪录盘面个点的食物数量*/
int driver=VGA,mode=VGAHI;
char text1[20]="Maxpopulation:    .",text2[5]="Man:",text3[7]="Woman:";/*统计信息字符串*/

int zhouqi=cycle-1,j,k,l,i;/*时间变量和循环变量*/
float suiji,tianzai=0;/*随即变量和灾害变量*/
registerbgidriver(EGAVGA_driver);
initgraph(&driver,&mode,"//tc");/*图形界面初始化*/
for(i=0;i<mp;i++)/*户口信息初始化*/
people[i].flag=0;
setcolor(7);/*显示提示图标*/
outtextxy(300,70,text2);
outtextxy(300,90,text3);
setfillstyle(1, 12);/*男的*/
bar(270,60,290,80);
setfillstyle(1, 11);/*女的*/
bar(270,80,290,100);

/*人口初始化*/
for(j=0;j<population;j++)
 {
  for(l=0;l<mp;l++)
  {
   if(people[l].flag==0)
   {
    people[l].age=1;
     people[l].x=mx*random();
    people[l].y=my*random();
    people[l].food=0;
    people[l].flag=1;
    if(random()<=0.5) {people[l].sex=0;popf+=1;}
    else {people[l].sex=1;popm+=1;}
    break;
   }
  }
 }

for(j=0;j<mx;j++)/*盘面初始化*/
for(k=0;k<my;k++)
 {
  map[j][k]=0;
 }
for(;;) /*总循环体*/
 {
  zhouqi++;/*没有更新食物的时间*/
  tianzai=0;
  if(random()<(1/(3601.1-population)-1/3600.0)*0.01) tianzai=random()/10;/*灾害值与人口数量有关,这样是为了限制人口过快增长.(有待改进!!)*/
  if(zhouqi%10==0)/*用于显示最大人口*/
 {
  mpop=population;
  text1[17]=mpop%10+48;
  text1[16]=((mpop-mpop%10)/10)%10+48;
  text1[15]=((mpop-mpop%100)/100)%10+48;
  text1[14]=((mpop-mpop%1000)/1000)%10+48;
  setfillstyle(1, 0);
  bar(300,40,500,60);
  setcolor(7);
  outtextxy(300,50,text1);
 }
  if(zhouqi%640==0)/*防止时间变量溢出,定期初始化*/
 {
  zhouqi=0;
 }
  setcolor(0);/*描绘人口曲线和男女曲线*/
  line(zhouqi%640,150,zhouqi%640,480);
  setcolor(1);
  line(zhouqi%640+1,150,zhouqi%640+1,480);
  putpixel(zhouqi%640,480-population/11,10);
  putpixel(zhouqi%640,480-popf/11,11);
  putpixel(zhouqi%640,480-popm/11,12);

  if(zhouqi%cycle==0)
  {/*更新食物,并且初始化i*/
   cycle=random()*100+10;
   for(j=0;j<mx;j++)
   for(k=0;k<my;k++)
   {
    map[j][k]+=1;
   }
    setfillstyle(1, 1);
   bar(19,19,21+2*mx,21+2*my);
    for(i=0;i<mp;i++)/*盘面人口情况*/
     {
       if(people[i].flag==1)
     {
        setfillstyle(1, 3*people[i].sex+2);
        bar(19+2*people[i].x,19+2*people[i].y,19+1+2*people[i].x,19+2*people[i].y+1);
     }
    }
  }
         /*开始对个体进行操作*/
  for(j=0;j<mp;j++)
  {
   if(people[j].flag==1) /*只对有效的个体进行处理*/
   {
    if(random()<((1/(101.1-people[j].age)-0.01)+(1/(3601.1-population)-1/3600.0))/2+tianzai||people[j].food>15)/*这个死亡条件还需要加强(目前考虑了人口,灾害,年龄和食物)*/
    {/*开始死亡操作*/
      if(map[people[j].x][people[j].y]==0)
{setfillstyle(1,0);
bar(19+2*people[j].x,19+2*people[j].y,19+2*people[j].x+1,19+2*people[j].y+1);}
     else
{setfillstyle(1,1);
bar(19+2*people[j].x,19+2*people[j].y,19+2*people[j].x+1,19+2*people[j].y+1);}
     if(people[j].sex==0) popf-=1;
     else popm-=1;
     population-=1;
     people[j].sex=2;
     people[j].age=0;
     people[j].food=0;
     people[j].x=0;
     people[j].y=0;
     people[j].flag=0;
    }
   else{/*非死亡操作*/

        /*吃食物计算*/
        if(map[people[j].x - 1][people[j].y - 1]==0||people[j].food<9) people[j].food+=1;/*考虑人类文明和社会公德,个体会为他人预留食物*/
        else {people[j].food=0; map[people[j].x - 1][people[j].y - 1]-=1;}

        if(map[people[j].x][people[j].y]==0) {setfillstyle(1,0);bar(19+2*people[j].x,19+2*people[j].y,19+2*people[j].x+1,19+2*people[j].y+1);}
        else {setfillstyle(1,1);bar(19+2*people[j].x,19+2*people[j].y,19+2*people[j].x+1,19+2*people[j].y+1);}

        suiji=random();/*移动*/
        if(suiji<=0.25) {if(people[j].x<mx) people[j].x+=1;}
        else if(suiji<=0.5) {if(people[j].x>1) people[j].x-=1;}
        else if(suiji<=0.75) {if(people[j].y<my) people[j].y+=1;}
        else {if(people[j].y>1) people[j].y-=1;}
         setfillstyle(1, 3*people[j].sex+2);
bar(19+2*people[j].x,19+2*people[j].y,19+1+2*people[j].x,19+2*people[j].y+1);

        /*繁殖计算*/
        if(people[j].age<45 && people[j].age>18)
        for(k=0;k<mp;k++)
    {
     if(people[j].x==people[k].x && people[j].y==people[k].y && (people[j].sex+people[k].sex)==1)/*位置和性别限制*/
     if(abs(people[j].age-people[k].age)<20 && people[k].age > 18 && people[k].age < 45)/*年龄限制*/
     {
     /*开始繁殖*/
      for(l=0;l<mp;l++)
      {
       if(people[l].flag==0)
       {
        population+=1;
        people[l].age=1;
        people[l].x=people[j].x;
        people[l].y=people[j].y;
        people[l].food=0;
        people[l].flag=1;
        if(random()<=0.5) {people[l].sex=0; popf+=1;}
        else {people[l].sex=1; popm+=1;}
        setfillstyle(1, 3*people[l].sex+2);
bar(19+2*people[l].x,19+2*people[l].y,19+1+2*people[l].x,19+2*people[l].y+1);
        break;
       }
      }/*结束繁殖*/
      break;
     }
    }/*结束繁殖计算*/

        /*年龄计算*/
        people[j].age+=1;
       }/*完成非死亡计算*/
   }
  }/*完成个体计算*/
  /*开始描绘盘面*/
  delay(1000);
  /*完成盘面描述*/
  if(kbhit()) {getch();getch();exit(1);}
        }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值