4 / 4 / 0
Регистрация: 18.07.2012
Сообщений: 32
1

Написать игру. Опишите классы (Мечник), (Лучник), (Маг), каждый из которых является экземпляром базового абстрактного класса

28.08.2012, 10:03. Показов 3395. Ответов 9
Метки нет (Все метки)

Добрый день, привет всем! Помогите пожалуйста решить задание:

Опишите классы "Swordsman" (Мечник), "Archer" (Лучник) и "Mage" (Маг), каждый из которых является экземпляром базового абстрактного класса "Unit" (штука, элемент) в компьютерной игре, и может атаковать, уклоняться от атак и умирать. Эти методы должны быть чистыми виртуальным функциями.

В мечника 15 хит-поинтов (жизней), повреждения при атаке 5, шанс уклоняться 60%.
Лучник: 12 hp, 4 dmg, 40% dodge
Маг: 8 hp, 10 dmg, 30% dodge

В main () создайте два массива (враждующие стороны) по три юнита в каждом, причем тип юнита (мечник, лучник или маг) имеет задаваться случайно, при заполнении этих массивов. То есть один раз запустив вашу программу, может создаться три лучники против мечника и двух магов, другой - лучник, мечник и маг против двух мечников и лучника и т.д.

Далее в цикле земулюйте бой между ними, пока бойцы одной из сторон все не погибнут. В консоль при этом выводите сообщение кто кого атаковал, или удалась атака, сколько жизни осталось у жертвы или она погибла. Пусть бой происходит постепенно, по нажатии клавиши spacebar (пробела), чтобы мы могли наблюдать его атака за атакой.

В конце боя объявите, какая команда победила (первая / вторая, синяя / красная, альянс / орки - как уже ваша фанатзия вам подскажет).

Внимание! Реализуйте также возможность, чтобы каждый боец ​​(Воин, Лучник или Маг) выискивал среди врагов соперника своего типа и атаковал его. Скажем, если есть команды:
A11 - M21
A12 - S22
S13 - A23
... То А11 должен выбрать своей целью А23.

Если врагов своего типа не найдено, пусть генерируется сообщение об ошибке и бойцы атакуют по старым правилам.

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Game
{
    class Program
    {
        static void Main(string[] args)
        {
            Unit arrUnit = new Swordsman();
            arrUnit = new Archer(arrUnit);
 
            Console.WriteLine(arrUnit.getDescription() + "\nAttack = " + arrUnit.setAttack()
                + ". Defence = " + arrUnit.setDefence() + ". Hitpoints = " + arrUnit.setHitpoints());
            Console.WriteLine("\n..::VS::..\n");
            Unit merlin = new Mage();
            Console.WriteLine(merlin.getDescription() + "\nAttack = " + merlin.setAttack()
                + ". Defence = " + merlin.setDefence() + ". Hitpoints = " + merlin.setHitpoints());
        }
    }
 
    public abstract class Unit
    {
        public Swordsman[] SwordsmanArray;
        public string hero = "";
 
        public abstract int setAttack();
        public abstract int setDefence();
        public abstract int setHitpoints();
 
        internal string getDescription()
        {
            return hero;
        }
 
 
    }
 
    public class Swordsman : Unit
    {
        public Swordsman()
        {
            hero = "Ranger - critical hit range unit";
        }
 
        override public int setAttack() 
        {
            return 5;
        }
        override public int setDefence()
        {
            return 60;
        }
        override public int setHitpoints()
        {
            return 15;
        }
    }
 
    public class Archer : Unit
    {
        Unit charaster;
 
        public Archer(Unit charaster)
        {
            this.charaster = charaster;
            hero = "Archer - powerful then the bang";
        }
 
        public string getDescription()
        {
            return charaster.getDescription() + ", BowOfGod";
        }
 
        override public int setAttack()
        {
            return 14 + charaster.setAttack();
        }
        override public int setDefence()
        {
            return 40 + charaster.setDefence();
        }
        override public int setHitpoints()
        {
            return 12 + charaster.setHitpoints();
        }
    }
 
    public class Mage : Unit
    {
        public Mage()
        {
            hero = "Mage - powerfull spelcaster";
        }
 
        override public int setAttack()
        {
            return 8;
        }
        override public int setDefence()
        {
            return 30;
        }
        override public int setHitpoints()
        {
            return 10;
        }
    }
 
 
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2012, 10:03
Ответы с готовыми решениями:

Опишите классы (Мечник), (Лучник), (Маг)
Добрый день! Помогите пожалуйста решить задание: ((НА С++)) Опишите классы "Swordsman" (Мечник),...

Как обратиться из конструктора базового абстрактного класса к свойству-массиву класса наследника
Добрый день. Подскажите как обратиться из конструктора базового абстрактного класса к...

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей...

Функция абстрактного базового класса
Есть абстрактный класс, пусть его зовут A, а у него есть 4 потомка, пусть их зовут: B, C, D и F....

9
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.08.2012, 10:20 2
какого хрена делает в абстрактном классе массив наследников?о_0
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstract class Unit
    {
        public Swordsman[] SwordsmanArray;
        public string hero = "";
 
        public abstract int setAttack();
        public abstract int setDefence();
        public abstract int setHitpoints();
 
        internal string getDescription()
        {
            return hero;
        } 
    }
1
4 / 4 / 0
Регистрация: 18.07.2012
Сообщений: 32
28.08.2012, 10:27  [ТС] 3
Psilon, Ошибся наверное.
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
28.08.2012, 14:06 4
видимо как то так хотя я уверен есть более короткие способы

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
 
namespace Game
{
    class Program
    {
        static void Main(string[] args)
        {
            Game game = new Game(true, false);
            while (!game.GameOver)
                game.Next();
        }
    }
    class Game
    {
        Command[] commands;
        int Step;
        public bool GameOver
        {
            get
            {
                if (!commands[0].IsAlive)
                {
                    Congratulations(1);
                    return true;
                }
                if (!commands[1].IsAlive)
                {
                    Congratulations(0);
                    return true;
                }
                return false;
            }
        }
        public void Congratulations(int command)
        {
            Console.WriteLine("Congratulations command {0} win!\nList of heroes:", command+1);
            foreach (Unit unit in commands[command].units)
                Console.WriteLine(unit.getDescription());
        }
        public Game(bool duel1, bool duel2, int initialStep=0, int quantity1 = 3, int quantity2 = 3)
        {
            Step = initialStep;
            commands = new Command[2];
            commands[0] = new Command(duel1, quantity1);
            commands[1] = new Command(duel2, quantity2);
        }
        public void Next()
        {
            Console.WriteLine("Step: " + Step);
            var r = new RNGCryptoServiceProvider();
            byte[] data = new byte[1];
            Console.WriteLine("Command {0} attacks:", (Step % 2) +1);
            foreach (Unit unit in commands[Step % 2].units)
                if (unit.IsAlive)
                {
                    var availibleTargets = new List<Unit>();
                    if (commands[Step % 2].duel)
                    {
                        foreach (Unit enemy in commands[(Step + 1) % 2].units)
                        {
                            if (enemy.type == unit.type&&enemy.IsAlive)
                                availibleTargets.Add(enemy);
                        }
                        if (availibleTargets.Count==0)
                            Console.WriteLine("{0} can't attack primary target", unit.hero);
                    }
                    if (availibleTargets.Count==0)
                    {
                        foreach (Unit enemy in commands[(Step + 1) % 2].units)
                            if (enemy.IsAlive)
                                availibleTargets.Add(enemy);
                    }
                    if (availibleTargets.Count == 0)
                        break;
                    r.GetBytes(data);
                    unit.Attack(availibleTargets[data[0]%availibleTargets.Count]);
 
                }
            Step++;
            
        }
        private class Command
        {
            public Unit[] units { get; set; }
            public bool duel { get; set; }
            public Command(bool duel, int quantity)
            {
                this.duel = duel;
                byte[] data = new byte[1];
                var r = new RNGCryptoServiceProvider();
                r.GetBytes(data);
                units = new Unit[quantity];
                for (int i = 0; i < quantity; i++)
                {
                    r.GetBytes(data);
                    int q = data[0] % 3;
                    switch (q)
                    {
                        case 0:
                            units[i] = new Swordsman();
                            break;
                        case 1:
                            units[i] = new Archer();
                            break;
                        case 2:
                            units[i] = new Mage();
                            break;
                    }
                }
            }
            public bool IsAlive
            {
                get
                {
                    foreach (Unit unit in units)
                        if (unit.IsAlive)
                            return true;
                    return false;
                }
            }
        }
 
        private abstract class Unit
        {
            public virtual string hero { get; set; }
            public virtual int attack { get; set; }
            public virtual int dodge { get; set; }
            public virtual int hitpoints { get; set; }
            public enum UnitType
            {
                Swordsman,
                Archer,
                Mage
            }
            public virtual UnitType type { get; set; }
 
            public virtual void Attack(Unit target)
            {
                byte[] data = new byte[1];
                var r = new RNGCryptoServiceProvider();
                r.GetBytes(data);
                int q = data[0] % 100;
                if (q < target.dodge)
                    Console.WriteLine("{0} trying attack {1} but he dodged this swing", hero, target.hero);
                else
                {
                    Console.WriteLine("{0} attack {1} by {2} damage", hero, target.hero, attack);
                    target.hitpoints -= attack;
                    if (target.hitpoints <= 0)
                        Console.WriteLine("{0} dying", target.hero);
                }
            }
            public virtual string getDescription()
            {
                string hp = (hitpoints <= 0) ? "Dead :(" : "Hitpoints: " + hitpoints.ToString();
                return hero + "\n" + hp;
            }
            public virtual bool IsAlive
            {
                get
                {
                    return hitpoints > 0;
                }
            }
 
 
        }
 
        private class Swordsman : Unit
        {
            public Swordsman()
            {
                hero = "Swordsman - melee unit";
                attack = 5;
                dodge = 60;
                hitpoints = 15;
                type = UnitType.Swordsman;
            }
        }
 
        private class Archer : Unit
        {
            public Archer()
            {
                hero = "Archer - powerful then the bang";
                attack = 4;
                dodge = 40;
                hitpoints = 12;
                type = UnitType.Archer;
            }
        }
 
        private class Mage : Unit
        {
            public Mage()
            {
                hero = "Mage - powerfull spellcaster";
                attack = 10;
                dodge = 30;
                hitpoints = 8;
                type = UnitType.Mage;
            }
        }
    }
    
}
1
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.08.2012, 14:33 5
Вот, я тут примерно набросал, код main
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
using System;
using System.Collections.Generic;
 
namespace ConsoleWars
{
    class Program
    {
        static void Main()
        {
            const int n = 3;
            var team1 = new Unit[n];
            for (int i = 0; i < n; i++)
                team1[i] = new Mage();
            var team2 = new Unit[n];
            for (int i = 0; i < n; i++)
                team2[i] = new Mage();
            while (CheckTeam(team1) && CheckTeam(team2))
            {
                for (int i = 0; i < n; i++)
                {
                    //Ход бойца первой команды
                    int index;
                    bool result = team1[i].Attack(team2, out index);
                    if (index > 0 && index <= n)
                    {
                        Console.Write("{0} боец команды I ударил {1} бойца команды II", i + 1, index);
                        Console.Write(result ? ", нанеся {0} урона, " : " и промахнулся", team1[i].Damage);
                        Console.WriteLine(team2[index - 1].Dead ? "и убил его" : ". У него осталось {0} жизней",
                                          team2[index - 1].HitPoints);
                    }
                    //Ход бойца второй команды
                    result = team2[i].Attack(team1, out index);
                    if (index <= 0 || index > n) continue;
                    Console.Write("{0} боец команды II ударил {1} бойца команды I", i + 1, index);
                    Console.Write(result ? ", нанеся {0} урона, " : " и промахнулся", team2[i].Damage);
                    Console.WriteLine(team1[index - 1].Dead ? "и убил его" : ". У него осталось {0} жизней",
                                      team1[index - 1].HitPoints);
                }
                int alive1 = 0, alive2 = 0;
                foreach (var unit in team1)
                    if (!unit.Dead)
                        alive1++;
                foreach (var unit in team2)
                    if (!unit.Dead)
                        alive2++;
                Console.WriteLine("\nХод закончен");
                Console.WriteLine("В команде №1 {0} выживших. В команде № 2 {1} выживших",alive1,alive2);
            } 
            int winner = CheckTeam(team1) ? 1 : 2;
            Console.WriteLine("Все бойцы команды {0} умерли. Победила команда {1}", 3 - winner, winner);
            Console.ReadKey();
        }
        static bool CheckTeam(IEnumerable<Unit> team)
        {
            bool result = true;
            foreach (var unit in team)
                result &= unit.Dead;
            return !result;
        }
    }
}
Код Unit.cs
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
using System;
 
namespace ConsoleWars
{
    internal abstract class Unit
    {
        public int HitPoints { get; protected set; }
        public int Damage { get; protected set; }
        public double Evasion { get; protected set; }
        public bool Dead { get; protected set; }
        protected static readonly Random TeamRandom = new Random(); //Статический для того, чтобы на всю команду был один рандом
 
 
        protected abstract bool Evade();
        protected abstract void Die();
        public abstract bool Attacked(int damage);
        public abstract bool Attack(Unit[] enemies, out int i);
    }
 
    internal class Mage : Unit
    {
        private const int HP = 8;
        private const int DMG = 10;
        private const double EVA = 0.3;
        
 
        public Mage()
        {
            HitPoints = HP;
            Damage = DMG;
            Evasion = EVA;
        }
 
 
        public override bool Attack(Unit[] enemies, out int i)
        {
            i = 0;
            if (Dead) return false; //Если умерли, ничего не делаем
            foreach (var other in enemies) //Если есть враг нашего типа, то бьем его
            {
                i++;
                if (other is Mage && !other.Dead)
                    return other.Attacked(Damage);
            }
            do
            {
                i = TeamRandom.Next(enemies.Length);
            } while (!enemies[i].Dead);
            return enemies[i].Attacked(Damage); //Иначе бьем случайного врага
        }
 
        public override bool Attacked(int damage)
        {
            if (Dead || Evade())
                return false; //Если увернулись, то не деремся. Умерший считается всегда уворачивающимся
            HitPoints -= damage;
            if (HitPoints <= 0)
                Die();
            return true;
        }
 
        protected override bool Evade()
        {
            var x = TeamRandom.NextDouble();
            return x < Evasion;
        }
 
        protected override void Die()
        {
            Dead = true;
        }
    }
}
сам проект ниже. Глюков и быдлокода (ходы команд так и плачут по отдельной функции) хватает, но сам класс написан более-менее грамотно, и все работает.
Вложения
Тип файла: rar ConsoleWars.rar (37.8 Кб, 50 просмотров)
2
4 / 4 / 0
Регистрация: 18.07.2012
Сообщений: 32
28.08.2012, 17:26  [ТС] 6
Psilon, Спасибо Вам большое!!! Проект очень классный и все работает!
0
29 / 27 / 4
Регистрация: 16.11.2011
Сообщений: 147
31.08.2012, 00:10 7
"3 боец команды I ударил 1 бойца команды II и промахнулсяи убил его" заметил такой вот баг)
0
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
31.08.2012, 00:42 8
AvtoCrack, если так хочется посмотреть, создайте консолькое приложение и скопируйте туда. Тут ничего нет от .Net 4.5 , я версию не меняю только потому, что проект и так откроется только в 12 студии. ДА и играть там не во что. И глюков хватает

Добавлено через 26 минут
"3 боец команды I ударил 1 бойца команды II и промахнулсяи убил его" заметил такой вот баг)
да я замечал, забавно
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
31.08.2012, 09:05 9
Цитата Сообщение от Psilon Посмотреть сообщение
AvtoCrack, если так хочется посмотреть, создайте консолькое приложение и скопируйте туда. Тут ничего нет от .Net 4.5 , я версию не меняю только потому, что проект и так откроется только в 12 студии. ДА и играть там не во что. И глюков хватает
в моем варианте вроде глюков не заметил глянешь а то мож я слепой?)
0
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
31.08.2012, 13:48 10
Tessen, там плавающий баг
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2012, 13:48
Помогаю со студенческими работами здесь

Вызов конструктора абстрактного базового класса
Здравствуйте, в классе вызываю с помощью super() конструктор абстрактного базового класса -...

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

Реализовать абстрактные функции-члены абстрактного базового класса в производных классах
1. Определить иерархию классов 2. Определить и построить абстрактный класс, который содержит:...

DataMember: При наследовании от абстрактного класса передаются только поля базового типа
При наследовании от абстрактного класса передаются только поля базового типа, а не наследника. Код:...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru