Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 1
Регистрация: 30.07.2016
Сообщений: 122

Присваивание массива

22.11.2016, 17:24. Показов 2521. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Я новичок. Я пока учу переменные и массивы. Я люблю компьютерные игры и благодаря им я пытаюсь воссоздать некое подобие игры в коде C#. Начал с самого простого юнита его здоровья и урона. Вначале у меня получилось создать здоровье и урон. А потом мне понадобилось сделать так, чтобы юниты могли создаваться с уже готовыми характеристиками. Подскажите пожалуйста, как можно написать этот код по другому - более удобно чтоли:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
            Random random = new Random();
            
            const int baseIndex = 0;
            const int limitUnits = 10000000;
 
            int count = 0;
            int a = 0; // Счётчик
 
            int[] unit = new int[3]; // Количество характеристик у юнита.
            int[] health = new int[limitUnits]; // Индекс 0 отвечает за индекс этой характеристики у юнита. Индекс 1 отвечает за значение этой характеристики у юнита.
            int[] damage = new int[limitUnits];
            int[] unitsCount = new int[limitUnits];
 
            Console.WriteLine("==========");
 
            do
            {
                count++;
 
                unitsCount[baseIndex] = 0;
                unitsCount[count] = count;
 
                health[baseIndex] = 1; // Отвечает за индекс характеристики у юнита.
                health[count] = random.Next(2, 11) * 100; // Значение характеристики юнита.
 
                damage[baseIndex] = 2;
                damage[count] = random.Next(1, 11) * 10 + 100;
 
                unit[unitsCount[baseIndex]] = unitsCount[count];
                unit[health[baseIndex]] = health[count]; // Присваивание значения характеристики юнита.
                unit[damage[baseIndex]] = damage[count];
 
                Console.WriteLine();
                Console.WriteLine("Номер юнита = {0}", unit[unitsCount[baseIndex]]);
                Console.WriteLine("Здоровье юнита {0} = {1}", unit[unitsCount[baseIndex]], unit[health[baseIndex]]);
                Console.WriteLine("Урон юнита {0} = {1}", unit[unitsCount[baseIndex]], unit[damage[baseIndex]]);
                Console.WriteLine();
                Console.WriteLine("==========");
 
                a++;
 
            } while (Console.ReadKey().Key == ConsoleKey.Enter && a < unitsCount.Length - 1);
 
            Console.WriteLine("Юниты закончились!");
 
            Console.ReadKey();
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2016, 17:24
Ответы с готовыми решениями:

Присваивание одного массива другому
я понимаю, что вариантов, как это сделать масса. я уже много сгуглил и все ок. но меня интересует, почему у меня дико странно работает код:...

Присваивание строкам 2-мерного массива
Всем привет, есть массив двухмерный. Я его сортирую, Как мне присваивать целые строки , а не строку и ячейку, если пишу , к примеру massiv...

Рандомное присваивание элементу двумерного массива
Здравствуйте. Имеется двумерный массив (матрица). Как присвоить любому из элементов a конкретно число &quot;1&quot;? Такое: Random...

9
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
22.11.2016, 17:27
Native16, а можно спросить - на каком этапе изучения языка Вы остановились? Возможно этому способствует какая-то книга или возможно курсы?
1
0 / 0 / 1
Регистрация: 30.07.2016
Сообщений: 122
22.11.2016, 17:39  [ТС]
Цитата Сообщение от BozKurt Посмотреть сообщение
Native16, а можно спросить - на каком этапе изучения языка Вы остановились? Возможно этому способствует какая-то книга или возможно курсы?
Я не знаю как на это ответить, так как я занимаюсь самообучением. Я скачал очень много видео уроков по C#, а также сборники книг. Видео уроки дают многое и я усваивал всю информацию. Но так как я вообще ничего не знаю лишняя информация уводит меня от основ. Когда я понял это то полностью сосредоточился на базовых элементах программирования. Просто дальше идут удобства, насколько я понял. А как понять удобства, если не знаешь основ? В общем прости за эту воду. Я остановился на этапе переменных и массивов.

Добавлено через 7 минут
Я смотрю видео курсы ITVDN по C#.
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
22.11.2016, 17:44
почитай Шилдта, книга короткая, читается легко, там как раз нечто подобное рассматривается...вопросы отпадут сами собой
1
0 / 0 / 1
Регистрация: 30.07.2016
Сообщений: 122
22.11.2016, 17:52  [ТС]
Я хотел узнать, как подобный код можно записать с помощью перечисления и классов.
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
22.11.2016, 17:54
перепечатывать книгу, думаю, никто не захочет
1
0 / 0 / 1
Регистрация: 30.07.2016
Сообщений: 122
22.11.2016, 17:57  [ТС]
Цитата Сообщение от Diamante Посмотреть сообщение
перепечатывать книгу, думаю, никто не захочет
Мне было бы легче понять классы и перечисления исходя из моего кода. Ну ладно
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
22.11.2016, 19:05
Native16, извини, но судя по тому, как ты написал код, о классах ты знаешь только по наслышке.
Прочитай Шилдта, это действительно ОЧЕНЬ понятная книга, после которой вопросы основы (классы - это основа основ C#) отпадут сами собой.
1
22 / 21 / 11
Регистрация: 13.11.2016
Сообщений: 75
22.11.2016, 21:26
Лучший ответ Сообщение было отмечено Native16 как решение

Решение

Тебе не нужно использовать здесь массив он предназначен для другого. Тебе нужно создать класс для твоих юнитов примерно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    class MyUnit
    {
        private String name; // Закрытое свойство имя юнита (другой юнит и другие классы не могут
                             // изменять его напрямую)
        public String Name   // Акцессор - чтобы контролировать все обращения к свойству
        {
            set{name = value;}
            get{return name;}
        }
        
        private int health; // Закрытое свойство здоровье
        public int Health   // Акцессор - чтобы контролировать все обращения к свойству
        {
            set { health = value; }
            get { return health; }
        }
 
        private int attackPower; // Закрытое свойство сила атаки
        public int AttackPower   // Акцессор - чтобы контролировать все обращения к свойству
        {
            set { attackPower = value; }
            get { return attackPower; }
        }
 
        private bool isDeath; // Закрытое свойство признак смерти 
        public bool IsDeath   // Акцессор - чтобы контролировать все обращения к свойству
        {
            set { isDeath = value; }
            get { return isDeath; }
        }
 
 
        // Конструктор класса вызывается один раз для каждого экземпляра при создании нового юнита
        // с одним обязательным аргументом - Name и двумя аргументами по умолчанию
        // если при создании нового юнита их не указывать то они будут равны 100 и 5 соответственно. 
        public MyUnit(String Name, int Health = 100, int AttackPower = 5)
        {
            this.Name = Name;
            this.Health = Health;
            this.AttackPower = AttackPower;
            this.IsDeath = false;
 
            Console.Write("Появился юнит " + Name + " его здоровье: " + Health +" единиц а сила удара: " + AttackPower + " единиц\r\n");
 
        }
 
        // Открытый метод класса - нанести удар по цели которая должна принадлежать к классу MyUnit
        public void Hit(MyUnit Target)
        {
            if (!Target.IsDeath)
            {
                if (Health > 0)
                {
                    Console.Write("Юнит " + Name + " наносит удар по юниту " + Target.Name + "\r\n");
 
                    // Здесь вызывается метод принятого экземпляра, а аргументом является свойство
                    // этого экземпляра (this)
                    Target.MakeDamage(this.AttackPower); //this можно не писать это для наглядности
                }
                else
                {
                    Console.Write("Юнит " + Name + " не может наносить удары потому чо он погиб.\r\n");
                }
            }
        }
 
        // Открытый метод класса - получить урон
        public void MakeDamage(int DamagePower)
        {
            if (Health > 0)
            {
                if (DamagePower >= Health)
                {
                    Health = 0;
                    IsDeath = false;
                    Console.Write("Юнит " + Name + " получает смертельный урон.\r\n");
                }
                else
                {
                    Health = Health - DamagePower;
                    Console.Write("Юнит " + Name + " получает урон " + DamagePower.ToString() + " единиц.\r\n");
                    Console.Write("Юнит " + Name + " имеет " + Health + " единиц здоровья.\r\n");
                }
            }
        }
    }
}
После того как ты создашь свой класс ты сможешь создавать переменные с типом своего класса почти так же как создаёшь переменные простых типов, только будешь использовать ключевое слово new. И при этом ты получишь множество преимуществ по сравнению с тем подходом который ты используешь сейчас. Потому что весь код для работы с твоими юнитами будет сосредоточен в одном месте т.е. в одном классе. Это будет целостная структура кода. а не разрозненные операции над элементами массива. Код станет более управляем и более понятен даже тогда когда его объём вырастет во много раз, а так же новый подход не даст тебе сделать множество логических ошибок. Вот примерно так ты сможешь оперировать своими юнитами когда опишешь свой класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Теперь когда у тебя есть класс твоего юнита, то все действия становятся просты
            // безопасны и наглядны.
            MyUnit HumanSasha = new MyUnit("Sasha"); // вызывается конструктор класса MyUnit
                                                     // c умалчиваемыми параметрами.
                                                     // Саша типичный представитель своего класса
                                                     // так как я решл что чаше буду буду создавать
                                                     // именно людей, а реже более сильных существ.
            MyUnit Goblin****** = new MyUnit("******", 200, 40);
 
            HumanSasha.Hit(Goblin******); // Саша бьёт гоблина
            Goblin******.Hit(HumanSasha); // Гоблин бьёт Сашу
 
            HumanSasha.Hit(Goblin******); // Саша бьёт гоблина
            Goblin******.Hit(HumanSasha); // Гоблин бьёт Сашу
 
            HumanSasha.Hit(Goblin******); // Саша бьёт гоблина
            Goblin******.Hit(HumanSasha); // Гоблин бьёт Сашу
 
            HumanSasha.Hit(Goblin******); // Саша бьёт гоблина
            Goblin******.Hit(HumanSasha); // Гоблин бьёт Сашу
 
            Console.ReadKey();
        }
    }
}
Вложения
Тип файла: 7z ConsoleApplication1.7z (15.9 Кб, 5 просмотров)
1
0 / 0 / 1
Регистрация: 30.07.2016
Сообщений: 122
23.11.2016, 03:58  [ТС]
Padmasambhava, спасибо. Это и правда очень удобно! Я пойду учиться, а практику пока оставлю Главное понимание.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2016, 03:58
Помогаю со студенческими работами здесь

Присваивание значений элементам массива через пробел
Здравствуйте, решил попробовать порешать олимпиадные задачки на C# и столкнулся с небольшой проблемой. Нужно каждому элементу массива...

Присваивание всем элементам массива некоторого значения
Всем доброго дня. :) Полгода назад, когда я начинал ковыряться в C#, я вроде бы (может подводить память) где-то натыкался на какую-то...

Присваивание...
Здравстыуйте! вот фрагменты моего кода: private List&lt;FractionCillection&gt; TableStr = new List&lt;FractionCillection&gt;(); // (*) ...

Объекты, их присваивание
Читаю Троелсена, у него в примерах есть нечто подобное: Shape myShape = {new Hexagon(&quot;Имя шестиугольника&quot;), new Circle(&quot;Имя...

Присваивание объектов
У меня есть такой вопрос когда 2 объекта присваиваем,когда меняем один объект другой тоже меняется , но мне нужно что менялось только тот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru