[Игра] Нужны знания - 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;
}
}
}