Robocode教程2——你的第一个robo,取个好名字哦

摘自:http://site.douban.com/widget/notes/7736245/note/210029011/

 

 你需要准备的东西:
1.c语言的知识和一点点的java知识,robocode意在学习java,不要要太深的java水平,你只要理解java和c的区别就可以了。
2.robocode API,这个以后会经常用到,几乎不能离开,相当于方法字典,robocode的所有方法都在里面。下载地址:http://115.com/file/e765xcsb#javadoc.zip
网页版:http://robocode.sourceforge.net/docs/robocode/

好了,兴趣是最好的老师,我们先抛开那些繁琐的参数、坐标、算法,先建立一个简单的robo试试。
打开robocode,选择【Robot】->【Editor】,打开editor后,选择【new】->【Robot】,给robo取个好名字吧,比如Tiny,那是因为我玩dota游戏喜欢小小,robo也很小,可是功能却很强大的。

 


下面是输入机器人的包,包是java中的一个概念,这里我们暂且把它当成文件夹来看吧。我们就输入自己的名字就ok了。

 


下面我分别对其默认生成的代码进行解释:
package cm;
import robocode.*; //cm就是我的包,import是告诉java你要在在你的工程中使用robocode
import java.awt.Color;

public class Tiny extends Robot //告诉java,我写的这个是一种“Robot”,叫做“Tiny”
{
        public void run() { //run()方法是战斗开始时默认调用的,我们在这里写自己的代码
                while(true) {
                        ahead(100);//向前100像素
                        turnGunRight(360);//把gun向右转动360度
                        back(100);//后退100像素
                        turnGunRight(360);//把gun向右转动360度
                }
        }
 /*以on开头的方法都是事件触发方法,熟悉单片机的同学可能知道,这相当于单片机里面的中断,每当程序遇到一个触发事件时,将停止主方法的运行而运行触发方法,运行后再返回主方法。
*/
        public void onScannedRobot(ScannedRobotEvent e) { //每当雷达扫描到敌人
                fire(1);
        }
        public void onHitByBullet(HitByBulletEvent e) {//每当被子弹击中
                back(10);
        }
        public void onHitWall(HitWallEvent e) {//每当撞墙
                back(20);
        }
}

package为机器人建立包“cm”,以后我这个机器人的源文件就存放在这个包里面了,然后导Robocode.* 这是编写机器人必不可少的一句代码。因为所有机器人都是在Robocode平台下运行,Robocode包为我们提供了所有编写机器人的应用程序接口。接下来被注释掉的一句是导入java.awt.Color,当你要为机器人设置颜色的时候:setColors(Color bodyColor,Color gunColor,ColorradarColor),它就必不可少,如果少了导入Color这一句,编译是不会通过的。setColors参数有三个,分别是指定车身,炮,雷达各自的颜色。public class Tiny extends Robot {...}机器人的名字是Tiny,代码表明建立了一个公有类Tiny继承Robot,必须建立公有的类,现在的Tiny是一个简单机器人。而我们将要打造的不仅仅是继承简单机器
人,而是高级机器人(AdvancedRobot)。能够高效率运行的机器人都是继承的AdvancedRobot,因为Robot是线程阻塞式的,AdvancedRobot是线程非阻塞式的。他们的区别比较明显,分析while(true){}里面的代码来理解线程阻塞与非阻塞就比较容易了。

在Robocode中每一个机器人都是一个独立的线程,我们知道不管是extends Thread还是implementsRunnable 都要实现public void run()方法,这是必不可少的。为了保证机器人不断的运行自己的程序,所以线程中用了while(true)循环。在每一次循环中,ahead(100)机器人向前运动100象素,接着turnGunRight(360) 右转炮360度,因为没有使用setAdjustRadarForGunTurn(true),所以雷达会随着炮的转动而同步转动,雷达在转动的时候自动扫描周围的敌人,如果发现敌人,那么ScannedRobotEvent事件发生。系统默认写好的代码只有一句:fire(1)发射能量为1的炮弹,如果敌人在炮弹到达时还在原地,恭喜!命中目标了。接下来,机器人就会执行back(100)后退100象素,然后turnGunRight(360)扫描敌人。继续下一次的循环。

最后这个机器人还写了一个事件:onHitByBullet(HitByBulletEvent e)机器人被敌人的炮弹击中后就发生了这个事件。turnLeft(90-e.getBearing())车身左传一个角度,这个角度的值是90-e.getBearing(),e.getBearing()是获得炮弹与车身的相对角度,左转后,车身的角度会与炮弹飞来的直线成直角,这样有利于躲避下一次的炮弹攻击。

好了,我们的第一个robo就完成了,是不是很简单呢?只要移动,扫描,发现目标,fire!

选择【compiler】->【compile】编译就ok了。

最后进入战斗界面,新建一个战斗,看看我们的Tiny是不是在里面呢?Tiny,its your show time!

 

 

转载于:https://www.cnblogs.com/KeenLeung/archive/2012/06/18/2553057.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《关键对话——从“心”开始,如何确定目标》读书笔记(三)

从“心”开始,如何确定目标、 我们的问题并不是行为本身是错误的,而是我们的动机有问题,即我们常常弄错要面对的目标。 一、从心开始 对话高手总是能做到从心开始。在开展高风险对话时,他们总是首先明确目的和动机,无…

UI设计师的面试过程

Palantir Technologies是一家提供分析、整合、可视化各种数据的IT型技术公司。在该公司,前端工程师和后端工程师有同样的面试过程,前端工程师也需要的一定的编程基础。该公司技术博客Palantir TeckBlog日前发表了一篇博文《The UI Design Interview》&am…

C语言代码实现数组(简单)

前一节课讲了数组的删除功能实现&#xff1a;删除功能 本节课内容我们实现数组的反转功能和冒泡排序功能&#xff1a; #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h>struct Arr{int * pBase; //存储数组第一个元…

数据在市场运营中的应用

数据在市场运营中的应用 1. 背景 目前的产品运营、用户拉新、渠道投放、留存等都是靠人工进行策略制定&#xff0c;有的公司和部门完全靠着以前的经验在尝试互联网产品的市场营销和运营。这样不仅效率很低&#xff0c;而且效果也不显著。 主要存在的问题有以下几点&#xff…

C语言的typedef用法

案例1&#xff1a; #include <stdio.h> #include <string.h> #include <malloc.h>typedef int zhangsan; //为int在多取一个名字 zhangsan等价于intstruct Student{int sid;char sname[100];char sex;} ST;int main() {int i 10; //等价于zhangsan i10…

信息流项目计划和思路

目录 一、对项目的认识. 4 1&#xff0e;用户需求和竞品. 4 2. 项目现状. 4 3. 发展前景. 4 二、项目的业务方向和思路. 6 1. 业务方向. 6 2. 2020年目标. 6 3. 思路. 6 3.1用户留存提升&#xff08;6%->12%&#xff09;. 6 3.2日活提升&#xff08;30万->80万…

MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中&#xff0c;N指的是字符的长度,VARCHAR类型最大支持65535,指的是65535个字节,但并不支持65535长度的varchar&#xff0c;65535中应该包含了所有字段的长度、变长字段长度标示…

数据结构链表知识入门

链表定义: n个节点离散分配&#xff0c; 彼此通过指针相连 每个节点只有一个前驱节点&#xff0c;每个节点只有一个后续节点 首节点没有前驱节点尾节点没有后续节点 专业术语: 首节点:第一个有效节点尾节点:最后一个有效节点头结点: 1&#xff0c;第一个有效节点之前的那个节…

《关键对话——注意观察,如何判断对话氛围是否安全》读书笔记(四)

《关键对话——注意观察&#xff0c;如何判断对话氛围是否安全》读书笔记(四) 在对话过程中&#xff0c;既要关注对话内容&#xff08;即讨论的主题&#xff09;&#xff0c;也要观察对话气氛&#xff08;即参与者的反应&#xff09;。越早意识到你和对方退出了对话机制&#x…

扬长避短使用Windbg和Visual Studio高效调试调试你的代码

扬长避短使用Windbg和Visual Studio高效调试调试你的代码 经常被问及这样的问题&#xff1a; 你为什么非要使用Windbg调试你的程序&#xff1f; 记得有一次面试的时候笔者也被问到这样的问题&#xff0c;我的回答是&#xff1a;不是我非要使用Windbg, 只是在不同的情况下使用不…

链表的分类

分类: 单链表 双链表:每一个节点有两个指针域 循环链表&#xff1a;能通过任何一个节点找到其他所有的结点 非循环链表 链表中第一个结点的存储位置叫做头指针&#xff0c;那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点&#xff0c;其实就是上一个的后继指…

机器学习基础笔记总结

最近在学习latex&#xff0c;将之前的机器学习基础知识相关的笔记用latex整理了以下&#xff0c;源地址如下&#xff1a; https://github.com/duankai/latex_book&#xff0c;感兴趣的可以自由下载&#xff0c;也可以随意使用latex的格式。 pdf 效果如下&#xff0c;文件可在h…

IOS基础:ActionSheet(上拉菜单)的实现

一看图就明白了&#xff0c;毋需多说。 [java] view plaincopyprint?UIActionSheet* mySheet [[UIActionSheet alloc] initWithTitle:"ActionChoose" delegate:self cance…

Eureka的优点

Eureka的优势 1、在Eureka平台中&#xff0c;如果某台服务器宕机&#xff0c;Eureka不会有类似于ZooKeeper的选举leader的过程&#xff1b;客户端请求会自动切换到新的Eureka节点&#xff1b;当宕机的服务器重新恢复后&#xff0c;Eureka会再次将其纳入到服务器集群管理之中&a…

Word2vec学习笔记总结

git地址&#xff1a; https://github.com/duankai/latex_book/tree/master/word2vec

在 Objective-C 中对 Block 应用 property 时的注意事项

应当使用&#xff1a;property (nonatomic, copy)今天在这个问题上犯错误了&#xff0c;找了好久才知道原因。另外&#xff0c;简单的进行反汇编看了下&#xff0c;Block 被存储在静态变量区&#xff0c;运行时构造出一个运行栈&#xff0c;进行调用。retain 并不会改变 Block …

创建链表和遍历链表算法演示

#include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h>typedef struct Node {int data; //数据域struct Node * pNext; //指针域}Node, *pNode;//函数声明 pNode create_list(); void traverse_list(pNode pHead); int…

Redis 21问,你接得住不?

转载文章&#xff0c;原文&#xff1a;https://zhuanlan.zhihu.com/p/130923806 1.什么是redis? Redis 是一个基于内存的高性能key-value数据库。 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库&#xff0c;很像memcached&#xff0c;整个数据库统统加载在内存…

@Autowired、@Resource

Autowired通过 Autowired的使用来消除 set &#xff0c;get方法 - Spring 2.5 JPA hibernate 使用方法的点滴整理我们编写spring 框架的代码时候。一直遵循是这样一个规则&#xff1a;所有在spring中注入的bean 都建议定义成私有的域变量。并且要配套写上 get 和 set方法。虽然…