|
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define N 40
- void print_bing();//顯示數(shù)據(jù)
- void printlist();//顯示輸出戰(zhàn)場(chǎng)信息
- void print();//顯示步,弓,騎
- void chushihua();//對(duì)戰(zhàn)場(chǎng)進(jìn)行初始化
- void chushihua1();//對(duì)進(jìn)攻士兵進(jìn)行初始化
- void chushihua2();//對(duì)防守士兵進(jìn)行初始化
- void search();//尋找最近敵方士兵
- void search1();//尋找最近敵方士兵
- void move();//士兵移動(dòng)一個(gè)單位
- void move1();//士兵移動(dòng)一個(gè)單位
- void tiaozheng();//調(diào)整所有士兵的位置
- void chakan();//查看自己的坐標(biāo)和最近的敵軍坐標(biāo)
- void qingchubushu();//重置所有步數(shù)
- void qingqibingchubushu();//重置騎兵步數(shù)
- void attack();//計(jì)算傷害
- int panduan();//判斷是否有隊(duì)伍勝利
- typedef struct bingzhong
- {
- int hp;//血量
- int gongjili;//攻擊力
- int bz;//兵種
- int fw;//攻擊范圍
- int x;//最近敵軍的縱向坐標(biāo)
- int y;//最近敵軍的橫向坐標(biāo)
- int xingdongli;//一次能移動(dòng)的次數(shù)
- int bushu;//是否被移動(dòng)過的標(biāo)志
- }Bing;//定義士兵
- /*
- void printlist()
- {
- printf("-------------------------------------------------------------\n");
- printf("|兵種----|符號(hào) |造價(jià)|攻擊力|暴擊率|防御力|血量 |攻擊范圍|移動(dòng)矩離\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("兵種相克關(guān)系:步兵克騎士,騎士克弓箭手,弓箭手克步兵\n");
- printf("-------------------------------------------------------------\n");
- }//顯示數(shù)據(jù)
- */
- 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);
- }//調(diào)整所有士兵的位置
- 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)//橫向移動(dòng)
- {
- 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;
- }
- }
- }//士兵移動(dòng)一個(gè)單位
- 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;
- }
- }//對(duì)戰(zhàn)場(chǎng)進(jìn)行初始化
- 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;}
- }//對(duì)士兵進(jìn)行定位
- 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;}
- }
- }//對(duì)防守士兵進(jìn)行初始化
- 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");
- }//顯示輸出戰(zhàn)場(chǎng)信息
- 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是進(jìn)攻方的士兵行數(shù),lie2是防守方的士兵行數(shù)
- 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("請(qǐng)選擇游戲模式:1是金錢模式,2是士兵個(gè)數(shù)模式\n");
- scanf("%d",&moshi);
- if(moshi==2)
- {
- */
- printf("請(qǐng)輸入進(jìn)攻方各兵種的數(shù)量:分別是弓,兵,車\n");
- scanf("%d %d %d",&bing11,&bing12,&bing13);
- bing10=bing11+bing12+bing13;
- lie1=bing10/N;
- printf("請(qǐng)輸入防守方各兵種的數(shù)量:分別是弩,卒,車\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);//對(duì)各方的兵種初始化
- //printlist();
- print_bing(b,8+lie1+lie2);//打印戰(zhàn)場(chǎng)
- while(1)
- {
- tiaozheng(b,8+lie1+lie2);//移動(dòng)一次
- print_bing(b,8+lie1+lie2);//打印戰(zhàn)場(chǎng)
- //chakan(b,8+lie1+lie2);
- getchar();
- shengli=panduan(b,8+lie1+lie2);
- if(shengli==1)
- {
- printf("進(jìn)攻方勝利\n");
- break;
- }
- if(shengli==2)
- {
- printf("防守方勝利\n");
- break;
- }
- }
- return (EXIT_SUCCESS);
- }
復(fù)制代碼 |
評(píng)分
-
查看全部評(píng)分
|