我是Robocode引擎的开发者.我们想使Robocode多语言和Scala似乎是很好的匹配.我们这里有Scala插件原型.
问题: 因为用户是有创造力的程序员,他们可能会尝试以不同的方式赢得战斗.还可以从在线数据库下载机器人,任何人都可以上传机器人.因此,安全性的差距可能会导致用户计算机的安全漏洞.用Java编写的机器人在受限制的沙箱中运行.几乎所有东西都被禁止[网络,GUI,磁盘(有限),线程(有限),类加载器和反射].沙箱类似于浏览器小程序.我们使用SecurityManager,每个机器人自定义ClassLoader 等...
有两种方法可以在Robocode中托管Scala运行时:
1)将其与机器人一起装入沙箱内.我们非常安全,首选解决方案.但它会损害Scala运行时功能,因为运行时使用反射.也许在运行时生成类?使用线程进行一些内部清理?访问JVM /内部?(我不想限制语言的能力)
2)使用Scala运行时作为可信代码,在框外,安全性与JDK处于同一级别.(恶意)机器人的可见性.Scala运行时API是安全的吗?他们有保安人员的方法吗?有安全模式吗?Scala运行时是否有任何单例,可能会滥用机器人之间的通信?任何可以模拟线程的concurency/threadpool/messaging?(Scala运行时是否有任何安全审核?)
3)介于两者之间,某些运行时类和一些运行类.机器人/哪些类/包必须是可见的?它们只是私有实现?(这似乎是未来的解决方案)
问题: 是否有可能枚举和隔离必须在其余部分中运行在受信任范围内的运行时部分?具体的包和类?还是更好的主意?
我正在寻找具体的答案,这将导致安全的解决方案.随意的想法欢迎,但没有奖励.scala电子邮件小组正在进行讨论.还没有具体的答案.
我正在寻找类似于RoboCode或Scalatron的游戏或挑战.我对Project Euler这样的挑战不感兴趣,在那里我获得了解决特定问题的积分.我正在寻找直接竞争.我知道http://sumost.ca/steve/games/但遗憾的是没有基于python的项目.如果您有任何建议,请与我分享.
我目前在学校的最后一年,攻读计算机研究高等国家文凭,基本上在最后一个学期,我们需要开发一个软件项目,基本上包含一个完整的系统.
现在,我正在考虑做的事情就像Robocode一样,但是我将使用.Net Framework来代替Java.
对于那些你不知道的Robocode是什么,它基本上是一种编程游戏在人们开发利用的类接口和存在的下载类的方法自己的机器人,然后他们打在对方的自主战斗竞技场......像这样:
alt text http://articles.techrepublic.com.com/i/tr/cms/contentPics/robocode.gif
所以基本上,正如我所说,我想使用.Net Framework重新创建这种场景.我在StackOverflow上发布这个问题,希望更有经验的开发人员能够指导我为这个项目正确的方向.
到目前为止我的想法基本上是创造:
现在,当战斗发生时,当然会有某种动画和动作,我还没有决定还有什么用作媒介.
我目前想到的选项是:
你认为什么可能更适合这种特殊情况?
对于玩家开发机器人,我将提供他们能够像Robocode一样使用的某些类接口.
此类事件和方法的示例可能包括:
public void run () {}
public void onScannedRobot(ScannedRobotEvent e) {}
walk(/* ammount in pixels or w/e to walk to */);
turnRight(/* value in degrees for an angular turn */);
//etc...
Run Code Online (Sandbox Code Playgroud)
以下是Robocode(Java)中代码的片段:
public class MyFirstRobot extends Robot {
public void run() {
while (true) {
ahead(100);
turnGunRight(360);
back(100);
turnGunRight(360); …
Run Code Online (Sandbox Code Playgroud) 我非常喜欢和我的第一个机器人一起玩Robocode.现在我想做一些更令人兴奋的事情.制作高级机器人的最佳教程是什么?
我一直在尝试获取敌人的坐标,以便我可以对他们所在的位置采取行动。我使用的代码似乎不起作用:
double absBearing = e.getBearingRadians() + e.getHeadingRadians();
double ex = getX() + e.getDistance() * Math.sin(absBearing);
double ey = getY() + e.getDistance() * Math.cos(absBearing);
Run Code Online (Sandbox Code Playgroud)
我似乎正在得到奇怪的回报,这些回报给我的价值大于领域的大小,甚至是负数字,有人对如何修改这段代码以获取敌人的代码X
以及Y
与我X
和相同的方式有任何想法Y
吗?
我正在尝试向控制台写任何东西,但没有运气.
System.out.println("abc");
Run Code Online (Sandbox Code Playgroud)
应该工作,但事实并非如此.这是我的全部代码:
import robocode.HitWallEvent;
import robocode.Robot;
public class MyRobot extends Robot
{
@Override
public void run()
{
while (true)
{
ahead(20);
System.out.println("Test Test");
}
}
@Override
public void onHitWall(HitWallEvent event)
{
System.out.println("Ouch, I hit a wall bearing " + event.getBearing() + " degrees.");
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
最好的祝福!
我正在编写一个名为robocode的编程游戏程序.问题出在这里:
void wallScan(boolean While){
stop();
getStraight();
turnGunRight(90);
if(startabsolute){
straight=true;
}
while (While){
ahead(10000000);
turnRight(90);
}
resume();
}
Run Code Online (Sandbox Code Playgroud)
您可能无法理解大多数代码,因为它扩展了robocode.Robot,但我的问题在于变量While
.循环没有结束,因为方法获取参数一次,它是真的所以方法成为一个永恒的循环,但有一种方法来刷新方法参数,因为我不想每次调用这个时都做一个while循环方法?
在我的学校,我们正在为我们的CS俱乐部开始编码竞赛,以帮助我们的新生学习使用Robocode的快速周转时间,截止日期,代码比较和API文档.我想知道是否有办法允许每个成员在他们自己的包/机器人上工作并将他们拉到一个中心位置进行比较和竞争?我希望能够将所有项目都放到我的笔记本电脑上,但允许俱乐部成员将他们的包裹分开,只对他们的部分工作.跨平台解决方案是理想的选择.
代码尽可能简单,但我似乎遇到了编译器错误.我错过了什么?
作为旁注,_name
完全删除字段只会在下一个字段上生成相同的错误.
PS:期待在这一个上有相当多的减号票,感觉我错过了一些非常简单的东西.
package mkumpan.helpers;
public final class BotState
{
private final String _name;
private final double _x;
private final double _y;
private final double _energy;
private final double _heading;
private final double _velocity;
public BotState(
String name,
double x,
double y,
double energy,
double heading,
double velocity
) {
String _name = name;
double _x = x;
double _y = y;
double _energy = energy;
double _heading = heading;
double _velocity = velocity;
} // BotState.java:26: error: …
Run Code Online (Sandbox Code Playgroud)