[Игра] Нужны знания - C#
Формулировка задачи:
Здравствуйте! У меня появилась мысль сделать игру. В интернете я
нашёл информацию о разных платформах, на которых её можно сделать. Я выбрал C#. Так как я вообще не имею знаний и навыков о программировании, то я скачал несколько уроков, чтобы разобраться в нём. В данный момент я изучаю
. Как мне кажется, то это то, что нужно мне. Вообще я хотел бы задать несколько вопросов о том, что можно реализовать на C#, а что нельзя. Я расскажу несколько слов о своей будущей игре.
Стартовый аналог я сделал в редакторе игры StarCraft 2. Там у меня морпех находится в квадрате 10*10 клеток и перемещается и поворачивается с помощью стрелочек на клавиатуре. Есть враг, с которым морпех сражается по моей системе боя, которая отличается от стандартной и она реализована на триггерах-переменных. Но я столкнулся с рядом ограничений и собственных незнаний о программировании, поэтому я решил обратиться к профессионалам вроде вас.
1. Это 2D игра видом сверху. Мне нужно сделать линию х100*y1 квадратов. Игрок сможет иметь видимую зону 10*1 квадратов.
2. Юнит также будет в виде квадрата. Герой синим цветом, а враг - красным. Само поле серого цвета.
3. При создании поля 100*1 все потенциальные объекты уже будут созданы, но не показаны в видимой зоне. То есть, если в квадрате х10 - трава, а в х11 - камень, то игрок камень не увидит, пока не сдвинется на шаг вперёд. Скажите такое можно реализовать?
4. Система сражения. Юнит1 имеет переменные Юнит1Здоровье, Атака, и Урон. И враг тоже самое, только с приставкой Юнит2. Я смог
реализовать между этими переменными взаимодействие, чтобы вычислять, кто и сколько нанёс урона. Система такова:
Когда юниты сближаются:
Юнит1Атака = Случайное число от 1 до 100. Если Число равно от 1 до 50, то Юнит1 попадает, иначе промах.
Если попадает, то Юнит2Здоровье = Юнит2Здоровье - Юнит1Урон.
Но я подумал, что нужно сделать так, чтобы не писать систему боя для каждого юнита с кажым, так как я просто напросто рехнусь от такого количества комбинаций. Вот я и подумал, как же мне сделать так, чтобы некий юнит15891 имел все необходимые параметры и чтобы они(параметры) могли применяться к юниту1, или даже тоже к другому рандомному юниту96182 со своими характеристиками здоровья и урона. Как организовать такую связь я не нашёл.
На этом всё, так как это основные, для меня, вопросы. Я хотел бы услышать от вас ответы, можно ли такое сделать на C#.
Решение задачи: «[Игра] Нужны знания»
textual
Листинг программы
using System; using System.Collections.Generic; namespace Batle { public delegate int AttackCallback(int armorClass); class Program { static void Main(string[] args) { var units = new ActionUnits(); var valera = units.Valera(); var opponents = units.Units(); HeroFighter heroFight = new HeroFighter() { MaxDamage = valera.Damage, HeroLVL = valera.LVL, }; for (int i = 0; i < opponents.Count; i++) { Battle.BattleBegin(i, valera, opponents[i]); for (; opponents[i].HitPoints > 0;) { var heal = opponents[i].HitPoints; Battle.Attack(valera, opponents[i], heroFight.BatleArm); Console.WriteLine("Герой {0}, нанес {1} {2} урона" , valera.Name, opponents[i].Name, heal - opponents[i].HitPoints); } Console.WriteLine("Герой победил\n"); } Console.ReadKey(); } } public class Hero : Unit { public int Exp { get; set; } public int LVL { get; set; } public int Damage { get; set; } } public class Unit { public string Name { get; set; } public int ArmorClass { get; set; } public int HitPoints { get; set; } } public class ActionUnits { public Hero Valera() { return new Hero { Name = "Valera", ArmorClass = 5, HitPoints = 25, Exp = 0, LVL = 1, Damage = 1, }; } public List<Unit> Units() { var units = new List<Unit>(); for (int i = 0; i < 10; i++) { units.Add(new Unit { Name = string.Format("{0}{1}", "Unit", i), ArmorClass = (0.1 * i < 5) ? 5 : (int)(0.1 * i), HitPoints = (0.25 * i < 10) ? 10 : (int)(0.25 * i), }); } return units; } } public class Battle { public static void BattleBegin(int i, Hero hero, Unit unit) { Console.WriteLine("=========="); Console.WriteLine("Batle {0}:", i); Console.WriteLine("=========="); Console.WriteLine("Герой {0} вступает в бой с {1}\n", hero.Name, unit.Name); } public static void Attack(Hero hero, Unit unit, AttackCallback attack) { unit.HitPoints -= attack(unit.ArmorClass); } } public class HeroFighter { Random rnd = new Random(); public int MaxDamage { get; set; } public int HeroLVL { get; set; } public int BatleArm(int armorClass) { var roll = rnd.Next(1, 101); var damage = 0; if (roll > 50) damage = rnd.Next(0, MaxDamage + 1) + (int)(HeroLVL * 0.11) - (int)(armorClass * 0.07); return damage; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д