我目前正在学校的最后一年,正在攻读计算机研究国家高级文凭,基本上在最后一个学期,我们需要开发一个软件项目,该项目基本上包含 所有的 系统。

现在,我想做的是类似的事情 机器人代码, ,但我将使用 .Net Framework 来代替 Java。


什么是机器人代码?

对于那些不知道 Robocode 是什么的人来说,它基本上是一种编程游戏,人们使用现有的类接口和可下载类中的方法开发自己的机器人,然后他们 斗争 彼此在竞技场中进行自主战斗......就像这样:

替代文本 http://articles.techrepublic.com.com/i/tr/cms/contentPics/robocode.gif


所以基本上,正如我所说,我想使用 .Net Framework 重新创建这种场景。我将这个问题发布在 StackOverflow 上,希望更有经验的开发人员能够指导我朝着这个项目的正确方向前进。 。

到目前为止我的想法基本上是创建:

  • 离线应用程序将充当竞技场和用户界面,以与现有机器人等创建新的战斗。
  • 在线界面,玩家可以使用它注册新机器人、查看过去的锦标赛得分等...
  • 显然,玩家需要使用类接口来创建他们的机器人。

动画和图形(针对实际战斗)

现在,当然,战斗发生时会有某种动画和动作,但我还没有决定使用什么作为媒介。

我目前想到的选项是:

  • 正如我在上面第一个要点中所说,开发一个将作为战场的离线应用程序,并且所有动画将主要使用 C# 代码完成
  • 或者开发一个将处理动画的 Silverlight 应用程序(从而将场景从离线应用程序更改为现在的在线应用程序)
  • 或者,也许是其中最不可行的,使用 JavaScript 创建战斗动画,例如 帆布

您认为什么更适合这个特定场景?


开发类和接口

对于开发机器人的玩家,我将提供某些类接口,他们将能够像在 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...

以下是 Robocode (Java) 中的代码片段:

public class MyFirstRobot extends Robot {
    public void run() {
        while (true) {
             ahead(100);
             turnGunRight(360);
             back(100);
             turnGunRight(360);
         }
    }
}

为了让战斗真正发生,我正在考虑使用反射来实际读取用户实际使用的方法,并实现它们在战斗的特定时刻运行和调用。


现在,我亲切而谦虚地请求你们经验丰富的开发人员,指导我完成我的这个项目,并就需要做什么提供建议......对于初学者来说, 这个项目到底可行吗? 而如果确实如此的话 我需要从哪里开始我的项目?


至于我打算使用的技术和软件是:

  • .NET Framework 3.5,带有 C# 3.0
  • LINQ(语言集成查询)
  • SQL Server 2008
  • 微软视觉工作室2008
  • jQuery 框架
  • 可能是银光

我感谢你们所有人,即使你们设法阅读了我的问题,我将需要并非常感谢我能得到的所有帮助来完成这个项目。

感谢您的时间和精力。


顺便说一句,到目前为止,除了 机器人代码, ,我发现这些游戏与我正在尝试创建的游戏相似:

有帮助吗?

解决方案

当我开始使用 WPF(与 Silverlight 非常相似)时,我最终花了很多时间来弄清楚如何做事。与我尝试过的其他方法相比,这是一种非常不同的制作 GUI 的方法,而且似乎有十亿种不同的方法可以做事。我的观点是,如果您没有 WPF/Silverlight 的经验,我怀疑您需要花费很多时间来理清思路。我想这取决于你已经知道的事情。

除此之外,我完全支持ChrisW关于增量开发的建议。我将向您介绍如何进行游戏设计。从一个非常简单的机器人 API 开始,比如说两个没有事件、输入或世界知识的函数。首先让机器人移动。关键是要获得一个功能齐全、功能简单的程序,包括从加载客户端代码到显示“战斗”结果的所有部分。

每个机器人都应该使用单个方法 run() 实现一个接口,并位于自己的 dll 文件中。当战斗开始时,每个实现了接口的dll都会从某个位置加载(使用反射)并实例化。然后开始循环战斗,直到 1 分钟过去(或者其他什么,只是为了看看有什么事情发生):

while (time is not up)
   generate random sequence for bots
   call run() on each bot
   draw(world)

时间一到,战斗就结束了。现在您有了一个框架应用程序,您可以开始充实它,并且即使您没有时间实现您想要的所有功能,它也可以让您拥有一个工作程序。在 run 方法中,机器人可以调用您在 API 中定义的几个移动操作。调用这些将改变世界的状态 - 可能只是一个瓷砖网格,以及每个机器人的位置。

下一步可能是将世界视图添加到机器人的 run 方法中,将循环更改为:

while (time is not up)
   generate random sequence for bots
   call run(WorldView) on each bot
   draw(world)

假设机器人仍然只能在其运行方法中执行几个移动操作。现在,他们可以选择了解世界(或他们的一部分),这使他们能够靠近或远离敌人并避开墙壁。

在下一次迭代中,您可以创建一个 API 函数来发射大炮(或任何适合您游戏的内容)。实现如何改变世界状态、如何跟踪子弹以及如何表示动画等。循环可能看起来像这样:

while (time is not up and there are more than 1 bot alive)
   advance projectiles
   calculate projectile-bot collisions and damage
   generate random sequence for bots
   call run(WorldView) on each bot
   draw(world)

我希望这能让您了解如何迭代地充实该程序,同时拥有一个反映游戏所有领域的工作程序。我在实现游戏方面没有太多经验,所以你应该以批判的眼光看待我的建议,但这就是我解决问题的方法。

其他提示

这个项目到底可行吗?

听起来很大。我不知道你还有多少时间。这是一个经验法则:

  • 当截止日期到来时,如果提供 90% 功能的系统 90% 已 100% 完成,那么您可能会说该项目至少 90% 成功。

  • OTOH 如果提供 100% 功能的 100% 软件仅完成了 90%(即未完成),那么什么都没有完成,项目就是失败的。

那么,成功的关键是“增量开发”和“持续交付”。您的项目规范说:

我们需要开发一个软件项目,它基本上包含 所有的 系统。

为此,我建议:

  1. 创建(即设计、开发和测试) 小整体 系统
  2. 重复{备份或版本控制您拥有的内容;向系统添加一个新的、完整的一点,并测试它直到满意为止}直到(你用完时间)。

这是非常可行的。

我建议从响应“编译”机器人代码的后端系统和对象开始。“编译”代码采用什么形式取决于你。

然后,为 robocode 创建解释器。或者,听起来您可能只能创建 .NET 类。这是最难的部分的免费赠品。

最后,创建您可能需要的任何 UI...一切就绪。

您可能希望将机器人编译为 .dll ...尽管如此,您只需为它们创建通用接口和功能即可。

可行性完全取决于你团队的能力、对框架的熟悉程度等。我见过有人能在一周内解决这样的问题,也见过有人无法做到这一点来挽救自己的生命。

你提到的反思方法听起来像是错误的轨道,除非我误解了你。您的“机器人”基类应该允许开发人员重写一个或多个方法,他们可以从中调用“射击”、“移动”等函数。

另一个与此类似的应用程序是 Terrarium。开发人员可以对动物进行编码,并让它们在分布式环境中与其他动物进行竞争。它是一个 .NET 1.1 演示应用程序,有点过时,但其中一些原理可能仍然对您有帮助。这个人已经开始重写它:http://weblogs.asp.net/bsimser/archive/2008/07/16/reintroducing-terrarium-now-with-2-0-goodness.aspx

所以,有点像 维里, , 然后?

Real Robocode 很快就会获得用于运行 .NET 机器人的插件。我花了两年时间才实现这一目标。第一年用于重构原始 Robocode。第二个上 Java 到 .NET 的桥梁. 。还有 阿尔法位. 。这种方法的好处是你可以与最好的 Java 机器人战斗。机器人里其实蕴藏着巨大的宝藏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top