韦洁自主躲避子弹课程设计概要Word格式文档下载.docx
- 文档编号:8151857
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:21
- 大小:154.65KB
韦洁自主躲避子弹课程设计概要Word格式文档下载.docx
《韦洁自主躲避子弹课程设计概要Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《韦洁自主躲避子弹课程设计概要Word格式文档下载.docx(21页珍藏版)》请在冰点文库上搜索。
与通常玩的游戏不同的是:
参赛者必须利用对机器人进行编程,给机器人设计智能来自动指挥它,而不是由键盘、鼠标简单地直接控制。
Robocode是一种有趣的竞赛性编程,使用几行简单的代码,就能够让你创建一个活生生的机器人,一个真正的在屏幕上与其他机器人互相对抗的机器人。
你可以看到它在屏幕上四处疾驰,碾碎一切挡道的东西。
机器人配有雷达与火炮,选手在躲避对手进攻的同时攻击对手,以此来较量得分的多少。
Robocode可以让你在娱乐的同时学习与提高Java技术。
有人提议为对学习更多的XP方法学知识感兴趣的开发人员构建一个工作间。
把一群人凑到一起,分成小组研究该方法学。
然后要有一个经验丰富的XP教练对工作间进行管理,帮助参加者理解其原理。
而建议各小组采用的项目就是创建Robocode机器人。
其实我对机器人一直很感兴趣。
在我还是个孩子是时候,我记得AplleⅡ上有一个程序,我们用它来编写简单的机器人程序,然后相互作战。
2.2功能需求
此坦克的制作主要分为三块:
运动、开火和避子弹。
运动要根据一个敌人还是多个敌人而分为两种。
开火和躲子弹使用数组记录敌人的子弹信息来完成功能。
3、总体设计
根据Java的特点,我利用类的设计,实现了坦克的运动、开火和自主躲避子弹。
运动会判断敌人的两种形式,然后根据敌人的位置用最小危险系数来寻找运动位置的运动和反冲浪式运动。
开火和躲子弹主要用数组来记录敌人的子弹信息。
4、详细设计
1.turnLeft(doubledegree)和turnRight(doubledegree)分别是使坦克机器人或左或右转过一个指定的角度;
2.turnGunLeft(doubledegree)和turnGunRight(doubledegree)分别是使炮可以独立于坦克车的方向(左右)转动指定的角度;
3.fire(doublepower)发射指定能量的炮弹,能量范围是(0-3);
4.ScannedRobotEvent-通过覆盖onScannedRobot()方法
来处理;
当雷达检测到坦克机器人时,就调用该方法。
1、HitByBulletEvent-通过覆盖onHitByBullet()方法来处理;
当坦克机器人被炮弹击中时,就调用该方法;
2、HitRobotEvent-通过覆盖onHitRobot()方法来处理;
当坦克机器人击中另外一个坦克机器人时,就调用该方法;
3、ScannedRobotEvent。
通过覆盖onScannedRobot()方法来处理ScannedRobotEvent;
当雷达检测到坦克机器人时,就调用该方法;
4、战斗管理器调用run()方法激活坦克机器人;
5、enemyStategetCloseEnemy()获取离我方最近的敌坦克;
6、getEnemyNum()获取列表中敌坦克的数量;
7、calcFirePower(doubleenergy)计算子弹能量;
8、getAngle(doublex1,doubley1,doublex2,doubley2)计算两点之间形成的角度。
5、开发及运行环境
5.1开发时硬件环境
1)CPU:
AMD羿龙IIX3N870
2)显卡:
ATIMobilityRadeonHD4250
3)内存:
支持DDR
3
1333内存,最大可扩展到4GB
4)显示器:
分辨率:
1366×
768
5.2开发时软件环境
1)操作系统:
Windows8
2)jdk-7u9-windows-i586
3)CPU:
AMD羿龙IIX3N870
4)显卡:
ATIMobilityRadeonHD4250
5内存:
DDR
1333内存,最大可扩展到4GB
5.3运行时软件环境
Windows
8系统
2)显示器:
768,14英寸宽屏
六、功能模块
坦克机器人的系统模块主要是按照功能进行划分的要是按照功能进行划分的,该坦克机器人主要包括以下:
运动、开火和自主躲避子弹三个的功能模块。
其结构图如下:
7、代码的实现与运行
1、打开robocode平台,在“battle”中选择“New”。
如图所示
2、在打开的“New”对话窗中选择“wj”中“First”选项,然后按下“add”选择。
同理旋转系统自带的坦克进行对战。
效果如下图所示:
3、程序运行的效果图
4、对战结束效果过图
8、代码清单
packagewj;
importrobocode.*;
importrobocode.util.Utils;
importjava.awt.geom.*;
importjava.util.LinkedList;
importjava.awt.Color;
importjava.util.*;
importjava.lang.String.*;
importjava.awt.*;
publicclassFirstextendsAdvancedRobot{
privatestaticdoublesurfStats[][][]=newdouble[4][5][47];
privatestaticdoublenextSurfSegment[];
publicstaticPoint2D.DoublemyLocation;
publicstaticPoint2D.DoubleenemyLocation;
publicstaticLinkedListenemyWaves;
privatestaticdoubleoppEnergy=100;
doubledestinationX=0.0D;
doubledestinationY=0.0D;
privatestaticWavesurfWave;
privatestaticdoublelastDistance;
privatestaticintlastLastOrientation;
privatestaticdouble_lastLatVel;
privatestaticdouble_lastLastAbsBearingRadians;
privatestaticdouble_lastAbsBearingRadians;
privatestaticdouble_lastPredictedDistance;
privatestaticdoublegoAngle;
privatestaticintramCounter;
privatestaticjava.awt.geom.Rectangle2D.Double_fieldRect;
staticfinaldoubleA_LITTLE_LESS_THAN_HALF_PI=1.25;
staticfinaldoubleWALL_STICK=140;
staticfinalintGF_ZERO=23;
staticfinalintGF_ONE=46;
privatestaticdouble_enemyAbsoluteBearing;
privatestaticint_lastGunOrientation;
staticdoublelastVChangeTime;
staticintenemyVelocity;
Staticdouble[][][][][][]gunStats=newdouble[6][4][4][2][3][GF_ONE+1];
staticfinaldoubleLOG_BASE_E_TO_2_CONVERSION_CONSTANT=1.4427;
staticEnemyVectorenemyVector=newEnemyVector();
enemyStatetarget;
publicvoidrun(){
setBulletColor(Color.green);
setBodyColor(Color.blue);
setGunColor(Color.green);
setRadarColor(Color.yellow);
setAdjustGunForRobotTurn(true);
setAdjustRadarForGunTurn(true);
enemyWaves=newLinkedList();
_fieldRect=newjava.awt.geom.Rectangle2D.Double(18,18,getBattleFieldWidth()-36,getBattleFieldHeight()-36);
do{
turnRadarRightRadians(Double.POSITIVE_INFINITY);
}while(true);
}
publicvoidonScannedRobot(ScannedRobotEvente){
Wavew;
enemyStateenemy=newenemyState();
doubleoldEnergy=0;
doubleoldVel=0;
if(enemyVector.isIn(e.getName()))
{
oldEnergy=enemyVector.getEnemy(e.getName()).energy;
oldVel=enemyVector.getEnemy(e.getName()).velocity;
StringlatestTargetName="
"
;
if(enemyVector.getEnemyNum()>
=1)latestTargetName=enemyVector.getCloseEnemy().name;
//保存上一个敌人的名字
enemy.updateState(e,this);
if(!
enemyVector.isIn(enemy.name))//如果不在列表中则增加记录
{
enemyVector.add(enemy);
else
{
enemyVector.getEnemy(enemy.name).updateState(e,this);
//更新敌人信息
//判断是否更换目标
if(target!
=null)
if(enemy.distance>
200||target.distance-enemy.distance<
200)
enemy=target;
elseenemy=enemyVector.getCloseEnemy();
}
target=enemy;
fire(enemy);
//开火策略
publicvoidfire(enemyStateenemy){
doublebulletPower;
if((bulletPower=oppEnergy-enemy.energy)<
=3&
&
bulletPower>
0){//敌人发射子弹时保存子弹的信息
addCustomEvent(w=newWave());
w.bulletVelocity=(20D-(bulletPower*3));
w.directAngle=_lastLastAbsBearingRadians;
w.sourceLocation=enemyLocation;
w.orientation=lastLastOrientation;
w.waveGuessFactors=nextSurfSegment;
enemyWaves.addLast(w);
nextSurfSegment=surfStats[(int)(Math.min((lastDistance+50)/200,3))][(int)((Math.abs(_lastLatVel)+1)/2)];
oppEnergy=enemy.energy;
//扫描策略,根据战场上坦克数量而定
if(enemyVector.getEnemyNum()<
=1&
getTime()>
20)
//锁定敌人
setTurnRadarRightRadians(Utils.normalRelativeAngle((w.directAngle=_enemyAbsoluteBearing=getHeadingRadians()+enemy.bearingRadian)-getRadarHeadingRadians())*1.1);
else//全天候扫描
w.directAngle=_enemyAbsoluteBearing=getHeadingRadians()+enemy.bearingRadian;
setTurnRadarRightRadians(360);
enemyLocation=project((w.sourceLocation=myLocation=newPoint2D.Double(getX(),getY())),_enemyAbsoluteBearing,lastDistance=enemy.distance);
intdirection=(lastLastOrientation=sign(_lastLatVel));
try{
goAngle=(surfWave=(Wave)(enemyWaves.getFirst())).absoluteBearing(myLocation)+
A_LITTLE_LESS_THAN_HALF_PI*(direction=(sign(checkDanger(-1)-checkDanger
(1))));
}catch(Exceptionex){}
doubleangle=Utils.normalRelativeAngle(
wallSmoothing(myLocation,goAngle,direction)-getHeadingRadians());
doubleturnAngle;
turnAngle=Math.atan(Math.tan(angle));
//运动策略的选择
if(enemyVector.getEnemyNum()<
=1)
{
setTurnRightRadians(turnAngle);
setAhead((angle==turnAngle)?
100:
-100);
//实现反冲浪式运动
moveStategy();
//实现用最小危险系数寻找目标点的运动
doubleenemyLatVel;
_lastGunOrientation=w.orientation=sign(enemyLatVel=(enemy.velocity)*Math.sin(enemy.headingRadian-_enemyAbsoluteBearing));
intbestGF=0;
intnewVelocity;
if(enemyVelocity!
=(newVelocity=(int)(enemyLatVel=Math.abs(enemyLatVel)))){
lastVChangeTime=0;
bestGF=4;
if(enemyVelocity>
newVelocity){
bestGF=5;
}
enemyVelocity=newVelocity;
//计算预测因子
w.waveGuessFactors=gunStats[bestGF][(int)(LOG_BASE_E_TO_2_CONVERSION_CONSTANT*Math.log(enemyLatVel+1.5))]
[gunWallDistance(0.18247367367)?
(gunWallDistance(0.36494734735)?
(gunWallDistance(0.63865785787)?
3:
2):
1):
0]
[gunWallDistance(-0.36494734735)?
0:
1][(int)limit(0,(lastDistance-75)/200,2)];
bestGF=GF_ZERO;
for(intgf=GF_ONE;
gf>
=0&
(oppEnergy=enemy.energy)>
0;
gf--)//Jamougha:
Savesonebytecomparedtogoingup,weird
if(w.waveGuessFactors[gf]>
w.waveGuessFactors[bestGF])
bestGF=gf;
//子弹能量选择
doublepower;
=1)
power=2-Math.max(0,(30-getEnergy())/16);
elsepower=3;
if(enemy.energy<
=16)power=Math.min(2,(enemy.energy+2.0001)/6);
if(getEnergy()<
30)power=2-(30-getEnergy())/16;
if(enemy.distance<
100)power=3;
=0.2)power=0.0;
w.distance=-1.5*(w.bulletVelocity=(20-3*power));
setTurnGunRightRadians(Utils.normalRelativeAngle(_enemyAbsoluteBearing-getGunHeadingRadians()+((_lastGunOrientation*(Math.asin(8/w.bulletVelocity)/GF_ZERO))*(bestGF-GF_ZERO))));
if(Math.abs(getGunTurnRemaining())<
2&
setFireBullet(power)!
=null){
w.weight=4;
_lastLatVel=getVelocity()*Math.sin(enemy.bearingRadian);
_lastLastAbsBearingRadians=_lastAbsBearingRadians;
goAngle=_lastAbsBearingRadians=_enemyAbsoluteBearing-Math.PI;
publicvoidonHitByBullet(HitByBulletEvente){
if(surfWave.distanceToPoint(myLocation)-surfWave.distance<
100){
logHit(surfWave,myLocation,0.5);
publicvoidonHitRobot(HitRobotEvente){
ramCounter++;
doubleHeading=getHeadingRadians();
doubleBearing=e.getBearingRadians();
doubleGunHeading=getGunHeadingRadians();
doubleAbs=Heading+Bearing;
publicvoidonRobotDeath(RobotDeathEvente)
//移除选择,因为总共有敌我两个列表
enemyVector.remove(e.getName());
target=null;
//非一对一的运动策略,即最小危险系数的方法
publicvoidmoveStategy(){
1)
doublenowX,nowY,testX,testY,fieldWidth,fieldHeight,force,smallestForce,distance,move,firePower;
inti;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自主 躲避 子弹 课程设计 概要