找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2452|回复: 1
打印 上一主题 下一主题
收起左侧

c语言写的战争模拟游戏 源码

[复制链接]
跳转到指定楼层
楼主
ID:155622 发表于 2016-12-18 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define N 40

  5. void print_bing();//显示数据
  6. void printlist();//显示输出战场信息
  7. void print();//显示步,弓,骑
  8. void chushihua();//对战场进行初始化
  9. void chushihua1();//对进攻士兵进行初始化
  10. void chushihua2();//对防守士兵进行初始化
  11. void search();//寻找最近敌方士兵
  12. void search1();//寻找最近敌方士兵
  13. void move();//士兵移动一个单位
  14. void move1();//士兵移动一个单位
  15. void tiaozheng();//调整所有士兵的位置
  16. void chakan();//查看自己的坐标和最近的敌军坐标
  17. void qingchubushu();//重置所有步数
  18. void qingqibingchubushu();//重置骑兵步数
  19. void attack();//计算伤害
  20. int panduan();//判断是否有队伍胜利

  21. typedef struct bingzhong
  22. {
  23.     int hp;//血量
  24.     int gongjili;//攻击力
  25.     int bz;//兵种
  26.     int fw;//攻击范围
  27.     int x;//最近敌军的纵向坐标
  28.     int y;//最近敌军的横向坐标
  29.     int xingdongli;//一次能移动的次数
  30.     int bushu;//是否被移动过的标志
  31. }Bing;//定义士兵
  32. /*
  33. void printlist()
  34. {
  35. printf("-------------------------------------------------------------\n");
  36. printf("|兵种----|符号 |造价|攻击力|暴击率|防御力|血量 |攻击范围|移动矩离\n");
  37. printf("-------------------------------------------------------------\n");
  38. printf("|弓箭手--|--A--|100-|18----|5%------|1----|100--|1~3---|1-----\n");
  39. printf("-------------------------------------------------------------\n");
  40. printf("|步兵    | F   |75  |15   |8%      |3    |150  |1      |1     \n");
  41. printf("-------------------------------------------------------------\n");
  42. printf("|骑士    | K   |150 |20   |10%     |5    |200  |1      |3     \n");
  43. printf("-------------------------------------------------------------\n");
  44. printf("兵种相克关系:步兵克骑士,骑士克弓箭手,弓箭手克步兵\n");
  45. printf("-------------------------------------------------------------\n");
  46. }//显示数据
  47. */
  48. void tiaozheng(Bing head[][N],int hang)
  49. {
  50.     search(head[0],hang);
  51.     move(head[0],hang);
  52.     search(head[0],hang);
  53.     qingqibingchubushu(head[0],hang);
  54.     move(head[0],hang);
  55.     search(head[0],hang);
  56.     qingqibingchubushu(head[0],hang);
  57.     move(head[0],hang);
  58.     qingchubushu(head[0],hang);
  59.     attack(head[0],hang);
  60. }//调整所有士兵的位置
  61. void attack(Bing head[][N],int hang)
  62. {
  63.     int i=0,j=0,x1=0,y1=0;
  64.     for(i=0;i<hang;i++)
  65.         for(j=0;j<N;j++)
  66.             if(head[i][j].bz>0)
  67.             {
  68.                 if(head[i][j].fw>=(abs(head[i][j].x-i)+abs(head[i][j].y-j)))
  69.                 {
  70.                     x1=head[i][j].x;
  71.                     y1=head[i][j].y;
  72.                     head[x1][y1].hp=head[x1][y1].hp-head[i][j].gongjili;
  73.                     if(head[x1][y1].hp<=0)
  74.                         head[x1][y1].bz=0;
  75.                 }
  76.             }
  77. }
  78. void qingqibingchubushu(Bing head[][N],int hang)
  79. {
  80.     int i=0,j=0;
  81.     for(i=0;i<hang;i++)
  82.         for(j=0;j<N;j++)
  83.             if(head[i][j].bz==3 || head[i][j].bz==6)
  84.                 head[i][j].bushu=0;
  85. }
  86. void move(Bing head[][N],int hang)
  87. {
  88.     int i=0,j=0;
  89.     for(i=0;i<hang;i++)
  90.         for(j=0;j<N;j++)
  91.             if(head[i][j].bz>0)
  92.                 move1(&head[i][j],head[0],i,j);
  93. }
  94. void move1(Bing* s ,Bing head[][40],int x,int y)
  95. {
  96.     int juli=0;
  97.     juli=abs(x-s->x)+abs(y-s->y);
  98.     if(s->fw<juli && s->bushu<s->xingdongli)
  99.     {            
  100.         if(s->x-x>0 && head[x+1][y].bz==0)
  101.         {
  102.             head[x+1][y].bz=s->bz;
  103.             head[x+1][y].fw=s->fw;
  104.             head[x+1][y].hp=s->hp;
  105.             head[x+1][y].gongjili=s->gongjili;
  106.             head[x+1][y].hp=s->hp;
  107.             head[x+1][y].x=s->x;
  108.             head[x+1][y].y=s->y;
  109.             head[x+1][y].xingdongli=s->xingdongli;
  110.             head[x+1][y].bushu=++(s->bushu);
  111.             s->bz=0;
  112.             return;
  113.         }
  114.                 if(s->y-y<0 && head[x][y-1].bz==0 )
  115.         {
  116.             head[x][y-1].bz=s->bz;
  117.             head[x][y-1].fw=s->fw;
  118.             head[x][y-1].hp=s->hp;
  119.             head[x][y-1].x=s->x;
  120.             head[x][y-1].y=s->y;
  121.             head[x][y-1].gongjili=s->gongjili;
  122.             head[x][y-1].hp=s->hp;
  123.             head[x][y-1].xingdongli=s->xingdongli;
  124.             head[x][y-1].bushu=++(s->bushu);
  125.             s->bz=0;
  126.             return;
  127.         }
  128.         if(s->x-x<0 && head[x-1][y].bz==0)
  129.         {
  130.             head[x-1][y].bz=s->bz;
  131.             head[x-1][y].fw=s->fw;
  132.             head[x-1][y].hp=s->hp;
  133.             head[x-1][y].x=s->x;
  134.             head[x-1][y].y=s->y;
  135.             head[x-1][y].gongjili=s->gongjili;
  136.             head[x-1][y].hp=s->hp;
  137.             head[x-1][y].xingdongli=s->xingdongli;
  138.             head[x-1][y].bushu=++(s->bushu);
  139.             s->bz=0;
  140.             return;
  141.         }

  142.         if(s->y-y>0 && head[x][y+1].bz==0)//横向移动
  143.         {
  144.             head[x][y+1].bz=s->bz;
  145.             head[x][y+1].fw=s->fw;
  146.             head[x][y+1].hp=s->hp;
  147.             head[x][y+1].x=s->x;
  148.             head[x][y+1].y=s->y;
  149.             head[x][y+1].gongjili=s->gongjili;
  150.             head[x][y+1].hp=s->hp;
  151.             head[x][y+1].xingdongli=s->xingdongli;
  152.             head[x][y+1].bushu=++(s->bushu);
  153.             s->bz=0;
  154.             return;
  155.         }
  156.     }
  157. }//士兵移动一个单位
  158. void search(Bing head[][N],int hang)
  159. {
  160.     int i=0,j=0;
  161.     for(i=0;i<hang;i++)
  162.         for(j=0;j<N;j++)
  163.             if(head[i][j].bz>0)
  164.                 search1(head[0],hang,&head[i][j],i,j);
  165. }
  166. void search1(Bing head[][N],int hang,Bing* s,int x,int y)
  167. {
  168.     int x1=0,y1=0,juli=0,i=0,j=0,biaoshi=10000;
  169.     if(s->bz>0 && s->bz<4)
  170.     {
  171.         for(i=hang-1;i>=0;i--)
  172.             for(j=39;j>=0;j--)
  173.                 if(head[i][j].bz>3 && head[i][j].bz<7)
  174.                 {
  175.                     juli=abs(i-x)+abs(j-y);
  176.                     if(juli<biaoshi)
  177.                     {
  178.                         biaoshi=juli;
  179.                         s->x=i;
  180.                         s->y=j;
  181.                     }
  182.                 }
  183.     }
  184.     if(s->bz>3 && s->bz<7)
  185.     {
  186.         for(i=0;i<hang;i++)
  187.             for(j=0;j<N;j++)
  188.                 if(head[i][j].bz>0 && head[i][j].bz<4)
  189.                 {
  190.                     juli=abs(i-x)+abs(j-y);
  191.                     if(juli<biaoshi)
  192.                     {
  193.                         biaoshi=juli;
  194.                         s->x=i;
  195.                         s->y=j;
  196.                     }
  197.                 }
  198.     }
  199. }//寻找最近敌方士兵
  200. void qingchubushu(Bing head[][N],int hang)
  201. {
  202.     int i=0,j=0;
  203.     for(i=0;i<hang;i++)
  204.         for(j=0;j<N;j++)
  205.             if(head[i][j].bz>0)
  206.                 head[i][j].bushu=0;
  207. }
  208. void chushihua(Bing* s,int hang)
  209. {
  210.     int i=0;
  211.     for(i=0;i<N*hang;i++,s++)
  212.     {
  213.         s->bz=0;
  214.     }
  215. }//对战场进行初始化
  216. void chushihua1(Bing s1[][40],int bing11,int bing12,int bing13)
  217. {
  218.     int i=0;
  219.     Bing* s=(Bing*)s1;
  220.     for(i=0;i<bing11;i++,s++)
  221.     {s->bz=1;s->fw=3;s->bushu=0;s->xingdongli=1;s->hp=100;s->gongjili=18;}
  222.     for(i=0;i<bing12;i++,s++)
  223.     {s->bz=2;s->fw=1;s->bushu=0;s->xingdongli=1;s->hp=150;s->gongjili=15;}
  224.     for(i=0;i<bing13;i++,s++)
  225.     {s->bz=3;s->fw=1;s->bushu=0;s->xingdongli=1;s->hp=200;s->gongjili=20;}
  226. }//对士兵进行定位
  227. void chushihua2(Bing s1[][40],int bing21,int bing22,int bing23,int hang)
  228. {
  229.     int i=0,j=0;
  230.     Bing* s=(Bing*)s1;
  231.     s=s+(hang-1)*40;
  232.     for(;j<bing21;s++,j++)
  233.     {
  234.         s->bz=4;s->fw=3;s->bushu=0;s->xingdongli=1;s->hp=100;s->gongjili=18;
  235.         i++;
  236.         if(i>39)
  237.         {s=s-80;i=0;}
  238.     }
  239.     for(j=0;j<bing22;s++,j++)
  240.     {
  241.         s->bz=5;s->fw=1;s->bushu=0;s->xingdongli=1;s->hp=150;s->gongjili=15;
  242.         i++;
  243.         if(i>39)
  244.         {s=s-80;i=0;}
  245.     }
  246.     for(j=0;j<bing23;s++,j++)
  247.     {
  248.         s->bz=6;s->fw=1;s->bushu=0;s->xingdongli=1;s->hp=200;s->gongjili=20;
  249.         i++;
  250.         if(i>39)
  251.         {s=s-80;i=0;}
  252.     }
  253. }//对防守士兵进行初始化
  254. void print(int bz)
  255. {
  256.             switch (bz)
  257.             {
  258.                  case 1:printf("弓");break;
  259.                  case 2:printf("兵");break;
  260.                  case 3:printf("车");break;
  261.                  case 4:printf("弩");break;
  262.                  case 5:printf("卒");break;
  263.                  case 6:printf("車");break;
  264.                  default:printf("  ");break;
  265.             }
  266. }//显示步,弓,骑
  267. void print_bing(Bing s[][N],int i1)
  268. {
  269.     printf("-------------------------------------------------------------\n");
  270.     int i=0,j=0;
  271.     for(i=i1-1;i>=0;i--)
  272.     {
  273.         for(j=0;j<N;j++)
  274.             print(s[i][j].bz);
  275.         printf("\n");
  276.     }
  277.     printf("-------------------------------------------------------------\n");
  278. }//显示输出战场信息
  279. void chakan(Bing b[][N],int hang)
  280. {
  281.     int i=0,j=0;
  282.     for(i=0;i<hang;i++)
  283.         for(j=0;j<N;j++)
  284.         {
  285.             if(b[i][j].bz>0)
  286.                 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);
  287.         }
  288. }
  289. int panduan(Bing head[][N],int hang)
  290. {
  291.     int i=0,j=0,zifang=0,difang=0;
  292.     for(i=0;i<hang;i++)
  293.         for(j=0;j<N;j++)
  294.         {
  295.             if(head[i][j].bz>0 && head[i][j].bz<4)
  296.                 zifang=1;
  297.             if(head[i][j].bz>3 && head[i][j].bz<7)
  298.                 difang=1;
  299.         }
  300.     if(zifang==1 && difang==0)
  301.         return 1;
  302.     if(zifang==0 && difang==1)
  303.         return 2;
  304.     else
  305.         return 0;
  306. }
  307. int main(int argc, char** argv)
  308. {
  309.     static int lie1=0,lie2=0;//lie1是进攻方的士兵行数,lie2是防守方的士兵行数
  310.     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;
  311. /*
  312.     printf("请选择游戏模式:1是金钱模式,2是士兵个数模式\n");
  313.     scanf("%d",&moshi);
  314.     if(moshi==2)
  315.     {
  316. */
  317.         printf("请输入进攻方各兵种的数量:分别是弓,兵,车\n");
  318.         scanf("%d %d %d",&bing11,&bing12,&bing13);
  319.         bing10=bing11+bing12+bing13;
  320.         lie1=bing10/N;
  321.         printf("请输入防守方各兵种的数量:分别是弩,卒,車\n");
  322.         scanf("%d %d %d",&bing21,&bing22,&bing23);
  323.         bing20=bing21+bing22+bing23;
  324.         lie2=bing20/N;
  325.     //}
  326.     Bing b[8+lie1+lie2][N];
  327.     chushihua(&b[0][0],8+lie1+lie2);
  328.     chushihua1(b,bing11,bing12,bing13);
  329.     chushihua2(b,bing21,bing22,bing23,8+lie1+lie2);//对各方的兵种初始化
  330.     //printlist();
  331.     print_bing(b,8+lie1+lie2);//打印战场

  332.     while(1)
  333.     {
  334.         tiaozheng(b,8+lie1+lie2);//移动一次
  335.         print_bing(b,8+lie1+lie2);//打印战场
  336.         //chakan(b,8+lie1+lie2);
  337.         getchar();
  338.         shengli=panduan(b,8+lie1+lie2);
  339.         if(shengli==1)
  340.         {
  341.             printf("进攻方胜利\n");
  342.             break;
  343.         }
  344.         if(shengli==2)
  345.         {
  346.             printf("防守方胜利\n");
  347.             break;
  348.         }
  349.     }
  350.     return (EXIT_SUCCESS);
  351. }

复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:763404 发表于 2020-5-28 14:52 | 只看该作者
能和您仔细聊聊吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表