?? 模擬生命.txt
字號:
/* 作者:xiajia */
#include<stdio.h>/*這個程序有待加強在于:食物生產而不是天然存在!*/
#include<graphics.h>
#include<math.h>
#define mx 60 /*國家橫坐標的最大值*/
#define my 60 /*國家縱坐標的最大值*/
#define mp 3600 /*國家最大人口限制*/
float random()/*隨即數生成函數*/
{
float aa;
int i;
aa=rand()/32767.0;
return aa;
}
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;/*隨即變量和災害變量*/
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);}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -