Разработка игры типа Robocode с.Net для школьного задания
В настоящее время я учусь на последнем курсе в школе, готовлюсь к высшему национальному диплому по информатике, и в основном в этом последнем семестре нам нужно разработать программный проект, который в основном включает в себя целую систему.
Теперь я собираюсь сделать что-то похожее на Robocode, но вместо Java я буду делать это с.Net Framework.
Что такое Робокод?
Для тех из вас, кто не знает, что такое Robocode, это в основном своего рода программируемая игра, в которой люди разрабатывают своих собственных роботов с использованием методов из интерфейсов классов и существующих загружаемых классов, а затем они сражаются друг с другом в автономной битве в арена... вроде такая
http://articles.techrepublic.com.com/i/tr/cms/contentPics/robocode.gif
В общем, как я уже сказал, я хочу воссоздать такой сценарий, используя.Net Framework... и я публикую этот вопрос здесь, в Stackru, в надежде, что более опытные разработчики смогут направить меня в правильном направлении для этого проекта.,
До сих пор я имел в виду, в основном, создать:
- Автономное приложение, которое будет служить ареной сражений и пользовательским интерфейсом для создания новых сражений с существующими роботами и тому подобным.
- Онлайн интерфейс, который игроки смогут использовать для регистрации новых роботов, просмотра результатов турниров и т. Д.
- И, очевидно, интерфейсы классов, которые игроки должны будут использовать для создания своих роботов.
Анимация и графика (для реальных сражений)
Теперь, конечно, будет какая-то анимация и движение, когда произойдет сражение, и я еще не решил, что еще использовать в качестве средства для этого.
Варианты, которые я сейчас имею в виду:
- Разработка, как я уже говорил в первых пунктах, автономного приложения, которое будет служить полем битвы, и все анимации будут выполняться с использованием в основном кода 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);
}
}
}
Для того, чтобы на самом деле заставить сражения происходить, я думаю об использовании Reflection, чтобы фактически прочитать, какие методы пользователь фактически использует и реализует для запуска и запуска в определенные моменты битвы и тому подобное.
Теперь, что я любезно и смиренно прошу у вас, опытных разработчиков, это немного рассказать о моем проекте и посоветовать, что нужно сделать... для начала, возможен ли этот проект вообще? И если это действительно так, откуда мне нужно начинать с моего проекта?
Что касается технологий и программного обеспечения, которые я собираюсь использовать, это:
- .NET Framework 3.5, с C# 3.0
- LINQ (Language Integrated Query)
- SQL Server 2008
- Microsoft Visual Studio 2008
- JQuery Framework
- Возможно Silverlight
Я благодарю вас всех, даже за то, что мне удалось прочитать этот вопрос до этого момента, и я буду нуждаться и высоко ценить всю помощь, которую я могу получить, чтобы закончить этот проект.
Спасибо за ваше время и усилия.
Кстати, до сих пор, кроме Robocode, я нашел эти игры, которые похожи на то, что я пытаюсь создать:
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. Их вызов изменит состояние мира - возможно, просто сетку плиток и местоположение каждого бота.
Следующим шагом может быть добавление представления о мире к методу запуска ботов, изменив цикл следующим образом:
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% (то есть не завершено), то ничто не завершено, и проект является провалом.
Ключ к успеху, таким образом, заключается в "постепенном развитии" и "постоянных поставках". В спецификации вашего проекта говорится:
Нам нужно разработать программный проект, который в основном включает в себя целую систему.
Для этого я предлагаю:
- Создать (т.е. спроектировать, разработать и протестировать) небольшую целую систему
- Повторите {резервное копирование или контроль версий, что у вас есть; добавьте новый, совсем маленький кусочек в систему и проверяйте его до тех пор, пока он не станет удовлетворительным} до (у вас не хватит времени).
Это очень выполнимо.
Я предлагаю начать с серверной системы и объектов, которые реагируют на "скомпилированный" робокод. Какую форму принимает этот "скомпилированный" код - это все вы.
Затем создайте интерпретатор для робокода. Или, похоже, вы можете просто создавать классы.NET. Это халява на самой сложной части.
Наконец, создайте любой пользовательский интерфейс, который вам может потребоваться... все готово.
Возможно, вы захотите, чтобы роботы компилировались как.dlls... тем не менее, вам просто нужно создать для них общий интерфейс и функциональность.
Выполнимость полностью зависит от способностей вашей команды, знания структуры и т. д. Я видел людей, которые могли бы выкинуть что-то подобное за неделю, и тех, кто не мог сделать это, чтобы спасти свою жизнь.
Подход рефлексии, о котором вы говорите, звучит как неправильный трек, если только я вас не понимаю Ваш базовый класс "Robot" должен позволять разработчикам переопределять один или несколько методов, из которых они могут вызывать такие функции, как "Shoot", "Move" и т. Д.
Еще одно приложение, похожее на это, - Terrarium. Разработчики могут кодировать животных и противопоставлять их другим в распределенной среде. Это было демонстрационное приложение.NET 1.1, и оно несколько устарело, но некоторые из них все еще могут быть вам полезны. Этот парень решил переписать его: http://weblogs.asp.net/bsimser/archive/2008/07/16/reintroducing-terrarium-now-with-2-0-goodness.aspx
Real Robocode скоро получит плагин для запуска роботов.NET. Мне потребовалось 2 года, чтобы достичь этого. Первый год потратил на рефакторинг оригинального Robocode. Второй на мосту Java к.NET. И есть альфа-биты. Этот подход имеет то преимущество, что вы можете бороться с лучшими роботами Java. На самом деле в роботах есть большое сокровище.