tc 模拟生命繁殖
来源:互联网 发布:域名注册域名详细流程 编辑:程序博客网 时间:2024/03/29 07:57
/*一个模拟生命繁殖的程序*/
#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);}
}
}
- tc 模拟生命繁殖
- 【模拟】【RQNOJ】生命游戏
- 人工生命模拟程序
- QT 生命游戏模拟
- 使用TC的netem配置模拟网络
- 【TC 695_600】BearPasswordAny(模拟)
- TC
- tc
- C++: 生命游戏(模拟细胞群演化)
- vc6.0模拟tc在控制台定位光标
- 模拟打字游戏 请用WIN tc编译
- 利用tc来做网络延时的模拟
- linux 下使用 tc 模拟网络延迟和丢包
- linux 下使用 tc 模拟网络延迟和丢包
- linux 下使用 tc 模拟网络延迟和丢包
- linux 下使用 tc 模拟网络延迟和丢包
- linux 下使用 tc 模拟网络延迟和丢包
- linux 下使用 tc 模拟网络延迟和丢包
- CListCtrl应用
- tc 游戏 挖雷
- API全功略(API编程的详细介绍)
- 清炒油菜
- 蔬菜煎蛋
- tc 模拟生命繁殖
- 在Eclipse中用myEclipse进行开发(lnboy)
- 解密ASP源代码. 选择自 wanghr100 的 Blog
- PS2正确使用方法
- 操作系统中的进程同步详析
- 感冒还没好
- 全球IP段大全
- 走在面向对象的路上
- 如何读懂路由表?