void biaoJiWeiZhiZhanYong(int x,int y,int gao,int id){
for(int h=0;h<gao;h++){
int cy=y-h;
if(cy>=1&&cy<PING_MU_GAO-1&&x>=1&&x<PING_MU_KUAN-1)weiZhiZhanYong[cy][x]=id;
}
}
void qingChuWeiZhiZhanYong(int x,int y,int gao){
for(int h=0;h<gao;h++){
int cy=y-h;
if(cy>=1&&cy<PING_MU_GAO-1&&x>=1&&x<PING_MU_KUAN-1)weiZhiZhanYong[cy][x]=0;
}
}
bool jianCeWeiZhiChongTu(int x,int y,int gao,int paiChuId=0){
for(int h=0;h<gao;h++){
int cy=y-h;
if(cy>=1&&cy<PING_MU_GAO-1&&x>=1&&x<PING_MU_KUAN-1)
if(weiZhiZhanYong[cy][x]!=0&&weiZhiZhanYong[cy][x]!=paiChuId)return true;
}
return false;
}
void jieJueFangKuaiChongTu(){
sort(fangKuaiLie.begin(),fangKuaiLie.end(),[](FangKuai& a,FangKuai& b){return a.getWeiZhi().y>b.getWeiZhi().y;});
bool yiDong=true;
int maxDieDai=10;
while(yiDong&&maxDieDai-->0){
yiDong=false;
for(size_t i=0;i<fangKuaiLie.size();i++){
if(!fangKuaiLie[i].shiJiHuo())continue;
FangKuai& f=fangKuaiLie[i];
int id=f.getId();
int x=(int)f.getWeiZhi().x,y=(int)f.getWeiZhi().y,gao=f.getDuiDieGaoDu();
qingChuWeiZhiZhanYong(x,y,gao);
if(jianCeWeiZhiChongTu(x,y,gao,id)){
bool zhaoDao=false;
int ny=y;
while(ny<PING_MU_GAO-2&&!zhaoDao){
ny++;
if(!jianCeWeiZhiChongTu(x,ny,gao,id)){
f.sheWeiZhi(ShiLiang2(x,ny));
f.sheLuoDi(false);f.sheYingYongWuLi(true);yiDong=true;zhaoDao=true;
}
}
if(!zhaoDao){
int lx=x-1;
if(lx>=1&&!jianCeWeiZhiChongTu(lx,y,gao,id)){f.sheWeiZhi(ShiLiang2(lx,y));yiDong=true;zhaoDao=true;}
else if(!zhaoDao){
int rx=x+1;
if(rx<PING_MU_KUAN-1&&!jianCeWeiZhiChongTu(rx,y,gao,id)){f.sheWeiZhi(ShiLiang2(rx,y));yiDong=true;zhaoDao=true;}
}
}
}
x=(int)f.getWeiZhi().x;y=(int)f.getWeiZhi().y;
biaoJiWeiZhiZhanYong(x,y,gao,id);
}
}
}
void shengChengDuYiGuanQia(GuanQiaShuJu& gq,int bianHao){
gq.guanQiaBianHao=bianHao;
const char* mc[]={" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "};
gq.mingCheng=mc[bianHao-1];
float nanDu=bianHao/50.0f;gq.nanDu=nanDu;
int jiChuZhu=1+bianHao/6;
if(bianHao>30)jiChuZhu+=(bianHao-30)/3;
gq.xiaoZhuShu=min(max(jiChuZhu,1),15);
vector<int> keYongXiaoNiao={0};
if(bianHao>=4)keYongXiaoNiao.push_back(1);
if(bianHao>=8)keYongXiaoNiao.push_back(2);
if(bianHao>=12)keYongXiaoNiao.push_back(3);
if(bianHao>=18)keYongXiaoNiao.push_back(4);
if(bianHao>=24)keYongXiaoNiao.push_back(5);
int xiaoNiaoShu=3+bianHao/12;
xiaoNiaoShu=min(xiaoNiaoShu,8);
for(int j=0;j<xiaoNiaoShu;j++){
int idx=(bianHao*13+j*17)%keYongXiaoNiao.size();
gq.xiaoNiaoLeiXing.push_back(keYongXiaoNiao[idx]);
}
int jiChuX=60,jiChuY=DI_MIAN_Y;
int jiChuGao=1+bianHao/4,jiChuKuan=2+(bianHao%3);
int yangShi=(bianHao*13)%45;
gq.fangKuaiShuJu.clear();gq.xiaoZhuWeiZhi.clear();linShiFangKuai.clear();
if(yangShi<15){
switch(yangShi){
case 0:chuangJianJianDanWuZi(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 1:chuangJianTaZhuang(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 2:chuangJianLiangCengJianZhu(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 3:chuangJianBaoLei(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 4:chuangJianJinZiTa(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 5:chuangJianDaLou(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 6:chuangJianQiao(jiChuX-3,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 7:chuangJianFuZaJianZhu(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 8:chuangJianFangYuGong(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 9:chuangJianDuoCengFangYu(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 10:chuangJianDuiChenJianZhu(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 11:chuangJianGaoKongFangYu(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 12:chuangJianMiJiFangYu(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 13:chuangJianGaoDuBuYiJianZhu(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
case 14:chuangJianZuiZhongFangYu(jiChuX,jiChuY,jiChuGao,jiChuKuan,gq);break;
}
}else{
int idx=yangShi-15;
const JianZhuMoBan& mb=jianZhuMoBan[idx];
for(auto& z:mb.zhuZi){
int dx=z.dx,gao=min(z.gao,jiChuGao);
if(gao<=0)continue;
char lx=z.leiXing;
int x=jiChuX+dx,y=jiChuY;
tianJiaFangKuai(gq,x,y,lx,gao);
}
vector<pair<int,int>> houXuan;
for(auto& w:mb.xiaoZhuWei)houXuan.emplace_back(jiChuX+w.dx,DI_MIAN_Y+w.dy);
for(auto& z:mb.zhuZi){
int dx=z.dx,gao=min(z.gao,jiChuGao);
if(gao<=0)continue;
int x=jiChuX+dx,y=DI_MIAN_Y-gao;
bool chong=false;
for(auto& p:houXuan)if(p.first==x&&p.second==y){chong=true;break;}
if(!chong)houXuan.emplace_back(x,y);
}
sort(houXuan.begin(),houXuan.end(),[](pair<int,int>& a,pair<int,int>& b){
if(a.second!=b.second)return a.second<b.second;return a.first<b.first;
});
int tianJia=gq.xiaoZhuShu;
for(auto& p:houXuan)if(tianJia>0)gq.xiaoZhuWeiZhi.push_back(p),tianJia--;
while(tianJia>0)gq.xiaoZhuWeiZhi.emplace_back(jiChuX,DI_MIAN_Y-1),tianJia--;
}
tiaoZhengXiaoZhuWeiZhi(gq,linShiFangKuai);
gq.fangKuaiShu=gq.fangKuaiShuJu.size();
}
bool tianJiaFangKuai(GuanQiaShuJu& gq,int x,int y,char lx,int gao=1){
gao=max(1,min(gao,9));
if(!nengFangFangKuai(x,y,gao)){
if(nengFangFangKuai(x,y+1,gao))y++;
else return false;
}
gq.fangKuaiShuJu.emplace_back(make_pair(x,y),make_pair(lx,gao));
linShiFangKuai.emplace_back(x,y,lx,gao);
return true;
}
void chuangJianJianDanWuZi(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
int wg=min(3,gao),wk=min(kuan,9);
for(int i=0;i<wk;i++)tianJiaFangKuai(gq,x+i-wk/2,y,'=',2);
for(int h=1;h<wg;h++)for(int i=0;i<wk;i++)
if(i==0||i==wk-1||h==wg-1)tianJiaFangKuai(gq,x+i-wk/2,y-h,'#',1);
if(wg>1)for(int i=1;i<wk-1;i++)tianJiaFangKuai(gq,x+i-wk/2,y-wg,'T',1);
int tian=min(2,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
for(int i=0;i<tian;i++)gq.xiaoZhuWeiZhi.emplace_back(x+i*2-1,y-1);
}
void chuangJianTaZhuang(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
int tg=min(9,gao),tk=min(kuan,5);
for(int i=0;i<tk;i++)tianJiaFangKuai(gq,x+i-tk/2,y,'=',3);
for(int h=1;h<tg;h++)for(int i=0;i<tk;i++){
char lx=(h%3==0)?'x':'#';
tianJiaFangKuai(gq,x+i-tk/2,y-h,lx,1);
}
if(tg>3)tianJiaFangKuai(gq,x,y-tg,'H',2);
int tian=min(3,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
for(int i=0;i<tian;i++)gq.xiaoZhuWeiZhi.emplace_back(x,y-1-i*(tg/2));
}
void chuangJianLiangCengJianZhu(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
int yc=min(3,gao/2),ec=min(2,max(1,gao-yc)),wk=min(kuan,7);
for(int i=0;i<wk;i++){char lx=(i==0||i==wk-1)?'=':'#';tianJiaFangKuai(gq,x+i-wk/2,y,lx,2);}
for(int h=1;h<yc;h++)for(int i=0;i<wk;i+=2)tianJiaFangKuai(gq,x+i-wk/2,y-h,'#',1);
if(ec>0){
for(int i=1;i<wk-1;i++)tianJiaFangKuai(gq,x+i-wk/2,y-yc,'=',2);
for(int h=1;h<ec;h++)for(int i=1;i<wk-1;i+=2)tianJiaFangKuai(gq,x+i-wk/2,y-yc-h,'&',1);
}
int tian=min(3,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x,y-1);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x+2,y-yc-1);if(tian>2)gq.xiaoZhuWeiZhi.emplace_back(x-2,y-yc-1);
}
void chuangJianBaoLei(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
chuangJianTaZhuang(x-4,y,gao,kuan/2,gq);
chuangJianTaZhuang(x+4,y,gao,kuan/2,gq);
for(int i=-3;i<=3;i++)if(i!=0){tianJiaFangKuai(gq,x+i,y,'=',3);tianJiaFangKuai(gq,x+i,y-1,'%',1);}
tianJiaFangKuai(gq,x,y,'#',3);tianJiaFangKuai(gq,x,y-2,'+',1);
int tian=min(3,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x,y-1);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x-4,y-2);if(tian>2)gq.xiaoZhuWeiZhi.emplace_back(x+4,y-2);
}
void chuangJianJinZiTa(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
int jg=min(7,gao);
for(int h=0;h<jg;h++){int w=jg-h;for(int i=0;i<w;i++)tianJiaFangKuai(gq,x+i-w/2,y-h,'%',1);}
int tian=min(2,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x,y-1);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x,y-jg+2);
}
void chuangJianDaLou(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
int dg=min(9,gao),wk=min(kuan,5);
for(int i=0;i<wk;i++)tianJiaFangKuai(gq,x+i-wk/2,y,'=',3);
for(int h=1;h<dg;h++)for(int i=0;i<wk;i++){
char lx=(h%4==0)?'x':(h%2==0)?'&':'#';
tianJiaFangKuai(gq,x+i-wk/2,y-h,lx,1);
}
if(dg>5)tianJiaFangKuai(gq,x,y-dg,'H',2);
int tian=min(3,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
for(int i=0;i<tian;i++)gq.xiaoZhuWeiZhi.emplace_back(x,y-1-i*(dg/2));
}
void chuangJianQiao(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
int qg=min(4,gao),cd=kuan+5;
for(int i=0;i<qg;i++){tianJiaFangKuai(gq,x,y-i,'=',2);tianJiaFangKuai(gq,x+cd,y-i,'=',2);}
for(int i=0;i<=cd;i++)tianJiaFangKuai(gq,x+i,y-qg,'#',1);
if(cd>8){tianJiaFangKuai(gq,x+cd/2,y-qg+1,'=',2);tianJiaFangKuai(gq,x+cd/2,y-qg,'#',1);}
int tian=min(3,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x+cd/2,y-qg-1);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x+1,y-1);if(tian>2)gq.xiaoZhuWeiZhi.emplace_back(x+cd-1,y-1);
}
void chuangJianFuZaJianZhu(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
chuangJianJianDanWuZi(x,y,gao,kuan,gq);
chuangJianTaZhuang(x-6,y,gao,kuan/2,gq);
chuangJianTaZhuang(x+6,y,gao,kuan/2,gq);
}
void chuangJianFangYuGong(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
for(int i=-3;i<=3;i++)for(int h=0;h<gao;h++){
char lx=(h==0)?'=':'%';
tianJiaFangKuai(gq,x+i*2,y-h,lx,(h==0)?2:1);
}
int tian=min(3,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x,y-1);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x+2,y-2);if(tian>2)gq.xiaoZhuWeiZhi.emplace_back(x-2,y-2);
}
void chuangJianDuoCengFangYu(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
int wc=min(3,gao),nc=min(2,max(1,gao-2));
for(int i=-4;i<=4;i++)for(int h=0;h<wc;h++){
char lx=(h==0)?'=':'#';
tianJiaFangKuai(gq,x+i*2,y-h,lx,(h==0)?2:1);
}
for(int i=-2;i<=2;i++)for(int h=0;h<nc;h++)tianJiaFangKuai(gq,x+i*2,y-wc-h,'%',1);
int tian=min(3,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x,y-wc-1);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x+2,y-1);if(tian>2)gq.xiaoZhuWeiZhi.emplace_back(x-2,y-1);
}
void chuangJianDuiChenJianZhu(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
for(int i=-2;i<=2;i+=4)for(int h=0;h<gao;h++){
char lx=(h==0)?'=':'#';
tianJiaFangKuai(gq,x+i,y-h,lx,(h==0)?2:1);
}
for(int i=-1;i<=1;i++)tianJiaFangKuai(gq,x+i,y-gao/2,'#',1);
if(gao>4)tianJiaFangKuai(gq,x,y-gao,'H',2);
int tian=min(3,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x,y-gao/2-1);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x-2,y-1);if(tian>2)gq.xiaoZhuWeiZhi.emplace_back(x+2,y-1);
}
void chuangJianGaoKongFangYu(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
int tg=min(9,gao);
for(int h=0;h<tg;h++){
char lx=(h<3)?'=':(h%3==0)?'x':'#';
tianJiaFangKuai(gq,x,y-h,lx,(h<3)?3:1);
}
int tian=min(2,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x,y-tg/2);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x,y-tg+1);
}
void chuangJianMiJiFangYu(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
for(int i=-3;i<=3;i++)for(int h=0;h<gao;h++){
char lx=(h==0)?'=':(h<gao/2)?'#':'%';
tianJiaFangKuai(gq,x+i*2,y-h,lx,(h==0)?2:1);
}
int tian=min(5,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x,y-gao/2);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x+2,y-1);if(tian>2)gq.xiaoZhuWeiZhi.emplace_back(x-2,y-1);
if(tian>3)gq.xiaoZhuWeiZhi.emplace_back(x+4,y-gao+1);if(tian>4)gq.xiaoZhuWeiZhi.emplace_back(x-4,y-gao+1);
}
void chuangJianGaoDuBuYiJianZhu(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
vector<int> gaoLie,wei={-4,-2,0,2,4};
for(int i=0;i<5;i++)gaoLie.push_back(max(1,gao-i));
for(size_t i=0;i<gaoLie.size();i++)for(int h=0;h<gaoLie[i];h++){
char lx=(h==0)?'=':(h<gaoLie[i]/2)?'#':'&';
tianJiaFangKuai(gq,x+wei[i],y-h,lx,(h==0)?2:1);
}
int tian=min(4,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x,y-1);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x+2,y-2);if(tian>2)gq.xiaoZhuWeiZhi.emplace_back(x-2,y-3);
if(tian>3)gq.xiaoZhuWeiZhi.emplace_back(x+4,y-1);
}
void chuangJianZuiZhongFangYu(int x,int y,int gao,int kuan,GuanQiaShuJu& gq){
chuangJianFangYuGong(x,y,gao,kuan,gq);
if(gao>=5){chuangJianGaoKongFangYu(x-8,y,gao,kuan/2,gq);chuangJianGaoKongFangYu(x+8,y,gao,kuan/2,gq);}
int xg=min(gao+3,9);
for(int h=0;h<xg;h++)tianJiaFangKuai(gq,x,y-h,'x',(h==0)?3:1);
int tian=min(6,(int)gq.xiaoZhuShu-(int)gq.xiaoZhuWeiZhi.size());
gq.xiaoZhuWeiZhi.emplace_back(x,y-1);if(tian>1)gq.xiaoZhuWeiZhi.emplace_back(x-8,y-2);if(tian>2)gq.xiaoZhuWeiZhi.emplace_back(x+8,y-2);
if(tian>3)gq.xiaoZhuWeiZhi.emplace_back(x,y-xg+1);if(tian>4)gq.xiaoZhuWeiZhi.emplace_back(x-3,y-gao/2);if(tian>5)gq.xiaoZhuWeiZhi.emplace_back(x+3,y-gao/2);
}
GuanQiaShuJu getGuanQia(int bianHao){
if(bianHao>0&&bianHao<=static_cast<int>(guanQiaLie.size()))return guanQiaLie[bianHao-1];
return guanQiaLie[0];
}
void sheZhiGuanQia(int bianHao){
xiaoNiaoLie.clear();xiaoZhuLie.clear();fangKuaiLie.clear();danLie.clear();baoZhaLie.clear();
GuanQiaShuJu gq=getGuanQia(bianHao);
dangQianGuanQia=bianHao;
fenShu=0;lianJi=0;lianJiBeiShu=1.0f;
for(auto lx:gq.xiaoNiaoLeiXing)xiaoNiaoLie.emplace_back(danGong.getWeiZhi().x,danGong.getWeiZhi().y,lx);
for(auto& p:gq.xiaoZhuWeiZhi){
int dj=1;
if(bianHao>20)dj=2;if(bianHao>40)dj=3;
int x=p.first,y=p.second;
if(!jianCeWeiZhiChongTu(x,y,1)){xiaoZhuLie.emplace_back(x,y,dj);biaoJiWeiZhiZhanYong(x,y,1,-2);}
}
for(auto& d:gq.fangKuaiShuJu){
int x=d.first.first,y=d.first.second;
char lx=d.second.first;int gao=d.second.second;
qingChuWeiZhiZhanYong(x,y,gao);
FangKuai fk(x,y,lx,gao);
if(fk.getWeiZhi().y>=DI_MIAN_Y-0.5f){fk.sheWeiZhi(ShiLiang2(x,DI_MIAN_Y));fk.sheLuoDi(true);fk.sheYingYongWuLi(false);fk.sheWenDing(true);}
fangKuaiLie.push_back(fk);
biaoJiWeiZhiZhanYong(x,y,gao,fangKuaiLie.back().getId());
}
guanQiaWanCheng=false;
miaoZhunJiao=45.0f;miaoZhunLiDu=8.0f;
for(int i=0;i<5;i++){gengXinZhiChengXiTong();xiuFuChanDong();}
}
void gengXinZhiChengXiTong(){
for(size_t i=0;i<fangKuaiLie.size();i++){
if(!fangKuaiLie[i].shiJiHuo())continue;
FangKuai& f=fangKuaiLie[i];
ShiLiang2 w=f.getWeiZhi();
if(w.y>=DI_MIAN_Y-0.5f){f.sheWeiZhi(ShiLiang2(w.x,DI_MIAN_Y));f.sheLuoDi(true);f.sheYingYongWuLi(false);f.sheWenDing(true);f.sheSuDu(ShiLiang2(0,0));continue;}
if(f.shiWenDing()){
bool zc=false;
for(size_t j=0;j<fangKuaiLie.size();j++){if(i==j||!fangKuaiLie[j].shiJiHuo()||!fangKuaiLie[j].shiWenDing())continue;if(f.jianCeZaiShang(fangKuaiLie[j])){zc=true;break;}}
if(!zc&&!f.shiDiMian())f.shiQuZhiCheng();continue;
}
bool zc=false;
for(size_t j=0;j<fangKuaiLie.size();j++){if(i==j||!fangKuaiLie[j].shiJiHuo()||!fangKuaiLie[j].shiWenDing())continue;if(f.jianCeZaiShang(fangKuaiLie[j])){
f.sheWeiZhi(ShiLiang2(w.x,fangKuaiLie[j].getDingBuY()));f.sheLuoDi(true);f.sheYingYongWuLi(false);f.sheWenDing(true);f.sheSuDu(ShiLiang2(0,0));zc=true;break;
}}
if(!zc&&!f.yingYongWuLiMa()){f.sheYingYongWuLi(true);f.sheLuoDi(false);f.sheWenDing(false);if(f.getSuDu().moChang()<0.2f)f.sheSuDu(ShiLiang2((rand()%10-5)*0.1f,-0.3f));}
}
for(size_t i=0;i<xiaoZhuLie.size();i++){
if(!xiaoZhuLie[i].shiJiHuo())continue;
XiaoZhu& z=xiaoZhuLie[i];
if(z.getShouJiLengQue()>0)continue;
ShiLiang2 w=z.getWeiZhi();
if(w.y>=DI_MIAN_Y-0.5f){z.sheWeiZhi(ShiLiang2(w.x,DI_MIAN_Y));z.sheLuoDi(true);z.sheYingYongWuLi(false);z.sheWenDing(true);z.sheSuDu(ShiLiang2(0,0));continue;}
bool zaiFangKuai=false;
for(size_t j=0;j<fangKuaiLie.size();j++){if(!fangKuaiLie[j].shiJiHuo()||!fangKuaiLie[j].shiWenDing())continue;
float dx=w.x-fangKuaiLie[j].getWeiZhi().x,dy=w.y-fangKuaiLie[j].getDingBuY();
if(fabs(dx)<1.5f&&dy>-0.5f&&dy<1.0f){
z.sheWeiZhi(ShiLiang2(w.x,fangKuaiLie[j].getDingBuY()));z.sheLuoDi(true);z.sheYingYongWuLi(false);z.sheWenDing(true);z.sheSuDu(ShiLiang2(0,0));zaiFangKuai=true;break;
}
}
if(!zaiFangKuai&&w.y<DI_MIAN_Y-0.5f){z.sheYingYongWuLi(true);z.sheLuoDi(false);z.sheWenDing(false);}
}
for(size_t i=0;i<fangKuaiLie.size();i++){
if(!fangKuaiLie[i].shiJiHuo()||fangKuaiLie[i].shiWenDing())continue;
FangKuai& f=fangKuaiLie[i];
ShiLiang2 w=f.getWeiZhi();
if(w.y>=DI_MIAN_Y-0.5f||f.getSuDu().moChang()>=0.1f||f.shiLuoDi())continue;
int sy=(int)w.y;
for(int cy=sy+1;cy<DI_MIAN_Y;cy++){
bool zc=false;
for(size_t j=0;j<fangKuaiLie.size();j++){if(i==j||!fangKuaiLie[j].shiJiHuo()||!fangKuaiLie[j].shiWenDing())continue;
if(abs(w.x-fangKuaiLie[j].getWeiZhi().x)<1.2f&&cy==(int)fangKuaiLie[j].getDingBuY()){
f.sheWeiZhi(ShiLiang2(w.x,cy));f.sheLuoDi(true);f.sheYingYongWuLi(false);f.sheWenDing(true);f.sheSuDu(ShiLiang2(0,0));zc=true;break;
}
}
if(zc)break;
if(cy>=DI_MIAN_Y-1){f.sheWeiZhi(ShiLiang2(w.x,DI_MIAN_Y));f.sheLuoDi(true);f.sheYingYongWuLi(false);f.sheWenDing(true);f.sheSuDu(ShiLiang2(0,0));break;}
}
}
for(size_t i=0;i<xiaoZhuLie.size();i++){
if(!xiaoZhuLie[i].shiJiHuo()||xiaoZhuLie[i].shiWenDing())continue;
XiaoZhu& z=xiaoZhuLie[i];
ShiLiang2 w=z.getWeiZhi();
if(w.y>=DI_MIAN_Y-0.5f||z.getSuDu().moChang()>=0.1f||z.shiLuoDi())continue;
int sy=(int)w.y;
for(int cy=sy+1;cy<DI_MIAN_Y;cy++){
bool zai=false;
for(size_t j=0;j<fangKuaiLie.size();j++){if(!fangKuaiLie[j].shiJiHuo()||!fangKuaiLie[j].shiWenDing())continue;
if(abs(w.x-fangKuaiLie[j].getWeiZhi().x)<1.2f&&cy==(int)fangKuaiLie[j].getDingBuY()){
z.sheWeiZhi(ShiLiang2(w.x,cy));z.sheLuoDi(true);z.sheYingYongWuLi(false);z.sheWenDing(true);z.sheSuDu(ShiLiang2(0,0));zai=true;break;
}
}
if(zai)break;
if(cy>=DI_MIAN_Y-1){z.sheWeiZhi(ShiLiang2(w.x,DI_MIAN_Y));z.sheLuoDi(true);z.sheYingYongWuLi(false);z.sheWenDing(true);z.sheSuDu(ShiLiang2(0,0));break;}
}
}
}
void dangFangKuaiCuiHui(int idx){
if(idx<0||idx>=static_cast<int>(fangKuaiLie.size()))return;
FangKuai& f=fangKuaiLie[idx];
ShiLiang2 w=f.getWeiZhi();
float dy=f.getDingBuY();
for(size_t i=0;i<fangKuaiLie.size();i++){
if(i==(size_t)idx||!fangKuaiLie[i].shiJiHuo())continue;
ShiLiang2 ow=fangKuaiLie[i].getWeiZhi();
float dx=ow.x-w.x,od=ow.y-dy;
if(fabs(dx)<1.5f&&od>-0.5f&&od<2.0f)fangKuaiLie[i].shiQuZhiCheng();
}
for(size_t i=0;i<xiaoZhuLie.size();i++){
if(!xiaoZhuLie[i].shiJiHuo())continue;
ShiLiang2 zw=xiaoZhuLie[i].getWeiZhi();
float dx=zw.x-w.x,od=zw.y-dy;
if(fabs(dx)<1.5f&&od>-0.5f&&od<2.0f){
xiaoZhuLie[i].sheYingYongWuLi(true);xiaoZhuLie[i].sheLuoDi(false);xiaoZhuLie[i].sheWenDing(false);
xiaoZhuLie[i].sheSuDu(xiaoZhuLie[i].getSuDu()+ShiLiang2(0,-0.5f));
}
}
}
void dangFangKuaiBeiJiZhong(int idx,ShiLiang2 li){
if(idx<0||idx>=static_cast<int>(fangKuaiLie.size()))return;
FangKuai& f=fangKuaiLie[idx];
ShiLiang2 w=f.getWeiZhi();
float dy=f.getDingBuY();
float mo=li.moChang();
if(mo>5.0f){
for(size_t i=0;i<fangKuaiLie.size();i++){
if(i==(size_t)idx||!fangKuaiLie[i].shiJiHuo())continue;
ShiLiang2 ow=fangKuaiLie[i].getWeiZhi();
float dx=ow.x-w.x,od=ow.y-dy;
if(fabs(dx)<1.5f&&od>-0.5f&&od<2.0f){
fangKuaiLie[i].shiQuZhiCheng();
fangKuaiLie[i].sheSuDu(fangKuaiLie[i].getSuDu()+li*0.1f);
}
}
}
}
void gengXin(){
if(youXiZhuangTai!=YOU_XI_ZHONG)return;
gengXinZhiChengXiTong();
for(auto& f:fangKuaiLie)if(f.shiJiHuo()&&!f.shiWenDing())f.gengXin();
for(auto& z:xiaoZhuLie)if(z.shiJiHuo()&&!z.shiWenDing())z.gengXin();
for(size_t i=0;i<danLie.size();i++){
danLie[i].gengXin();
if(!danLie[i].shiJiHuo()&&danLie[i].luoDiBaoZha){yingYongBaoZha(danLie[i].getWeiZhi(),3,false);danLie[i].luoDiBaoZha=false;}
if(!danLie[i].shiJiHuo()){danLie.erase(danLie.begin()+i);i--;}
}
xiuFuChanDong();
gengXinZhiChengXiTong();
jieJueFangKuaiChongTu();
if(!xiaoNiaoLie.empty()){
XiaoNiao& n=xiaoNiaoLie[0];
n.gengXin();
if(!n.shiJiHuo()||(n.shiLuoDi()&&n.getSuDu().moChang()<0.3f)){
if(n.shiJiHuo()&&n.getJiNengLengQue()>0){
ShiLiang2 w=n.getWeiZhi();
int da=0;
switch(n.getLeiXing()){
case 0:da=6;break;case 1:da=3;break;case 2:da=4;break;case 3:da=12;break;case 4:da=5;break;case 5:da=4;break;
}
if(da>0)yingYongBaoZha(w,da,n.getLeiXing()==3);
n.sheYongLeJiNeng(true);
}
xiaoNiaoLie.erase(xiaoNiaoLie.begin());
if(!xiaoNiaoLie.empty()){
xiaoNiaoLie[0].sheWeiZhi(danGong.getWeiZhi());
xiaoNiaoLie[0].sheSuDu(ShiLiang2(0,0));
xiaoNiaoLie[0].sheLuoDi(false);
xiaoNiaoLie[0].sheYongLeJiNeng(false);
}else{if(!xiaoZhuLie.empty())youXiZhuangTai=YOU_XI_SHI_BAI;return;}
lianJi=0;lianJiBeiShu=1.0f;
}
}
jianCePengZhuang();
for(size_t i=0;i<baoZhaLie.size();){
baoZhaLie[i].jiShiQi--;
if(baoZhaLie[i].jiShiQi<=0)baoZhaLie.erase(baoZhaLie.begin()+i);
else i++;
}
if(xiaoZhuLie.empty()){
guanQiaWanCheng=true;
int wanCheng=dangQianGuanQia;
if(dangQianGuanQia<ZUI_DA_GUAN_QIA){dangQianGuanQia++;jieSuoGuanQia(dangQianGuanQia);}
cunDang.she("current_level",to_string(dangQianGuanQia));
fenShu+=100*wanCheng+(int)xiaoNiaoLie.size()*50;
zongFenShu+=fenShu;
youXiZhuangTai=GUAN_QIA_WAN_CHENG;
saveCunDang();
}
}
void jianCePengZhuang(){
if(xiaoNiaoLie.empty())return;
XiaoNiao& n=xiaoNiaoLie[0];
if(!n.shiJiHuo()||!n.shiFaShe())return;
ShiLiang2 nw=n.getWeiZhi(),ns=n.getSuDu();
float bj=n.getBanJing();
for(size_t i=0;i<xiaoZhuLie.size();i++){
if(!xiaoZhuLie[i].shiJiHuo())continue;
XiaoZhu& z=xiaoZhuLie[i];
ShiLiang2 zw=z.getWeiZhi();
float dx=nw.x-zw.x,dy=nw.y-zw.y,ju=dx*dx+dy*dy,minJu=bj+z.getBanJing();
if(ju<minJu*minJu){
int sh=12+lianJi*2;
switch(n.getLeiXing()){
case 0:sh=12;break;case 1:sh=10;break;case 2:sh=16;break;case 3:sh=30;break;case 4:sh=14;break;case 5:sh=12;break;
}
if(n.getLeiXing()==1&&n.shiYongLeJiNeng())sh=z.getXueLiang();
z.shouDaoShangHai(sh);
if(!z.shiJiHuo()){
lianJi++;lianJiBeiShu=1.0f+lianJi*0.1f;
fenShu+=z.getJiangLi()*lianJiBeiShu;
chuangJianBaoZha(z.getWeiZhi());
qingChuWeiZhiZhanYong((int)zw.x,(int)zw.y,1);
}
ShiLiang2 fx(dx,dy);
if(ju>0)fx=fx/sqrt(ju);else fx=ShiLiang2(0,1);
float li=ns.moChang()*0.7f;
ShiLiang2 chong;
if(fabs(fx.x)>0.7f){chong.x=fx.x*li*1.0f;chong.y=(fx.y>0?0.6f:-0.3f)*li*0.3f;}
else if(fx.y<-0.7f){chong.x=fx.x*li*0.3f;chong.y=-li*0.8f;}
else if(fx.y>0.7f){chong.x=fx.x*li*0.3f;chong.y=li*1.0f;}
else chong=fx*li*0.8f;
z.sheSuDu(chong);z.sheYingYongWuLi(true);z.sheLuoDi(false);z.sheWenDing(false);z.sheShouJiLengQue(25);
ShiLiang2 fan=ns-fx*2.0f*ShiLiang2::dianJi(ns,fx);
n.sheSuDu(fan*0.7f);
float chongDie=minJu-sqrt(ju);
if(chongDie>0){ShiLiang2 fenLi=fx*(chongDie*0.5f);n.sheWeiZhi(nw+fenLi);z.sheWeiZhi(zw-fenLi);}
break;
}
}
bool peng=true;
int maxDie=5;
while(peng&&maxDie-->0){
peng=false;
for(size_t i=0;i<fangKuaiLie.size();i++){
if(!fangKuaiLie[i].shiJiHuo())continue;
FangKuai& f=fangKuaiLie[i];
ShiLiang2 fw=f.getWeiZhi();
float dx=nw.x-fw.x,dy=nw.y-fw.y,ju=sqrt(dx*dx+dy*dy);
if(ju<bj+f.getBanJing()){
peng=true;
f.sheWenDing(false);f.sheLuoDi(false);f.sheYingYongWuLi(true);
ShiLiang2 fx(dx,dy);
if(ju>0)fx=fx/ju;else fx=ShiLiang2(0,1);
bool ding=(fx.y<-0.8f&&abs(fx.x)<0.5f);
bool ce=(abs(fx.x)>0.7f&&abs(fx.y)<0.5f);
float yin=(n.getLeiXing()==3)?1.2f:0.8f;
float li=ns.moChang()*yin;
ShiLiang2 l=fx*li;
f.sheSuDu(f.getSuDu()+l);
ShiLiang2 fan;
if(ding){fan.x=ns.x*0.3f;fan.y=-ns.y*0.8f;}
else if(ce){fan.x=-ns.x*0.5f;fan.y=ns.y*0.5f+0.5f;}
else fan=f.pengZhuangFanYing(ns)*0.5f;
n.sheSuDu(fan);
int jiChuSh=(int)(ns.moChang()*3*(1.0f-f.getWenDingXing()*0.2f));
if(n.getLeiXing()==1&&n.shiYongLeJiNeng())jiChuSh*=3;
else if(n.getLeiXing()==2)jiChuSh=static_cast<int>(jiChuSh*1.5f);
else if(n.getLeiXing()==3)jiChuSh*=2.5f;
else if(n.getLeiXing()==0)jiChuSh=static_cast<int>(jiChuSh*1.2f);
f.shouDaoShangHai(jiChuSh);
int nSh=(int)(ns.moChang()*f.shangHaiXiShu*0.2f);
n.shouDaoShangHai(nSh);
dangFangKuaiBeiJiZhong(i,l);
float chongDie=bj+f.getBanJing()-ju;
if(chongDie>0){
ShiLiang2 fenLi=fx*(chongDie*0.5f);
n.sheWeiZhi(nw+fenLi);
f.sheWeiZhi(fw-fenLi);
nw=n.getWeiZhi();
}
if(!f.shiJiHuo()){
lianJi++;lianJiBeiShu=1.0f+lianJi*0.1f;
fenShu+=f.getJiangLi()*lianJiBeiShu;
chuangJianBaoZha(f.getWeiZhi());
qingChuWeiZhiZhanYong((int)fw.x,(int)fw.y,f.getDuiDieGaoDu());
dangFangKuaiCuiHui(i);
}
break;
}
}
}
for(size_t e=0;e<danLie.size();){
Dan& d=danLie[e];
if(!d.shiJiHuo()){e++;continue;}
ShiLiang2 dw=d.getWeiZhi();
bool ji=false;
for(auto& z:xiaoZhuLie){
if(!z.shiJiHuo())continue;
float dx=dw.x-z.getWeiZhi().x,dy=dw.y-z.getWeiZhi().y,ju=sqrt(dx*dx+dy*dy);
if(ju<d.getBanJing()+z.getBanJing()){
z.shouDaoShangHai(d.getShangHai());
if(!z.shiJiHuo()){lianJi++;lianJiBeiShu=1.0f+lianJi*0.1f;fenShu+=z.getJiangLi()*lianJiBeiShu;chuangJianBaoZha(z.getWeiZhi());}
d.sheJiHuo(false);ji=true;break;
}
}
if(ji){e++;continue;}
for(auto& f:fangKuaiLie){
if(!f.shiJiHuo())continue;
float dx=dw.x-f.getWeiZhi().x,dy=dw.y-f.getWeiZhi().y,ju=sqrt(dx*dx+dy*dy);
if(ju<d.getBanJing()+f.getBanJing()){
f.shouDaoShangHai(d.getShangHai());
if(!f.shiJiHuo()){lianJi++;lianJiBeiShu=1.0f+lianJi*0.1f;fenShu+=f.getJiangLi()*lianJiBeiShu;chuangJianBaoZha(f.getWeiZhi());}
d.sheJiHuo(false);ji=true;break;
}
}
if(ji){e++;continue;}e++;
}
for(size_t i=0;i<xiaoZhuLie.size();)if(!xiaoZhuLie[i].shiJiHuo())xiaoZhuLie.erase(xiaoZhuLie.begin()+i);else i++;
for(size_t i=0;i<fangKuaiLie.size();)if(!fangKuaiLie[i].shiJiHuo())fangKuaiLie.erase(fangKuaiLie.begin()+i);else i++;
}
void xiuFuChanDong(){
static map<int,int> fangKuaiJingZhi;
for(auto& f:fangKuaiLie){
if(!f.shiJiHuo()||!f.yingYongWuLiMa()||f.getSuDu().moChang()>=0.1f){fangKuaiJingZhi[f.getId()]=0;continue;}
fangKuaiJingZhi[f.getId()]=(fangKuaiJingZhi[f.getId()]+1)%30;
if(fangKuaiJingZhi[f.getId()]>20){
f.sheSuDu(ShiLiang2(0,0));f.sheYingYongWuLi(false);f.sheWenDing(true);
if(f.getWeiZhi().y>=DI_MIAN_Y-0.5f){f.sheWeiZhi(ShiLiang2(f.getWeiZhi().x,DI_MIAN_Y));f.sheLuoDi(true);}
}
}
static map<int,int> xiaoZhuJingZhi;
for(auto& z:xiaoZhuLie){
if(!z.shiJiHuo()||z.getShouJiLengQue()>0||!z.yingYongWuLiMa()||z.getSuDu().moChang()>=0.1f){xiaoZhuJingZhi[z.getId()]=0;continue;}
xiaoZhuJingZhi[z.getId()]=(xiaoZhuJingZhi[z.getId()]+1)%30;
if(xiaoZhuJingZhi[z.getId()]>20){
z.sheSuDu(ShiLiang2(0,0));z.sheYingYongWuLi(false);z.sheWenDing(true);
if(z.getWeiZhi().y>=DI_MIAN_Y-0.5f){z.sheWeiZhi(ShiLiang2(z.getWeiZhi().x,DI_MIAN_Y));z.sheLuoDi(true);}
}
}
}
void chuangJianBaoZha(ShiLiang2 w,int daXiao=5){
BaoZha b;b.weiZhi=w;b.jiShiQi=daXiao*2;b.zuiDaJiShi=daXiao*2;
baoZhaLie.push_back(b);
}
void shengChengGuanQia(){
guanQiaLie.clear();
for(int i=1;i<=ZUI_DA_GUAN_QIA;i++){
GuanQiaShuJu gq;
shengChengDuYiGuanQia(gq,i);
guanQiaLie.push_back(gq);
}
}
void jieSuoGuanQia(int bianHao){
if(bianHao>0&&bianHao<=ZUI_DA_GUAN_QIA){
cunDang.she("unlocked_"+to_string(bianHao),"1");
int zuiGao=cunDang.getInt("highest_level",1);
if(bianHao>zuiGao)cunDang.she("highest_level",to_string(bianHao));
cunDang.save();
}
}
bool guanQiaYiJieSuo(int bianHao){
if(bianHao==1)return true;
return cunDang.getBool("unlocked_"+to_string(bianHao),false);
}
int getZuiGaoJieSuo(){return cunDang.getInt("highest_level",1);}
void loadCunDang(){
zongFenShu=cunDang.getInt("total_score",0);
xianShiJiaoCheng=cunDang.getBool("show_tutorial",true);
dangQianGuanQia=cunDang.getInt("current_level",1);
}
void saveCunDang(){
cunDang.she("total_score",to_string(zongFenShu));
cunDang.she("show_tutorial",xianShiJiaoCheng?"1":"0");
cunDang.save();
}
void huaZhiGuiJi(){
ShiLiang2 kaiShi=danGong.getWeiZhi();
float jiao=miaoZhunJiao*YUAN_ZHOU_LV/180.0f;
ShiLiang2 fx(sin(jiao),-cos(jiao));
ShiLiang2 w=kaiShi,s=fx*miaoZhunLiDu;
for(int i=0;i<60;i++){
w.x+=s.x*0.15f;w.y+=s.y*0.15f;
s.y+=ZHONG_LI*0.15f;s.x*=pow(KONG_QI_ZU_LI,0.15f);s.y*=pow(KONG_QI_ZU_LI,0.15f);
int x=(int)w.x,y=(int)w.y;
if(x>=1&&x<PING_MU_KUAN-1&&y>=5&&y<DI_MIAN_Y-1)huaZhiDaoHuanChong(x,y,'.',HUANG_SE);
else break;
if(w.y>=DI_MIAN_Y)break;
}
}
void huaZhiPingMu(){
qingKongHuanChong();
switch(youXiZhuangTai){
case CAI_DAN:huaZhiCaiDan();break;
case GUAN_QIA_XUAN_ZE:huaZhiGuanQiaXuanZe();break;
case YOU_XI_ZHONG:huaZhiYouXi();break;
case GUAN_QIA_WAN_CHENG:huaZhiGuanQiaWanCheng();break;
case YOU_XI_SHI_BAI:huaZhiYouXiShiBai();break;
case JIAO_CHENG:huaZhiJiaoCheng();break;
}
xianShiHuanChong();
}
void huaZhiCaiDan(){
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-12,4,"=== 愤怒的小鸟 ===",QIAN_HONG);
vector<string> caiDan={"1. 开始游戏 (当前: 第 "+to_string(dangQianGuanQia)+" 关)","2. 选择关卡","3. 新手教程","4. 重置存档","5. 退出游戏"};
vector<int> yse={QIAN_LV,QIAN_QING,QIAN_LAN,QIAN_HONG,AN_HUI};
for(size_t i=0;i<caiDan.size();i++)huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-20,10+i*2,caiDan[i],yse[i]);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-20,24,"总分数: "+to_string(zongFenShu),QIAN_QING);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-20,25,"已解锁关卡: "+to_string(getZuiGaoJieSuo())+"/50",QIAN_LV);
}
void huaZhiGuanQiaXuanZe(){
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-10,2,"=== 选择关卡 ===",HUANG_SE);
int sx=5,sy=5,cols=10,rows=5;
for(int i=1;i<=ZUI_DA_GUAN_QIA;i++){
int c=(i-1)%cols,r=(i-1)/cols;
if(r>=rows)continue;
int x=sx+c*9,y=sy+r*3,yse;
if(i==dangQianGuanQia)yse=HUANG_SE;
else if(guanQiaYiJieSuo(i)){
if(i<=10)yse=QIAN_LV;else if(i<=20)yse=QIAN_QING;else if(i<=30)yse=HUANG_SE;
else if(i<=40)yse=QIAN_ZI;else yse=QIAN_HONG;
}else yse=AN_HUI;
huaZhiWenZiDaoHuanChong(x+1,y,"Lv."+to_string(i),yse);
char zt=guanQiaYiJieSuo(i)?'>':'X';
huaZhiDaoHuanChong(x+6,y,zt,guanQiaYiJieSuo(i)?QIAN_LV:QIAN_HONG);
}
huaZhiWenZiDaoHuanChong(10,PING_MU_GAO-2,"方向键选择,回车键确认,ESC返回",AN_HUI);
}
void huaZhiYouXi(){
GuanQiaShuJu gq=getGuanQia(dangQianGuanQia);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-15,0,"愤怒的小鸟 - 第 "+to_string(dangQianGuanQia)+" 关",HUANG_SE);
huaZhiWenZiDaoHuanChong(2,1,"分数: "+to_string(fenShu),QIAN_LV);
huaZhiWenZiDaoHuanChong(2,2,"连击: "+to_string(lianJi)+" (x"+to_string(lianJiBeiShu).substr(0,3)+")",QIAN_ZI);
huaZhiWenZiDaoHuanChong(2,3,"剩余小鸟: "+to_string(xiaoNiaoLie.size()),QIAN_QING);
huaZhiWenZiDaoHuanChong(2,4,"剩余猪: "+to_string(xiaoZhuLie.size()),QIAN_HONG);
if(!xiaoNiaoLie.empty()&&xiaoNiaoLie[0].shiFaShe()){
string jiNeng;int yse;
switch(xiaoNiaoLie[0].getLeiXing()){
case 0:jiNeng="红色: 分裂";yse=QIAN_HONG;break;
case 1:jiNeng="蓝色: 冲刺";yse=QIAN_LAN;break;
case 2:jiNeng="黄色: 俯冲";yse=HUANG_SE;break;
case 3:jiNeng="黑色: 爆炸";yse=QIAN_ZI;break;
case 4:jiNeng="绿色: 回旋";yse=QIAN_LV;break;
case 5:jiNeng="白色: 下蛋";yse=BAI_SE;break;
default:jiNeng="";yse=BAI_SE;
}
huaZhiWenZiDaoHuanChong(2,5,"能力: "+jiNeng,yse);
if(xiaoNiaoLie[0].nengJiHuoShouDongJiNeng())huaZhiWenZiDaoHuanChong(2,6,"按A键激活能力!",QIAN_QING);
else if(xiaoNiaoLie[0].shiLuoDi())huaZhiWenZiDaoHuanChong(2,6,"已落地,无法使用技能",AN_HUI);
else if(xiaoNiaoLie[0].getJiNengLengQue()>0)huaZhiWenZiDaoHuanChong(2,6,"技能冷却中: "+to_string(xiaoNiaoLie[0].getJiNengLengQue()),QIAN_HONG);
}
for(int x=0;x<PING_MU_KUAN;x++)huaZhiDaoHuanChong(x,DI_MIAN_Y,'_',LV_SE);
int x=(int)danGong.getWeiZhi().x,y=(int)danGong.getWeiZhi().y;
huaZhiWenZiDaoHuanChong(x-2,y-1,"/ \\",HUANG_SE);
huaZhiWenZiDaoHuanChong(x-2,y,"| |",HUANG_SE);
huaZhiWenZiDaoHuanChong(x-2,y+1,"\\_/",HUANG_SE);
huaZhiFangKuai();
for(auto& z:xiaoZhuLie){
if(z.shiJiHuo()){
int xz=(int)z.getWeiZhi().x,yz=(int)z.getWeiZhi().y;
huaZhiDaoHuanChong(xz,yz,z.getFuHao(),z.getYanSe());
if(z.getXueLiang()<z.getZuiDaXueLiang()){
float bi=(float)z.getXueLiang()/z.getZuiDaXueLiang();
int man=(int)(bi*3);
for(int bx=-1;bx<=1;bx++){
int yse=(bx<man-2)?QIAN_HONG:(bx<man-1)?HUANG_SE:QIAN_LV;
huaZhiDaoHuanChong(xz+bx,yz+1,'=',yse);
}
}
}
}
if(!xiaoNiaoLie.empty()&&xiaoNiaoLie[0].shiJiHuo()){
int xn=(int)xiaoNiaoLie[0].getWeiZhi().x,yn=(int)xiaoNiaoLie[0].getWeiZhi().y;
if(xiaoNiaoLie[0].nengJiHuoShouDongJiNeng()&&(GetTickCount()/200)%2)
for(int dx=-1;dx<=1;dx++)for(int dy=-1;dy<=1;dy++)if(abs(dx)+abs(dy)==1)huaZhiDaoHuanChong(xn+dx,yn+dy,'*',QIAN_QING);
huaZhiDaoHuanChong(xn,yn,xiaoNiaoLie[0].getFuHao(),xiaoNiaoLie[0].getYanSe());
}
for(auto& d:danLie)if(d.shiJiHuo())huaZhiDaoHuanChong((int)d.getWeiZhi().x,(int)d.getWeiZhi().y,d.getFuHao(),d.getYanSe());
for(auto& b:baoZhaLie){
int xb=(int)b.weiZhi.x,yb=(int)b.weiZhi.y,r=b.jiShiQi/2;
for(int dx=-r;dx<=r;dx++)for(int dy=-r;dy<=r;dy++){
if(dx*dx+dy*dy<=r*r){
int cx=xb+dx,cy=yb+dy;
if(cx>=0&&cx<PING_MU_KUAN&&cy>=0&&cy<PING_MU_GAO){
char f=b.jiShiQi>b.zuiDaJiShi/2?'@':'*';
int yse=b.jiShiQi>b.zuiDaJiShi/2?QIAN_HONG:HUANG_SE;
huaZhiDaoHuanChong(cx,cy,f,yse);
}
}
}
}
if(xianShiGuiJi&&!xiaoNiaoLie.empty()&&xiaoNiaoLie[0].shiZaiDanGong())huaZhiGuiJi();
int sy=DI_MIAN_Y+2;
huaZhiWenZiDaoHuanChong(2,sy,"控制:",HUANG_SE);
huaZhiWenZiDaoHuanChong(2,sy+1,"←→/AD : 角度 ("+to_string((int)miaoZhunJiao)+"°)",BAI_SE);
huaZhiWenZiDaoHuanChong(2,sy+2,"↑↓/WS : 力度 ("+to_string((int)miaoZhunLiDu)+"/18)",BAI_SE);
huaZhiWenZiDaoHuanChong(2,sy+3,"空格 : 发射小鸟",BAI_SE);
huaZhiWenZiDaoHuanChong(2,sy+4,"A键 : 激活特殊能力",QIAN_QING);
huaZhiWenZiDaoHuanChong(2,sy+5,"ESC : 返回菜单",BAI_SE);
}
void huaZhiFangKuai(){
vector<int> xu(fangKuaiLie.size());
for(size_t i=0;i<fangKuaiLie.size();i++)xu[i]=i;
sort(xu.begin(),xu.end(),[this](int a,int b){return fangKuaiLie[a].getWeiZhi().y>fangKuaiLie[b].getWeiZhi().y;});
for(int i:xu){
if(!fangKuaiLie[i].shiJiHuo()||fangKuaiLie[i].getQiangDu()<=0)continue;
int x=(int)fangKuaiLie[i].getWeiZhi().x,y=(int)fangKuaiLie[i].getWeiZhi().y,gao=fangKuaiLie[i].getDuiDieGaoDu();
int yse=fangKuaiLie[i].getYanSe();
int qd=fangKuaiLie[i].getQiangDu(),zd=25*(1+gao*0.3f);
if(qd<zd*0.3)yse=QIAN_HONG;else if(qd<zd*0.6)yse=HUANG_SE;
for(int h=0;h<gao;h++){
int cy=y-h;
if(cy>=1&&cy<PING_MU_GAO-1&&x>=1&&x<PING_MU_KUAN-1)
huaZhiDaoHuanChong(x,cy,fangKuaiLie[i].getFuHao(),yse);
}
}
}
void huaZhiGuanQiaWanCheng(){
int wan=dangQianGuanQia-1;
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-15,10,"★★★★★★★★★★★★★★",HUANG_SE);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-12,11,"关卡完成!",QIAN_LV);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-15,12,"★★★★★★★★★★★★★★",HUANG_SE);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-20,14,"恭喜完成第 "+to_string(wan)+" 关!",QIAN_QING);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-20,15,"获得分数: "+to_string(fenShu),HUANG_SE);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-20,16,"累计总分: "+to_string(zongFenShu),QIAN_LV);
if(dangQianGuanQia<=ZUI_DA_GUAN_QIA)huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-15,18,"按 N 进入下一关",QIAN_LV);
else huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-15,18,"恭喜通关全部50关!",QIAN_HONG);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-20,19,"按 ESC 返回主菜单",AN_HUI);
}
void huaZhiYouXiShiBai(){
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-10,10,"=== 游戏结束 ===",QIAN_HONG);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-15,12,"第 "+to_string(dangQianGuanQia)+" 关失败",HUANG_SE);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-15,13,"获得分数: "+to_string(fenShu),QIAN_QING);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-20,15,"按 R 重新挑战本关",QIAN_LV);
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-20,16,"按 ESC 返回主菜单",AN_HUI);
}
void huaZhiJiaoCheng(){
huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-10,2,"=== 新手教程 ===",HUANG_SE);
vector<string> jc={"愤怒的小鸟","操作说明","方向键调整角度力度","空格发射小鸟","A键使用技能","ESC返回菜单","任意键开始游戏"};
for(size_t i=0;i<jc.size();i++)huaZhiWenZiDaoHuanChong(PING_MU_KUAN/2-10,4+i,jc[i],i==0?QIAN_HONG:BAI_SE);
}
void chuLiShuRu(){
if(_kbhit()){
int jian=_getch();
if(jian==0||jian==0xE0){
int tou=_getch();
if(tou==72){if(youXiZhuangTai==YOU_XI_ZHONG&&!xiaoNiaoLie.empty()&&xiaoNiaoLie[0].shiZaiDanGong())miaoZhunLiDu=min(miaoZhunLiDu+0.5f,18.0f);}
else if(tou==80){if(youXiZhuangTai==YOU_XI_ZHONG&&!xiaoNiaoLie.empty()&&xiaoNiaoLie[0].shiZaiDanGong())miaoZhunLiDu=max(miaoZhunLiDu-0.5f,1.0f);}
else if(tou==75){if(youXiZhuangTai==YOU_XI_ZHONG&&!xiaoNiaoLie.empty()&&xiaoNiaoLie[0].shiZaiDanGong())miaoZhunJiao=max(miaoZhunJiao-3.0f,10.0f);else if(youXiZhuangTai==GUAN_QIA_XUAN_ZE)dangQianGuanQia=max(1,dangQianGuanQia-1);}
else if(tou==77){if(youXiZhuangTai==YOU_XI_ZHONG&&!xiaoNiaoLie.empty()&&xiaoNiaoLie[0].shiZaiDanGong())miaoZhunJiao=min(miaoZhunJiao+3.0f,90.0f);else if(youXiZhuangTai==GUAN_QIA_XUAN_ZE)dangQianGuanQia=min(ZUI_DA_GUAN_QIA,dangQianGuanQia+1);}
return;
}
switch(youXiZhuangTai){
case CAI_DAN:chuLiCaiDanShuRu(jian);break;
case GUAN_QIA_XUAN_ZE:chuLiGuanQiaXuanZeShuRu(jian);break;
case YOU_XI_ZHONG:chuLiYouXiShuRu(jian);break;
case GUAN_QIA_WAN_CHENG:chuLiGuanQiaWanChengShuRu(jian);break;
case YOU_XI_SHI_BAI:chuLiYouXiShiBaiShuRu(jian);break;
case JIAO_CHENG:chuLiJiaoChengShuRu(jian);break;
}
}
}
void chuLiCaiDanShuRu(int jian){
if(jian=='1'){if(xianShiJiaoCheng)youXiZhuangTai=JIAO_CHENG;else{sheZhiGuanQia(dangQianGuanQia);youXiZhuangTai=YOU_XI_ZHONG;}}
else if(jian=='2')youXiZhuangTai=GUAN_QIA_XUAN_ZE;
else if(jian=='3')youXiZhuangTai=JIAO_CHENG;
else if(jian=='4'){cunDang.reset();dangQianGuanQia=1;zongFenShu=0;loadCunDang();}
else if(jian=='5'||jian=='q'||jian=='Q'||jian==27)youXiJieShu=true;
}
void chuLiGuanQiaXuanZeShuRu(int jian){
if(jian==27)youXiZhuangTai=CAI_DAN;
else if(jian==13){if(guanQiaYiJieSuo(dangQianGuanQia)){sheZhiGuanQia(dangQianGuanQia);youXiZhuangTai=YOU_XI_ZHONG;}}
}
void chuLiYouXiShuRu(int jian){
if(jian==27){youXiZhuangTai=CAI_DAN;saveCunDang();return;}
else if(jian==' '){if(!xiaoNiaoLie.empty()&&xiaoNiaoLie[0].shiZaiDanGong()){float jiao=miaoZhunJiao*YUAN_ZHOU_LV/180.0f;ShiLiang2 fx(sin(jiao),-cos(jiao));xiaoNiaoLie[0].faSheXiaoNiao(fx,miaoZhunLiDu);}}
else if(jian=='a'||jian=='A'){if(!xiaoNiaoLie.empty()&&xiaoNiaoLie[0].nengJiHuoShouDongJiNeng()){
xiaoNiaoLie[0].jiHuoTeShuJiNeng();
ShiLiang2 w=xiaoNiaoLie[0].getWeiZhi();
int lx=xiaoNiaoLie[0].getLeiXing();
if(lx==5)danLie.emplace_back(w.x,w.y);
else if(lx==0)yingYongBaoZha(w,3,false);
else if(lx==3)yingYongBaoZha(w,6,true);
}}
else if(jian=='r'||jian=='R'){sheZhiGuanQia(dangQianGuanQia);youXiZhuangTai=YOU_XI_ZHONG;}
else if(jian=='t'||jian=='T')xianShiGuiJi=!xianShiGuiJi;
}
void chuLiGuanQiaWanChengShuRu(int jian){
if((jian=='n'||jian=='N')&&dangQianGuanQia<=ZUI_DA_GUAN_QIA){sheZhiGuanQia(dangQianGuanQia);youXiZhuangTai=YOU_XI_ZHONG;}
else if(jian==27)youXiZhuangTai=CAI_DAN;
}
void chuLiYouXiShiBaiShuRu(int jian){
if(jian=='r'||jian=='R'){sheZhiGuanQia(dangQianGuanQia);youXiZhuangTai=YOU_XI_ZHONG;}
else if(jian==27)youXiZhuangTai=CAI_DAN;
}
void chuLiJiaoChengShuRu(int jian){
youXiZhuangTai=CAI_DAN;
xianShiJiaoCheng=false;
saveCunDang();
}
void run(){
yinCangGuangBiao();
qingPing();
sheZhiGuangBiaoWeiZhi(PING_MU_KUAN/2-12,PING_MU_GAO/2-5);
sheZhiYanSe(QIAN_HONG);
cout<<"=== 愤怒的小鸟 ===";
sheZhiGuangBiaoWeiZhi(PING_MU_KUAN/2-20,PING_MU_GAO/2+1);
cout<<"按任意键开始游戏...";
sheZhiYanSe(BAI_SE);
_getch();
while(!youXiJieShu){
chuLiShuRu();
gengXin();
huaZhiPingMu();
Sleep(ZHEN_YAN_CHI);
}
saveCunDang();
qingPing();
sheZhiGuangBiaoWeiZhi(PING_MU_KUAN/2-15,PING_MU_GAO/2-3);
sheZhiYanSe(QIAN_HONG);
cout<<"感谢游玩!";
xianShiGuangBiao();
_getch();
}
};
const FenNuXiaoNiaoYouXi::JianZhuMoBan FenNuXiaoNiaoYouXi::jianZhuMoBan[]={
{ { {-2,3,'#'}, {0,5,'#'}, {2,3,'#'} }, { {0,-5} } },
{ { {-3,1,'#'}, {-2,2,'#'}, {-1,3,'#'}, {0,4,'#'}, {1,3,'#'}, {2,2,'#'}, {3,1,'#'} }, { {0,-4} } },
{ { {-5,6,'%'}, {-4,6,'%'}, {-3,3,'#'}, {-2,3,'#'}, {-1,3,'#'}, {0,3,'#'}, {1,3,'#'}, {2,3,'#'}, {3,6,'%'}, {4,6,'%'} }, { {-5,-6}, {4,-6} } },
{ { {-4,5,'%'}, {-3,5,'%'}, {3,5,'%'}, {4,5,'%'}, {-2,3,'='}, {-1,3,'='}, {0,3,'='}, {1,3,'='}, {2,3,'='} }, { {0,-3} } },
{ { {-4,2,'#'}, {-3,3,'#'}, {-2,4,'#'}, {-1,5,'#'}, {0,6,'#'}, {1,5,'#'}, {2,4,'#'}, {3,3,'#'}, {4,2,'#'} }, { {0,-6} } },
{ { {-6,4,'#'}, {-3,2,'&'}, {0,6,'x'}, {3,2,'&'}, {6,4,'#'} }, { {-6,-4}, {0,-6}, {6,-4} } },
{ { {-3,5,'+'}, {-2,5,'+'}, {-1,5,'+'}, {0,5,'+'}, {1,5,'+'}, {2,5,'+'}, {3,5,'+'} }, { {0,-5} } },
{ { {-5,4,'#'}, {-3,6,'%'}, {-1,3,'#'}, {1,2,'&'}, {3,5,'x'} }, { {-3,-6}, {3,-5} } },
{ { {-6,7,'#'}, {-5,7,'#'}, {-4,7,'#'}, {-3,4,'='}, {-2,4,'='}, {-1,4,'='}, {0,4,'='}, {1,4,'='}, {2,4,'='}, {3,7,'#'}, {4,7,'#'}, {5,7,'#'} }, { {-5,-7}, {4,-7} } },
{ { {0,1,'#'}, {1,2,'#'}, {2,3,'#'}, {3,4,'#'}, {4,5,'#'}, {5,6,'#'} }, { {5,-6} } },
{ { {-4,1,'#'}, {-3,2,'#'}, {-2,3,'#'}, {-1,4,'#'}, {0,5,'#'}, {1,4,'#'}, {2,3,'#'}, {3,2,'#'}, {4,1,'#'} }, { {0,-5} } },
{ { {-3,4,'&'}, {-2,4,'&'}, {-1,4,'&'}, {0,6,'%'}, {1,4,'&'}, {2,4,'&'}, {3,4,'&'} }, { {0,-6} } },
{ { {-4,3,'#'}, {-3,5,'x'}, {-2,3,'#'}, {2,3,'#'}, {3,5,'x'}, {4,3,'#'} }, { {-3,-5}, {3,-5} } },
{ { {-5,2,'='}, {-4,4,'#'}, {-3,6,'%'}, {-2,4,'#'}, {-1,2,'='}, {1,2,'='}, {2,4,'#'}, {3,6,'%'}, {4,4,'#'}, {5,2,'='} }, { {-3,-6}, {3,-6} } },
{ { {-3,3,'T'}, {-2,3,'T'}, {-1,3,'T'}, {0,7,'H'}, {1,3,'T'}, {2,3,'T'}, {3,3,'T'} }, { {0,-7} } },
{ { {-2,5,'B'}, {-1,5,'B'}, {0,5,'B'}, {1,5,'B'}, {2,5,'B'} }, { {0,-5} } },
{ { {-4,2,'S'}, {-3,4,'S'}, {-2,6,'S'}, {-1,8,'S'}, {0,9,'S'}, {1,8,'S'}, {2,6,'S'}, {3,4,'S'}, {4,2,'S'} }, { {0,-9} } },
{ { {-2,6,'%'}, {-1,6,'%'}, {0,6,'%'}, {1,6,'%'}, {2,6,'%'}, {-1,3,'#'}, {0,3,'#'}, {1,3,'#'} }, { {-1,-6}, {1,-6}, {0,-3} } },
{ { {-3,4,'x'}, {-2,4,'x'}, {-1,4,'x'}, {0,4,'x'}, {1,4,'x'}, {2,4,'x'}, {3,4,'x'} }, { {0,-4} } },
{ { {-6,3,'#'}, {-5,3,'#'}, {-4,3,'#'}, {-3,3,'#'}, {-2,5,'&'}, {-1,5,'&'}, {0,5,'&'}, {1,5,'&'}, {2,5,'&'}, {3,3,'#'}, {4,3,'#'}, {5,3,'#'}, {6,3,'#'} }, { {-1,-5}, {1,-5} } },
{ { {-4,1,'='}, {-3,2,'='}, {-2,3,'='}, {-1,4,'='}, {0,5,'='}, {1,4,'='}, {2,3,'='}, {3,2,'='}, {4,1,'='} }, { {0,-5} } },
{ { {-5,5,'#'}, {-3,5,'#'}, {-1,5,'#'}, {1,5,'#'}, {3,5,'#'}, {5,5,'#'} }, { {-5,-5}, {-3,-5}, {-1,-5}, {1,-5}, {3,-5}, {5,-5} } },
{ { {-4,8,'%'}, {-2,6,'%'}, {0,4,'%'}, {2,6,'%'}, {4,8,'%'} }, { {-4,-8}, {4,-8} } },
{ { {-3,3,'+'}, {-2,5,'+'}, {-1,7,'+'}, {0,9,'+'}, {1,7,'+'}, {2,5,'+'}, {3,3,'+'} }, { {0,-9} } },
{ { {-2,2,'#'}, {-1,4,'#'}, {0,6,'#'}, {1,4,'#'}, {2,2,'#'} }, { {0,-6} } },
{ { {-6,1,'&'}, {-5,2,'&'}, {-4,3,'&'}, {-3,4,'&'}, {-2,5,'&'}, {-1,6,'&'}, {0,7,'&'}, {1,6,'&'}, {2,5,'&'}, {3,4,'&'}, {4,3,'&'}, {5,2,'&'}, {6,1,'&'} }, { {0,-7} } },
{ { {-3,6,'B'}, {-2,5,'B'}, {-1,4,'B'}, {0,3,'B'}, {1,4,'B'}, {2,5,'B'}, {3,6,'B'} }, { {-2,-5}, {2,-5} } },
{ { {-4,4,'S'}, {-2,6,'S'}, {0,8,'S'}, {2,6,'S'}, {4,4,'S'} }, { {-4,-4}, {4,-4} } },
{ { {-5,1,'T'}, {-4,2,'T'}, {-3,3,'T'}, {-2,4,'T'}, {-1,5,'T'}, {0,6,'T'}, {1,5,'T'}, {2,4,'T'}, {3,3,'T'}, {4,2,'T'}, {5,1,'T'} }, { {0,-6} } },
{ { {-4,7,'x'}, {-3,5,'x'}, {-2,3,'x'}, {-1,1,'x'}, {1,1,'x'}, {2,3,'x'}, {3,5,'x'}, {4,7,'x'} }, { {-4,-7}, {4,-7} } }
};
int main() {
FenNuXiaoNiaoYouXi game;
game.run();
return 0;
}