tceic.com
学霸学习网 这下你爽了
赞助商链接
当前位置:首页 >> 院校资料 >>

计算机仿真大赛选拔赛


北京师范大学

我们参赛选择的题号是:

命题 B

坦克连对抗兵棋推演系统

摘要

本文主要建立了兰切斯特平方律兵力模型、蒙特卡洛偶然事件模型,运用 Visual C++软件编写了仿真程序,对推演示例进行了详细的分析。 建立兰切斯特平方律兵力模型,预测作战过程和结果等,突出反映现代战争集中 优势兵力作战这一重要因素。建立蒙特卡洛偶然事件模型,反映出战场的偶然性事件, 进行大量重复独立的试验,检验兰切斯特平方律兵力模型的正确性。 针对坦克连长指挥各自 10 辆坦克进行对抗的要求,我们使用了 C++编写可交互的 仿真程序,模拟红蓝双方的 10 俩坦克作战。该程序可以模拟坦克排和坦克连的基本战 术队形。 针对推演示例进行试验分析的要求,主要对推演示例试验的操纵步骤、数值计算、 试验结果进行了详细的解析和分析。

-1-

北京师范大学

目录
第一部分 正文-----------------------------------------------------------2 一、问题重述与分析------------------------------------------------------2 二、模型假设------------------------------------------------------------3 (一) 、地形地貌假设-----------------------------------------------------3 (二) 、坦克性能假设-----------------------------------------------------3 三、建立模型------------------------------------------------------------3 (一) 、兰切斯特平方律建立兵力模型---------------------------------------3 (二) 、蒙特卡洛偶然事件模型---------------------------------------------5 第二部分 结论-----------------------------------------------------------8 一、示例分析------------------------------------------------------------8 二、自我评价------------------------------------------------------------9 第三部分 参考文献-------------------------------------------------------9 第四部分 附录-----------------------------------------------------------9 一、蒙特卡洛实验结果----------------------------------------------------9 1) 、表格--------------------------------------------------------------9 2) 、气泡图-----------------------------------------------------------10 3) 、程序源码---------------------------------------------------------11 二、兵棋推演系统示例----------------------------------------------------13 1) 、示例详细步骤-----------------------------------------------------13 2) 、程序源码---------------------------------------------------------14

正文

一、问题重述与分析
本题要求建立两个坦克连对抗的兵棋推演系统, 所以采用 C++编写人机交互程序实 现两个坦克连对抗。模拟坦克排战术的前三角、后三角、左梯字、右梯字队形,坦克 连战术的连横队、连纵队、左斜、右斜等队形。 交战中,建立数学模型预测作战过程和结果。采用兰切斯特平方律建立兵力模型, 模拟作战和预测交战结果。采用蒙特卡洛偶然事件模型,用统计学的规律减小误差和 检验兰切斯特平方律兵力模型的正确与否。
-2-

北京师范大学

本题对推演示例进行试验分析,记录一次两个坦克连对抗试验的全过程,对程序 处理计算作出详细解释,对数学模型进行具体数值分析。

二、模型假设
(一) 、地形地貌假设: 1.不考虑地势高低的影响。 2.将地形简化为正六边型网格。 3.将地貌简化为平原、丛林。 4.一个网格中只能有一辆坦克,一个方格中的地貌相同。

图一 (黄色网格表示平原,绿色网格表示丛林。 )

(二)、坦克性能假设: 1.红蓝双方的坦克性能相同。 2.坦克在各个方向的命中率相同。 3.坦克的攻击范围是它的周边六个网格。结果只有击中目标、未击中目标两种可能。 击中目标,目标就被摧毁。 4.阵亡的坦克对战斗不在有其它影响。 5.在单位时间内坦克的机动距离是它的周边六个网格或不移动。 6.在丛林中的坦克被发现概率会降低,即存活率会上升固定比值。

三、建立模型
(一) 、兰切斯特平方律兵力模型
-3-

北京师范大学

建立兰切斯特模型,对作战过程进行模拟。预测交战中哪一方会获胜,预测作战 过程持续的大致时间,预测战斗结束时胜方的战斗损失,预测初始总兵力和战斗力的 变化对作战结局的影响。 仿真的对象为坦克连长各自指挥 10 辆坦克进行对抗,故采用兰切斯特平方律建立 兵力模型,可以更好的反映现代坦克战争集中优势兵力作战这一重要因素。 内容: 1.暂不考虑地貌对坦克伪装的影响。 方程基本形式为
? dx ? dt ? ? y ? dy ? ? ?x ? dt
(1)

式中:x、y 为作战双方在 t 时刻的瞬时兵力(或剩余兵力) 。 双反的初始兵力分别为 x 0 、 y 0 ,两式相除,得

x
双方实力相等得条件为

dx dy ?y dt dt

(2)

dx dy ? xdt ydt

(3)

由式(2)、 (3)得
x 2 ? y 2 (4)

即战斗单位数量的平方与单个战斗单位的平均战斗力的乘机相等时,两支军队的总战 斗实力相等。 式(2)在(0,t)积分,得
2 2 x0 ? x 2 ? y0 ? y2

(5)

战斗结局预测
2 2 ? y0 a) 、当时 x0 ,红方获胜概率较大。其剩余兵力为
2 2 xe ? x0 ? y0

(6)

红蓝双方每辆坦克的存活率分别为为

px ?

2 2 x0 ? y0 x0

py ?

2 y0 2 2 x0 ? y0

(7)

2 2 ? y0 b) 、当时 x0 ,蓝方获胜概率较大。其剩余兵力为

-4-

北京师范大学

ye ?

2 2 y0 ? x0

(8)

红蓝双方每辆坦克的存活率分别为为
x2 px ? 2 0 2 x0 ? y0

py ?

2 2 y0 ? x0 y0

(9)

2 2 ? y0 c) 、当时 x0 ,获胜概率相同,平局。其剩余兵力为

xe ? 0

ye ? 0

红蓝双方每辆坦克的存活率分别为为 1 px ? 2 2.重新考虑地貌对坦克伪装性能的影响

py ?

1 2

当坦克处在丛林地貌时,其被发现的概率会降低一定比值 h, (0 ? h ? 1) 。坦克的实际存 活率会上升。可近似为

p fx ?

px h

p fy ?

py h

(10)

(二)、蒙特卡洛偶然事件模型 兰切斯特平方律建立的兵力模型能预测交战中哪一方会获胜,预测战斗结束时胜 方的战斗损失等,但这并不能反映出战场的偶然性事件。所以建立蒙特卡洛偶然事件 模型,用计算机生成的随机概率,对一次交战中坦克的存亡进行仿真。用此方法检验 兰切斯特平方律兵力模型的正确性。 蒙特卡罗方法解的误差由3 方面组成: 截断误差、方法本身、随机数的品质不足。 在忽略截断误差的同时,进行大量重复独立的试验,可以使误差不断逼近于零。 内容: 假设: 1.忽略截断误差 2.每一次的试验相互独立 方程基本形式为

?V ? lim P?| n ? p |? ? ? ? 0 n?? ? ? n

(11)

式中: V n 是 n 次独立试验中事件 A 出现的次数, p 是事件 A 的概率。 根据此定律,只要试验次数足够多,此事件出现的频率就趋近与它的概率。对于
-5-

北京师范大学

生成随机概率的正确与否,可以通过大量的独立试验来检验结果。 a)、在一次交火中,红蓝双方兵力为 3:9,分别进行 10 次、100 次、1000 次试验得到 如下结果: 红蓝对抗(兵力3:9) 试验次数 A 存活数 B 存活数 A 平均值 10次 4 83 0.400000 100次 32 853 0.320000 1000次 304 8492 0.304000 10000次 3053 84957 0.305300 理论值 3000 84853 0.300000
表格二

B 平均值 8.300000 8.530000 8.492000 8.495700 8.485281

随着试验次数增大,结果越接近理论值。符合兰切斯特平方律兵力模型,集中优 势兵力作战对交战结果有重大影响。与实际战争理论,分割包围、逐个击破的作战思 想相符合。 对 100 次详细分析:

气泡图一

100 次实验中,点主要集中于(0,8) 、 (1,9) ,其趋势在理论值附近。符合离散型 随机规律。 b) 、在一次交火中,红蓝双方兵力为 10:10,分别进行 10 次、100 次、1000 次试验得
-6-

北京师范大学

到如下结果: 红蓝对抗(兵力10:10) 试验次 A 存活数 B 存活数 数 10次 51 48 100次 497 501 1000次 4883 4948 10000次 49766 50086 理论值 50000 50000
表格二

A 平均值 5.100000 4.970000 4.883000 4.976600 5.000000

B 平均值 4.800000 5.010000 4.948000 5.008600 5.000000

随着试验次数增大,结果越接近理论值,并在理论附近跳动。在相同的兵力下交 战双方的获胜率相同,存活率也相同,与实际战争相符合。 对 100 次详细分析:

气泡图二

100 次实验中,点主要集中于(5,5)及其周边,其趋势在理论值附近。符合 离散型随机规律。

结论

-7-

北京师范大学

一、示例分析
使用说明: 地图为六方格网,一个方格中只能有一辆坦克,一个方格中的地貌相同。地图只 体现了地貌特征,不显现地形特征。 红蓝双方轮流指挥各自坦克,每一次指挥,最多能机动三辆坦克,即一个排的兵 力。也可机动同一辆坦克,即快速机动。机动范围是周边的六个方格,或不移动,每 次移动一格。 每一次指挥结束后,坦克会对周边六格的敌坦克进行射击。射击结果只有击中、 未击中,击中敌坦克即阵亡。阵亡的坦克会从地图移除。击中概率与交战的双方兵力 有关。 当其中一方的坦克全部阵亡,战斗结束。 推演示例: 红方采用斜行、后三角的阵型,两翼包围中间的战法。 蓝队采用锥形、前三角的阵型,横队并列推进的战法。

步骤: 红方:前期,部署两翼斜行、中间后三角的阵型。中期,红方优先机动两翼部队, 以中间部队牵制蓝方主力,两翼在歼灭蓝方两侧后向中间靠拢。后期,三侧包围蓝方, 并歼灭残余部队。 蓝方:前期,左右分别部署成锥形,中间部署成前三角阵型。中期,蓝方实施横 队并列推进左中右坦克,随后两侧部队与红方交战被歼灭。后期, ,中间部队分散突围, 后被包围全灭。 (具体过程见附录:示例详细步骤,第 13 页)

-8-

北京师范大学

结果: 红方获得战斗的胜利,蓝方被全歼失败。

二、自我评价
对地形地貌模型简化,并突出其对坦克作战的影响。对坦克模型简化得当,保留 坦克火力、机动、防护的 特性,简化其它特征以简化计算。模型的假设较为合理。 兰切斯特平方律的兵力模型能较符合的模拟战场上坦克的兵力,能突显出集中优 势兵力对战争的影响,能准确预测交战中哪一方会获胜,预测战斗结束时胜方的战斗 损失,预测初始总兵力和战斗力的变化对作战结局的影响。 蒙特卡洛偶然事件模型合理的反映出战场的偶然性对战争的影响,并且不失其概 率的准确性。随试验次数增大,误差逐渐减小,结果逼近理论值,与实际数据相符合。 模型具有一定的准确性。

参考文献

[1]叶利民,龚立,刘忠.兵棋推演系统设计与建模研究.计算机与数字工程,2011,12. [2]杨南征.虚拟演兵:兵棋、作战模拟与仿真.北京:解放军出版社,2007:99-127. [3]王正元 , 刘靖旭 , 谭跃进, 沙红兵. 基于仿真的主战坦克作战效能评估方法 .计算 机仿真,2005,1. [4] 张佳琳 , 赵琳 .MWGM :基于兰彻斯特方程的微观兵棋推演模型 . 计算机工程与设 计,2011,11. [5] 彭 文 成 , 周 电 杰 , 张 文 . 基 于 协 同 作 战 的 兵 力 损 耗 兰 彻 斯 特 方 程 . 运 筹 与 管 理,2009,3. [6]关世义.从伪蒙特卡洛法到蒙特卡洛法.战术导弹技术,2003,3:45-48. [7] , 卢秀玉 . 蒙特卡罗方法与拟蒙 特卡罗方法解线性方 程组 , 战术导弹技 术,2010,4. [8] 陈 建 祥 , 魏 迎 梅 , 吴 玲 达 . 虚 拟 战 场 环 境 中 的 态 势 标 绘 与 表 现 . 计 算 机 应 用,2005,25:1701-1703.

附录

一、蒙特卡洛实验结果
1) 、表格
-9-

北京师范大学

红蓝对抗(兵力3:9) 试验次数 A 存活数 B 存活数 A 平均值 10次 4 83 0.400000 100次 32 853 0.320000 1000次 304 8492 0.304000 10000次 3053 84957 0.305300 理论值 3000 84853 0.300000
表格一

B 平均值 8.300000 8.530000 8.492000 8.495700 8.485281

红蓝对抗(兵力10:10) 试验次 A 存活数 B 存活数 数 10次 51 48 100次 497 501 1000次 4883 4948 10000次 49766 50086 理论值 50000 50000
表格二

A 平均值 5.100000 4.970000 4.883000 4.976600 5.000000

B 平均值 4.800000 5.010000 4.948000 5.008600 5.000000

2) 、气泡图

气泡图一

- 10 -

北京师范大学

气泡图二

3) 、程序源码 //============================start====================================// // //tank检验随机真确性.cpp //windows7 x64 //Visual C++ 6.0 // //结果保存于otank.txt //====================== #include<iostream> #include<fstream> #include<cstdlib> #include<cmath> using namespace std; struct tank //定义坦克 { int tx,ty; //坐标 int life; //生命值,0--死亡,1--存活 }red[10],blue[10]; struct map { int space; double hide; char jpg; }grid[37][17]; //定义地图网格 //0--无坦克,1--有坦克 //0--平原,1.0--丛林 //'.'--平原,'*'--丛林,'A'--红方坦克,'B'--蓝方坦克
- 11 -

北京师范大学

int main() { void initial(); void fire(struct tank a[10],double x,struct tank b[10],double y); double x,y; int enemy[2][10]={0},mate[2][10]={0}; initial(); //====检验随机真确性====// int i,j; double xx,yy; int asum=0,bsum=0; int anum,bnum; int n; cout<<"红方 蓝方 次数\n"; cout<<"xx= yy= n=\n"; cin>>xx>>yy>>n; ofstream cout("otank.txt"); cout<<"number result result\n"; for(j=0;j<n;j++) { for(i=0;i<10;i++) { red[i].life=1; blue[i].life=1;

}

x=xx; // x--红方参战兵力 y=yy; // y--蓝方参战兵力 fire(red,x,blue,y); for(i=0,anum=0;i<x;i++) if(red[i].life==1) {asum++;anum++;} for(i=0,bnum=0;i<y;i++) if(blue[i].life==1) { bsum++; bnum++; } cout<<j<<" A="<<anum<<" B="<<bnum<<"\n"; } cout<<"\nThe frequency\nn="<<n; cout<<"\nThe original value\nA="<<x<<" B="<<y; cout<<"\nThe average value\nA="; cout<<fixed<<(double)asum/n<<" B="<<fixed<<(double)bsum/n; cout<<"\nThe sum value\nA="<<asum<<" B="<<bsum<<"\n"; //====检验随机真确性====// return 0; } //====初始化地图====// void initial() { int i,j; for(i=0;i<37;i++) //生成平原地图 for(j=0;j<17;j++) grid[i][j].hide=1.0;
- 12 -

北京师范大学

} //====射击摧毁====// void fire(struct tank a[],double x,struct tank b[],double y) { int i; double px,py; double plife[10],hide; if(x*x>y*y) { px=sqrt(x*x-y*y)/x; py=y*y/(x*x+y*y); } if(x*x<y*y) { px=x*x/(x*x+y*y); py=sqrt(y*y-x*x)/y; } if(x*x==y*y) { px=1.0/2.0; py=1.0/2.0; } for(i=0;i<x;i++) { hide=grid[a[i].tx][a[i].ty].hide; plife[i]=(double)rand()/RAND_MAX*hide; if(plife[i]>px) a[i].life=0; } for(i=0;i<y;i++) { hide=grid[b[i].tx][b[i].ty].hide; plife[i]=(double)rand()/RAND_MAX*hide; if(plife[i]>py) b[i].life=0; } } //=============================end======================================//

二、兵棋推演系统示例
1) 、示例详细步骤
回合(车号) 车号\方向 车号\方向 车号\方向 阵亡 0(A) 0\2 0\2 1\2 1(B) 1\8 0\9 2\8 2(A) 9\2 9\2 8\2 3(B) 8\8 9\7 7\8 4(A) 2\2 7\2 6\2 5(B) 3\8 6\8 4\5 6(A) 3\2 3\2 4\3 7(B) 1\8 2\8 0\8 8(A) 0\2 1\2 2\2 9(B) 3\8 4\8 5\8 10(A) 7\2 8\2 9\2

- 13 -

北京师范大学 11(B) 7\8 8\8 9\8 12(A) 0\2 1\2 2\2 13(B) 1\8 0\8 2\8 14(A) 7\2 8\2 9\2 15(B) 6\8 6\8 4\8 16(A) 4\2 5\2 6\2 17(B) 7\8 8\8 9\8 18(A) 0\2 1\2 2\2 19(B) 3\8 5\8 6\8 B1 20(A) 7\2 8\2 9\2 A9 B8

21(B) 0\8 2\8 4\8 A0 A1B0 B2

22(A) 4\3 6\2 5\2

23(B) 3\8 5\8 7\8

24(A) 8\2 7\3 4\3 A8 B7
表格三

25(B) 9\8 9\7 4\8 B9

26(A) 3\2 4\1 7\1 B6

27(B) 3\7 3\8 5\9 A6 B3 B4 B5

2) 、程序源码====兵棋推演系统 //============================start====================================// // //tank__wargame.cpp //windows7 x64 //Visual C++ 6.0 //---------------------#include<iostream> #include<fstream> #include<cstdlib> #include<cmath> using namespace std; struct tank //定义坦克 { int tx,ty; //坐标 int life; //生命值,0--死亡,1--存活 }red[10],blue[10]; struct map { int space; double hide; char jpg; }grid[37][23]; //定义地图网格 //0--无坦克,1--有坦克 //'.'-平原,'*'-丛林,'A'-红方坦克,'B'-蓝方坦克

int main() { double x,y; double *point_x=&x,*point_y=&y; struct tank *a[10],*b[10]; int enemy[2][10]={0},mate[2][10]={0}; int n_move=0; void initial(); void showmap();
- 14 -

北京师范大学

void move(struct tank rb[],char ab); void adjust(int x_coordinate,int y_coordinate); void scout(struct tank rb[],char ab,int enemy[2][10],int mate[2][10]); void aim(int enemy[2][10],int mate[2][10],int n_move,struct tank *a[10],double *x,struct tank *b[10],double *y); void fire(struct tank *a[10],double x,struct tank *b[10],double y); int result(); initial(); showmap(); for(;;n_move++) //红蓝轮流指挥各自坦克 { if(n_move%2==0) { move(red,'A'); scout(red,'B',enemy,mate); } else { move(blue,'B'); scout(blue,'A',enemy,mate); } aim(enemy,mate,n_move,a,point_x,b,point_y); fire(a,x,b,y); cout<<endl<<"THE BOUT NO."<<n_move<<endl<<endl; showmap(); if(result()==1) break; } cout<<"\nBATTLE ENGING\n"; cin.get(); return 0; } //====初始化地图、红蓝坦克====// void initial() { void adjust(int x,int y); int i,j; char c; for(i=0;i<37;i++) //生成平原地图 for(j=0;j<23;j++) { grid[i][j].hide=1.0; grid[i][j].jpg='.'; grid[i][j].space=0; } /* ifstream cin("imap5.1.txt"); for(i=0;i<23;i++) //读入地图 for(j=0;j<37;j++) { c=getchar();grid[j][i].hide=(c=='1'? 1.0 : 0.9);}*/ //红蓝双方部署兵力 for(i=0;i<10;i++)
- 15 -

北京师范大学

{

red[i].life=1;

blue[i].life=1;

} grid[3][2].jpg='A'; grid[6][3].jpg='A'; grid[9][2].jpg='A'; grid[15][2].jpg='A'; grid[18][5].jpg='A'; grid[18][3].jpg='A'; grid[21][2].jpg='A'; grid[27][2].jpg='A'; grid[30][3].jpg='A'; grid[33][2].jpg='A';

red[0].tx=3; red[0].ty=2; grid[3][2].space=1; adjust(3,2); grid[2][2].jpg='0'; red[1].tx=6; red[1].ty=3; grid[6][3].space=1; adjust(6,3); grid[5][3].jpg='1'; red[2].tx=9; red[2].ty=2; grid[9][2].space=1; adjust(9,2); grid[8][2].jpg='2'; red[3].tx=15; red[3].ty=2; grid[15][2].space=1; adjust(15,2); grid[14][2].jpg='3'; red[4].tx=18; red[4].ty=5; grid[18][5].space=1; adjust(18,5); grid[17][5].jpg='4'; red[5].tx=18; red[5].ty=3; grid[18][3].space=1; adjust(18,3); grid[17][3].jpg='5'; red[6].tx=21; red[6].ty=2; grid[21][2].space=1; adjust(21,2); grid[20][2].jpg='6'; red[7].tx=27; red[7].ty=2; grid[27][2].space=1; adjust(27,2); grid[26][2].jpg='7'; red[8].tx=30; red[8].ty=3; grid[30][3].space=1; adjust(30,3); grid[29][3].jpg='8'; red[9].tx=33; red[9].ty=2; grid[33][2].space=1; adjust(33,2); grid[32][2].jpg='9';

blue[0].tx=3; blue[0].ty=20; grid[3][20].space=1; grid[3][20].jpg='B'; adjust(3,20); grid[2][20].jpg='0'; blue[1].tx=6; blue[1].ty=19; grid[6][19].space=1; grid[6][19].jpg='B'; adjust(6,19); grid[5][19].jpg='1'; blue[2].tx=9; blue[2].ty=20; grid[9][20].space=1; grid[9][20].jpg='B'; adjust(9,20); grid[8][20].jpg='2'; blue[3].tx=15; blue[3].ty=20; grid[15][20].space=1; grid[15][20].jpg='B'; adjust(15,20); grid[14][20].jpg='3'; blue[4].tx=18; blue[4].ty=17; grid[18][17].space=1; grid[18][17].jpg='B'; adjust(18,17); grid[17][17].jpg='4'; blue[5].tx=18; blue[5].ty=19; grid[18][19].space=1; grid[18][19].jpg='B'; adjust(18,19); grid[17][19].jpg='5'; blue[6].tx=21; blue[6].ty=20; grid[21][20].space=1; grid[21][20].jpg='B'; adjust(21,20); grid[20][20].jpg='6'; blue[7].tx=27; blue[7].ty=20; grid[27][20].space=1; grid[27][20].jpg='B'; adjust(27,20); grid[26][20].jpg='7'; blue[8].tx=30; blue[8].ty=19; grid[30][19].space=1; grid[30][19].jpg='B'; adjust(30,19); grid[29][19].jpg='8'; blue[9].tx=33; blue[9].ty=20; grid[33][20].space=1; grid[33][20].jpg='B'; adjust(33,20); grid[32][20].jpg='9'; } //====打印地图====// void showmap() { int i,j; for(i=1;i<22;i++) { for(j=1;j<36;j++) cout<<grid[j][i].jpg; cout<<"\n";
- 16 -

北京师范大学

} } //====校正图标显示====// void adjust(int x,int y) { char icon; if(grid[x][y].space==1) //坦克图标为菱形 { icon=grid[x][y].jpg; grid[x][y+1].jpg=icon; grid[x][y-1].jpg=icon; grid[x+1][y].jpg=icon; grid[x-1][y].jpg=icon; } else { grid[x][y].jpg=(grid[x][y].hide==1.0 ?'.' : '*'); icon=grid[x][y].jpg; grid[x][y+1].jpg=icon; grid[x][y-1].jpg=icon; grid[x+1][y].jpg=icon; grid[x-1][y].jpg=icon; } } //====坦克机动====// void move(struct tank rb[],char ab) { void adjust(int x,int y); void showmap(); int i; int mx,my; int nx,ny; int serial,way; for(i=0;i<3;i++) //一次机动可以移动三次,即最多一个排 { cout<<"\nSelect a "<<ab<<" tank,(0--9):\n"; cin>>serial; if(serial<0||serial>9||(rb[serial].life==0)) { cout<<"\nerror 无此坦克或阵亡\n"; i--; continue; } cout<<"\nSelect direction to march,(0--6)\n5-原地 1-左下 2-下 3-右下 7-左上 8-上 9-右上\n"; cin>>way; if(way==5) { showmap(); continue; } mx=rb[serial].tx; my=rb[serial].ty; switch(way) {
- 17 -

北京师范大学

case 5: case 1: case 2: case 3: case 7: case 8: case 9: default

nx=mx;ny=my;break; //原地 nx=mx-3;ny=my+1;break; //左下 nx=mx;ny=my+2;break; //下 nx=mx+3;ny=my+1;break; //右下 nx=mx-3;ny=my-1;break; //左上 nx=mx;ny=my-2;break; //上 nx=mx+3;ny=my-1;break; //右上 :cout<<"\nerror 眼观六路无此路\n";break;

} if(grid[nx][ny].space==0&&nx>2&&nx<34&&ny>1&&ny<21) { grid[mx][my].space=0; adjust(mx,my); grid[nx][ny].space=1; grid[nx][ny].jpg=ab; adjust(nx,ny); switch(serial) { case 1: grid[nx-1][ny].jpg='1';break; case 2: grid[nx-1][ny].jpg='2';break; case 3: grid[nx-1][ny].jpg='3';break; case 4: grid[nx-1][ny].jpg='4';break; case 5: grid[nx-1][ny].jpg='5';break; case 6: grid[nx-1][ny].jpg='6';break; case 7: grid[nx-1][ny].jpg='7';break; case 8: grid[nx-1][ny].jpg='8';break; case 9: grid[nx-1][ny].jpg='9';break; case 0: grid[nx-1][ny].jpg='0';break; default :cout<<"\nerror\n";break; } rb[serial].tx=nx; rb[serial].ty=ny; showmap(); } else { cout<<"\nerror 此路不通请绕道\n"; i--; } } } //====搜索敌友====// //----确定下一次交战我方坦克坐标、敌方坦克坐标---void scout(struct tank rb[],char ab,int enemy[2][10],int mate[2][10]) { int i,j,p=0,q=0; int gx,gy; int vx,vy; for(i=0;i<10;i++) //初始化数组 { enemy[0][i]=0;enemy[1][i]=0;
- 18 -

北京师范大学

mate[0][i]=0;mate[1][i]=0; } for(i=0;i<10;i++) //从0号车到9号车一次搜索 { if(rb[i].life==0) continue; gx=rb[i].tx; gy=rb[i].ty; for(j=1;j<=6;j++) { switch(j) { case 1: vx=gx;vy=gy+2;break; case 2: vx=gx+3;vy=gy+1;break; case 3: vx=gx+3;vy=gy-1;break; case 4: vx=gx;vy=gy-2;break; case 5: vx=gx-3;vy=gy-1;break; case 6: vx=gx-3;vy=gy+1;break; default :cout<<"\nerror 代码j错误\n";break; } if(grid[vx][vy].jpg==ab) //搜索敌方,记录坐标 { enemy[0][p]=vx; enemy[1][p++]=vy; mate[0][i]=gx; mate[1][i]=gy; } } } for(i=0;i<10;i++) //去除重复 for(j=i+1;j<10;j++) if(enemy[0][i]==enemy[0][j]&&enemy[1][i]==enemy[1][j]) { enemy[0][j]=0; enemy[1][j]=0; } } //====瞄准敌方====// //----通过交战双方的坦克坐标得到坦克车号、数量---void aim(int enemy[2][10],int mate[2][10],int n_move,struct tank *a[],double *x,struct tank *b[],double *y) { int i,j,p=0,q=0; int ax,ay; struct tank *point_mate,*point_enemy; for(i=0;i<10;i++) //初始化指针数组 {a[i]='\0';b[i]='\0';} if(n_move%2==0) { point_mate=red; point_enemy=blue; } else { point_mate=blue; point_enemy=red; } for(i=0;i<10;i++) { if(mate[0][i]!=0) //非(0,0)坐标 { ax=mate[0][i];
- 19 -

北京师范大学

ay=mate[1][i]; for(j=0;j<10;j++) if(ax==point_mate[j].tx&&ay==point_mate[j].ty) a[p++]=&point_mate[j]; //记录车号 } if(enemy[0][i]!=0) //非(0,0)坐标 { ax=enemy[0][i]; ay=enemy[1][i]; for(j=0;j<10;j++) if(ax==point_enemy[j].tx&&ay==point_enemy[j].ty) b[q++]=&point_enemy[j]; //记录车号 } } (*x)=p; } //====射击摧毁====// //----计算存活率,按存活率决定交战坦克生死---void fire(struct tank *a[],double x,struct tank *b[],double y) { void adjust(int x,int y); int i; double px,py; double plife[10],hide; if(x*x>y*y) //x方胜,计算存活率 { px=sqrt(x*x-y*y)/x; py=y*y/(x*x+y*y); } if(x*x<y*y) //y方胜,计算存活率 { px=x*x/(x*x+y*y); py=sqrt(y*y-x*x)/y; } if(x*x==y*y) //平局 { px=1.0/2.0; py=1.0/2.0; } for(i=0;i<x;i++) //生成随机概率,决定存亡 { hide=grid[(*a[i]).tx][(*a[i]).ty].hide; plife[i]=(double)rand()/RAND_MAX*hide; if(plife[i]>px) { (*a[i]).life=0; grid[(*a[i]).tx][(*a[i]).ty].space=0; adjust((*a[i]).tx,(*a[i]).ty); } } for(i=0;i<y;i++) //生成随机概率,决定存亡 { hide=grid[(*b[i]).tx][(*b[i]).ty].hide; plife[i]=(double)rand()/RAND_MAX*hide; if(plife[i]>py)
- 20 -

(*y)=q;

//记录数量

北京师范大学

{ (*b[i]).life=0; grid[(*b[i]).tx][(*b[i]).ty].space=0; adjust((*b[i]).tx,(*b[i]).ty); } } } //====战斗结束====// int result() { int i; int asum=0,bsum=0; for(i=0;i<10;i++) //一方全部阵亡 { asum+=red[i].life; bsum+=blue[i].life; } if(asum==0||bsum==0) return 1; else return 0; } //=============================end======================================//

- 21 -


赞助商链接
推荐相关:


大学生各类竞赛汇总_图文

区选拔 10 月总决赛 全国大学生物流 设计大赛 学校物流类 专业教学指 导委员...大赛(ACM) 全国计算机仿真 大赛 美国计算机 协会 教育部高教 司 亚洲从九月份...


大学生各类竞赛汇总_图文

竞赛 中国 MEMS 传感器 应用大赛 5-8 月份分赛 区选拔 10 月总决赛 全国...(第三届介绍) 大学生程序设计 大赛(ACM) 全国计算机仿真 大赛 美国计算机 协会...


大学生参加的全国性赛事

全国计算机仿真大赛级别:国家级 竞赛时间:每两年(逢双数年号)举办一届 报名:3 ...赛选拔(3-6 月) 、复赛作品网上公示投票(7-9 月) 、全 国现场总决赛(11...


2015年全国职业院校银行综合业务技能大赛(高职组)方案...

2015 年全国职业院校技能大赛 竞赛项目方案申报书赛...借助计算机仿真模拟,提升教 学质量、增强学生职业技能...省级选拔赛,各省选拔省赛团 体一等奖参加国赛(...


电信学院学生可参加的科技竞赛略搜

2、全国计算机仿真大奖赛 、级别: 级别:国家级 主办单位: 主办单位:中国自动化...大赛选拔 赛采用统一命题、 分赛区比赛的组织方式。 核内容: 考 基础理论和...


第三届数控技能大赛广东省选拔赛技术文件

第三届数控技能大赛广东省选拔赛技术文件_机械/仪表_工程科技_专业资料。各工种...学生组计算机仿真加工统一使用广东省职业技能鉴定 指导中心 CZK 数控加工仿真训练...


武汉大学计算机学院2015届保研政策

弘毅学堂计算机班 分配名额 39+3 14+2 3+1 2+1 6 备注 名额数:71 (...科技作品竞赛一等奖、全国 计算机仿真大赛一等奖、电子设计大赛信息安全邀请赛一等奖...


2012年上学期获奖情况汇总

年湘潭大学高等数学竞赛(非数学专业) 校级一等奖: 张卫刘 校级二等奖: 谢周璨 校级三等奖: 乔吉祥 14.全国计算机仿真大赛湘潭大学选拔赛 校级二等奖: 王军军 ...


制药技术技能-2015年全国职业院校技能大赛比赛项目方案...

对 整个工作过程中的任务进行计算机仿真模拟, 突出现代仿真技术 和实操的结合,...2.比赛报名 报名以代表队方式进行,各参加全国决赛省份在省内选拔基 础上选派 2...


免推政策

中国 计算机用户协会、中国系统仿真学会、 中国商业联合会 教育部高校高职高专 ...力学竞赛 (新加坡)国际市场营销大赛中国区 选拔赛 全国大学生海洋知识竞赛 国家...

网站首页 | 网站地图
All rights reserved Powered by 学霸学习网 www.tceic.com
copyright ©right 2010-2021。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com