- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define N 40
- void print_bing();//显示数据
- void printlist();//显示输出战场信息
- void print();//显示步,弓,骑
- void chushihua();//对战场进行初始化
- void chushihua1();//对进攻士兵进行初始化
- void chushihua2();//对防守士兵进行初始化
- void search();//寻找最近敌方士兵
- void search1();//寻找最近敌方士兵
- void move();//士兵移动一个单位
- void move1();//士兵移动一个单位
- void tiaozheng();//调整所有士兵的位置
- void chakan();//查看自己的坐标和最近的敌军坐标
- void qingchubushu();//重置所有步数
- void qingqibingchubushu();//重置骑兵步数
- void attack();//计算伤害
- int panduan();//判断是否有队伍胜利
- typedef struct bingzhong
- {
- int hp;//血量
- int gongjili;//攻击力
- int bz;//兵种
- int fw;//攻击范围
- int x;//最近敌军的纵向坐标
- int y;//最近敌军的横向坐标
- int xingdongli;//一次能移动的次数
- int bushu;//是否被移动过的标志
- }Bing;//定义士兵
- /*
- void printlist()
- {
- printf("-------------------------------------------------------------\n");
- printf("|兵种----|符号 |造价|攻击力|暴击率|防御力|血量 |攻击范围|移动矩离\n");
- printf("-------------------------------------------------------------\n");
- printf("|弓箭手--|--A--|100-|18----|5%------|1----|100--|1~3---|1-----\n");
- printf("-------------------------------------------------------------\n");
- printf("|步兵 | F |75 |15 |8% |3 |150 |1 |1 \n");
- printf("-------------------------------------------------------------\n");
- printf("|骑士 | K |150 |20 |10% |5 |200 |1 |3 \n");
- printf("-------------------------------------------------------------\n");
- printf("兵种相克关系:步兵克骑士,骑士克弓箭手,弓箭手克步兵\n");
- printf("-------------------------------------------------------------\n");
- }//显示数据
- */
- void tiaozheng(Bing head[][N],int hang)
- {
- search(head[0],hang);
- move(head[0],hang);
- search(head[0],hang);
- qingqibingchubushu(head[0],hang);
- move(head[0],hang);
- search(head[0],hang);
- qingqibingchubushu(head[0],hang);
- move(head[0],hang);
- qingchubushu(head[0],hang);
- attack(head[0],hang);
- }//调整所有士兵的位置
- void attack(Bing head[][N],int hang)
- {
- int i=0,j=0,x1=0,y1=0;
- for(i=0;i<hang;i++)
- for(j=0;j<N;j++)
- if(head[i][j].bz>0)
- {
- if(head[i][j].fw>=(abs(head[i][j].x-i)+abs(head[i][j].y-j)))
- {
- x1=head[i][j].x;
- y1=head[i][j].y;
- head[x1][y1].hp=head[x1][y1].hp-head[i][j].gongjili;
- if(head[x1][y1].hp<=0)
- head[x1][y1].bz=0;
- }
- }
- }
- void qingqibingchubushu(Bing head[][N],int hang)
- {
- int i=0,j=0;
- for(i=0;i<hang;i++)
- for(j=0;j<N;j++)
- if(head[i][j].bz==3 || head[i][j].bz==6)
- head[i][j].bushu=0;
- }
- void move(Bing head[][N],int hang)
- {
- int i=0,j=0;
- for(i=0;i<hang;i++)
- for(j=0;j<N;j++)
- if(head[i][j].bz>0)
- move1(&head[i][j],head[0],i,j);
- }
- void move1(Bing* s ,Bing head[][40],int x,int y)
- {
- int juli=0;
- juli=abs(x-s->x)+abs(y-s->y);
- if(s->fw<juli && s->bushu<s->xingdongli)
- {
- if(s->x-x>0 && head[x+1][y].bz==0)
- {
- head[x+1][y].bz=s->bz;
- head[x+1][y].fw=s->fw;
- head[x+1][y].hp=s->hp;
- head[x+1][y].gongjili=s->gongjili;
- head[x+1][y].hp=s->hp;
- head[x+1][y].x=s->x;
- head[x+1][y].y=s->y;
- head[x+1][y].xingdongli=s->xingdongli;
- head[x+1][y].bushu=++(s->bushu);
- s->bz=0;
- return;
- }
- if(s->y-y<0 && head[x][y-1].bz==0 )
- {
- head[x][y-1].bz=s->bz;
- head[x][y-1].fw=s->fw;
- head[x][y-1].hp=s->hp;
- head[x][y-1].x=s->x;
- head[x][y-1].y=s->y;
- head[x][y-1].gongjili=s->gongjili;
- head[x][y-1].hp=s->hp;
- head[x][y-1].xingdongli=s->xingdongli;
- head[x][y-1].bushu=++(s->bushu);
- s->bz=0;
- return;
- }
- if(s->x-x<0 && head[x-1][y].bz==0)
- {
- head[x-1][y].bz=s->bz;
- head[x-1][y].fw=s->fw;
- head[x-1][y].hp=s->hp;
- head[x-1][y].x=s->x;
- head[x-1][y].y=s->y;
- head[x-1][y].gongjili=s->gongjili;
- head[x-1][y].hp=s->hp;
- head[x-1][y].xingdongli=s->xingdongli;
- head[x-1][y].bushu=++(s->bushu);
- s->bz=0;
- return;
- }
- if(s->y-y>0 && head[x][y+1].bz==0)//横向移动
- {
- head[x][y+1].bz=s->bz;
- head[x][y+1].fw=s->fw;
- head[x][y+1].hp=s->hp;
- head[x][y+1].x=s->x;
- head[x][y+1].y=s->y;
- head[x][y+1].gongjili=s->gongjili;
- head[x][y+1].hp=s->hp;
- head[x][y+1].xingdongli=s->xingdongli;
- head[x][y+1].bushu=++(s->bushu);
- s->bz=0;
- return;
- }
- }
- }//士兵移动一个单位
- void search(Bing head[][N],int hang)
- {
- int i=0,j=0;
- for(i=0;i<hang;i++)
- for(j=0;j<N;j++)
- if(head[i][j].bz>0)
- search1(head[0],hang,&head[i][j],i,j);
- }
- void search1(Bing head[][N],int hang,Bing* s,int x,int y)
- {
- int x1=0,y1=0,juli=0,i=0,j=0,biaoshi=10000;
- if(s->bz>0 && s->bz<4)
- {
- for(i=hang-1;i>=0;i--)
- for(j=39;j>=0;j--)
- if(head[i][j].bz>3 && head[i][j].bz<7)
- {
- juli=abs(i-x)+abs(j-y);
- if(juli<biaoshi)
- {
- biaoshi=juli;
- s->x=i;
- s->y=j;
- }
- }
- }
- if(s->bz>3 && s->bz<7)
- {
- for(i=0;i<hang;i++)
- for(j=0;j<N;j++)
- if(head[i][j].bz>0 && head[i][j].bz<4)
- {
- juli=abs(i-x)+abs(j-y);
- if(juli<biaoshi)
- {
- biaoshi=juli;
- s->x=i;
- s->y=j;
- }
- }
- }
- }//寻找最近敌方士兵
- void qingchubushu(Bing head[][N],int hang)
- {
- int i=0,j=0;
- for(i=0;i<hang;i++)
- for(j=0;j<N;j++)
- if(head[i][j].bz>0)
- head[i][j].bushu=0;
- }
- void chushihua(Bing* s,int hang)
- {
- int i=0;
- for(i=0;i<N*hang;i++,s++)
- {
- s->bz=0;
- }
- }//对战场进行初始化
- void chushihua1(Bing s1[][40],int bing11,int bing12,int bing13)
- {
- int i=0;
- Bing* s=(Bing*)s1;
- for(i=0;i<bing11;i++,s++)
- {s->bz=1;s->fw=3;s->bushu=0;s->xingdongli=1;s->hp=100;s->gongjili=18;}
- for(i=0;i<bing12;i++,s++)
- {s->bz=2;s->fw=1;s->bushu=0;s->xingdongli=1;s->hp=150;s->gongjili=15;}
- for(i=0;i<bing13;i++,s++)
- {s->bz=3;s->fw=1;s->bushu=0;s->xingdongli=1;s->hp=200;s->gongjili=20;}
- }//对士兵进行定位
- void chushihua2(Bing s1[][40],int bing21,int bing22,int bing23,int hang)
- {
- int i=0,j=0;
- Bing* s=(Bing*)s1;
- s=s+(hang-1)*40;
- for(;j<bing21;s++,j++)
- {
- s->bz=4;s->fw=3;s->bushu=0;s->xingdongli=1;s->hp=100;s->gongjili=18;
- i++;
- if(i>39)
- {s=s-80;i=0;}
- }
- for(j=0;j<bing22;s++,j++)
- {
- s->bz=5;s->fw=1;s->bushu=0;s->xingdongli=1;s->hp=150;s->gongjili=15;
- i++;
- if(i>39)
- {s=s-80;i=0;}
- }
- for(j=0;j<bing23;s++,j++)
- {
- s->bz=6;s->fw=1;s->bushu=0;s->xingdongli=1;s->hp=200;s->gongjili=20;
- i++;
- if(i>39)
- {s=s-80;i=0;}
- }
- }//对防守士兵进行初始化
- void print(int bz)
- {
- switch (bz)
- {
- case 1:printf("弓");break;
- case 2:printf("兵");break;
- case 3:printf("车");break;
- case 4:printf("弩");break;
- case 5:printf("卒");break;
- case 6:printf("車");break;
- default:printf(" ");break;
- }
- }//显示步,弓,骑
- void print_bing(Bing s[][N],int i1)
- {
- printf("-------------------------------------------------------------\n");
- int i=0,j=0;
- for(i=i1-1;i>=0;i--)
- {
- for(j=0;j<N;j++)
- print(s[i][j].bz);
- printf("\n");
- }
- printf("-------------------------------------------------------------\n");
- }//显示输出战场信息
- void chakan(Bing b[][N],int hang)
- {
- int i=0,j=0;
- for(i=0;i<hang;i++)
- for(j=0;j<N;j++)
- {
- if(b[i][j].bz>0)
- printf("兵种%d的i,j=%d,%d | i1,j1=%d,%d\n",b[i][j].bz,i,j,b[i][j].x,b[i][j].y);
- }
- }
- int panduan(Bing head[][N],int hang)
- {
- int i=0,j=0,zifang=0,difang=0;
- for(i=0;i<hang;i++)
- for(j=0;j<N;j++)
- {
- if(head[i][j].bz>0 && head[i][j].bz<4)
- zifang=1;
- if(head[i][j].bz>3 && head[i][j].bz<7)
- difang=1;
- }
- if(zifang==1 && difang==0)
- return 1;
- if(zifang==0 && difang==1)
- return 2;
- else
- return 0;
- }
- int main(int argc, char** argv)
- {
- static int lie1=0,lie2=0;//lie1是进攻方的士兵行数,lie2是防守方的士兵行数
- int i=0,j=0,moshi=0,bing11=0,bing12=0,bing13=0,bing10=0,bing21=0,bing22=0,bing23=0,bing20=0,shengli=0;
- /*
- printf("请选择游戏模式:1是金钱模式,2是士兵个数模式\n");
- scanf("%d",&moshi);
- if(moshi==2)
- {
- */
- printf("请输入进攻方各兵种的数量:分别是弓,兵,车\n");
- scanf("%d %d %d",&bing11,&bing12,&bing13);
- bing10=bing11+bing12+bing13;
- lie1=bing10/N;
- printf("请输入防守方各兵种的数量:分别是弩,卒,車\n");
- scanf("%d %d %d",&bing21,&bing22,&bing23);
- bing20=bing21+bing22+bing23;
- lie2=bing20/N;
- //}
- Bing b[8+lie1+lie2][N];
- chushihua(&b[0][0],8+lie1+lie2);
- chushihua1(b,bing11,bing12,bing13);
- chushihua2(b,bing21,bing22,bing23,8+lie1+lie2);//对各方的兵种初始化
- //printlist();
- print_bing(b,8+lie1+lie2);//打印战场
- while(1)
- {
- tiaozheng(b,8+lie1+lie2);//移动一次
- print_bing(b,8+lie1+lie2);//打印战场
- //chakan(b,8+lie1+lie2);
- getchar();
- shengli=panduan(b,8+lie1+lie2);
- if(shengli==1)
- {
- printf("进攻方胜利\n");
- break;
- }
- if(shengli==2)
- {
- printf("防守方胜利\n");
- break;
- }
- }
- return (EXIT_SUCCESS);
- }
复制代码 |