12

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

现在,我想做的是类似于Robocode的事情,但我将使用 .Net 框架而不是 Java。


什么是机器人代码?

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

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


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

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

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

动画和图形(用于实战)

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

我目前想到的选项是:

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

您认为什么更适合这种特殊情况?


开发类和接口

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

我感谢大家,即使在我的问题中设法阅读到这一点,我将需要并非常感谢我能获得的所有帮助来完成这个项目。

感谢您的时间和精力。


顺便说一句,到目前为止,除了Robocode之外,我发现这些游戏与我正在尝试创建的游戏相似:

4

6 回答 6

7

这个项目可行吗?

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

  • 当截止日期发生时,如果交付 90% 功能的系统的 90% 是 100% 完成的,那么您可能会说该项目至少 90% 成功。

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

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

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

为此,我建议:

  1. 创建(即设计、开发和测试)一个小的整体系统
  2. 重复{备份或版本控制您所拥有的;向系统添加一个新的、完整的一点点,并对其进行测试,直到它令人满意为止 } 直到(你的时间用完了)。
于 2009-02-02T21:49:00.517 回答
6

当我开始使用 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)

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

于 2009-02-02T23:01:27.843 回答
1

这是非常可行的。

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

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

最后,创建您可能需要的任何用户界面……一切就绪。

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

于 2009-02-02T21:40:42.700 回答
1

可行性完全取决于您的团队的能力,对框架的熟悉程度等。我见过有人可以在一周内完成类似的事情,而其他人却无法做到以挽救生命。

您提到的反思方法听起来像是错误的轨道,除非我误解了您。您的“Robot”基类应该允许开发人员覆盖一个或多个方法,他们可以从中调用“Shoot”、“Move”等函数。

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

于 2009-02-02T23:16:39.030 回答
0

那么,有点像virii呢?

于 2009-02-02T21:42:10.233 回答
0

Real Robocode 将很快获得运行 .NET 机器人的插件。我花了 2 年的时间来实现这一目标。第一年重构原始 Robocode。第二个关于Java 到 .NET 的桥。还有alpha 位。这种方法的好处是您可以使用最好的 Java 机器人。机器人里其实藏着大宝。

于 2010-01-15T00:12:49.810 回答