Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [VB .NET] Как получить структуру по её имени?  (Прочитано 10349 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Sacren
Гость
« : 11-04-2010 11:50 » 

Вводная.
Есть string'овый массив с названиями структур, требуется перебирать эти структуры в цикле.

Код:
    Private Sub generateCPlayer()
        Dim ctPlayer As player
        For i = 0 To cPlayers.Length
            ctPlayer = здесь должна передаваться структура по имени из string массива cPlayers
            If (uPlayer.Rating / ctPlayer.Rating) >= 0.9 And (uPlayer.Rating / ctPlayer.Rating) <= 1.1 Then
                cPlayer = ctPlayer
                cPlayer.updGold()
            End If
        Next
    End Sub

Теперь собственно вопрос.
Как получить структуру по её имени?

Хотя, мне приходят в голову альтернативные варианты, вроде того, чтобы сделать массив самих структур изначально, мне всё-таки хочется использовать вышеупомянутый способ для большей удобочитаемости моего быдлокода. =)

Спасибо за ответы.
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #1 : 11-04-2010 12:12 » 

Не очень понятно что ты имеешь в виду под "массив с названиями структур" и что ты хочешь присвоить... Поможет если ты добавишь определения этих структур..
Насколько я могу догадываться, у тебя есть что-то типа
Код:
Dim cPlayers() as String ={"player1", "player2", "player3"}
Structure player
    Public name as String
End Structure

Dim allPlayers(3) as player
...
allPlayers[0].name="player1"
allPlayers[1].name="player2"
allPlayers[2].name="player3"
Так?
И ты хочешь получить ctPlayer=allPlayers ?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Sacren
Гость
« Ответ #2 : 11-04-2010 12:21 » 

Неа. У меня вот:

Код:
Public cPlayers(5) As String

    Public Structure player
        Public Name As String

        Public Rating As Integer

        Public Health As Single
        Public Damage As Single
        Public Armor As Single

        Public Exp As Integer
        Public Gold As Integer

        Public GoldMin As Integer
        Public GoldMax As Integer

        Public RestAvailable As Boolean

        Friend Sub updRating()
            Rating = Health + Damage + Armor
        End Sub

        Friend Sub updGold()
            Gold = Rnd() * (GoldMax - GoldMin) + GoldMin
        End Sub
    End Structure

    '====Создаём "тела" игроков========================================
    Public uPlayer As player ' пользователь
    Public uPlayerMax As player ' пользователь (Максимальные значения статов)
    Public cPlayer As player ' ии (оппонент)

    '==образцы врагов====
    Public creatureWeakGoblin As player
    Public creatureWeakCobold As player
    Public creatureGoblin As player
    Public creatureCobold As player
    Public creatureGoblinWarrior As player
    Public creatureGoblinBerserk As player

    Private Sub firstInit()
        cPlayers(0) = "creatureWeakGoblin"
        cPlayers(1) = "creatureWeakCobold"
        cPlayers(2) = "creatureGoblin"
        cPlayers(3) = "creatureCobold"
        cPlayers(4) = "creatureGoblinWarrior"
        cPlayers(5) = "creatureGoblinBerserk"

        creatureWeakGoblin.Name = "Weak Goblin"
        creatureWeakGoblin.Health = 3
        creatureWeakGoblin.Damage = 2
        creatureWeakGoblin.Armor = 1
        creatureWeakGoblin.GoldMin = 0
        creatureWeakGoblin.GoldMax = 3
        creatureWeakGoblin.updGold()
        creatureWeakGoblin.updRating()

        creatureWeakCobold.Name = "Weak Cobold"
        creatureWeakCobold.Health = 3
        creatureWeakCobold.Damage = 1
        creatureWeakCobold.Armor = 2
        creatureWeakGoblin.GoldMin = 0
        creatureWeakGoblin.GoldMax = 3
        creatureWeakGoblin.updGold()
        creatureWeakCobold.updRating()

        creatureGoblin.Name = "Goblin"
        creatureGoblin.Health = 5
        creatureGoblin.Damage = 3
        creatureGoblin.Armor = 2
        creatureGoblin.GoldMin = 0
        creatureGoblin.GoldMax = 4
        creatureGoblin.updGold()
        creatureGoblin.updRating()

        creatureCobold.Name = "Cobold"
        creatureCobold.Health = 4
        creatureCobold.Damage = 2
        creatureCobold.Armor = 4
        creatureGoblin.GoldMin = 0
        creatureGoblin.GoldMax = 4
        creatureGoblin.updGold()
        creatureCobold.updRating()

        creatureGoblinWarrior.Name = "Goblin Warrior"
        creatureGoblinWarrior.Health = 9
        creatureGoblinWarrior.Damage = 5
        creatureGoblinWarrior.Armor = 2
        creatureGoblinWarrior.GoldMin = 1
        creatureGoblinWarrior.GoldMax = 5
        creatureGoblinWarrior.updGold()
        creatureGoblinWarrior.updRating()

        creatureGoblinWarrior.Name = "Goblin Berserk"
        creatureGoblinWarrior.Health = 16
        creatureGoblinWarrior.Damage = 8
        creatureGoblinWarrior.Armor = 0
        creatureGoblinWarrior.GoldMin = 2
        creatureGoblinWarrior.GoldMax = 7
        creatureGoblinWarrior.updGold()
        creatureGoblinWarrior.updRating()

        uPlayer.Name = "Unknown"
        uPlayer.Health = 10
        uPlayer.Damage = 2
        uPlayer.Armor = 2
        uPlayer.Exp = 0
        uPlayer.Gold = 0
        uPlayer.updRating()
        uPlayer.RestAvailable = True

        uPlayerMax = uPlayer

        cPlayer = creatureWeakGoblin
        Call updStats()
    End Sub

    '====Генерируем следующего оппонента ==============================
    '==его рейтинг не должен отличатся от рейтинга игрока на +/- 10%
    Private Sub generateCPlayer()
        Dim ctPlayer As player
        For i = 0 To cPlayers.Length
            ctPlayer = >>>>>>Вот здесь не знаю как сделать так, чтобы в ctplayer передавалась структура с названием из cPlayers<<<<<

            If (uPlayer.Rating / ctPlayer.Rating) >= 0.9 And (uPlayer.Rating / ctPlayer.Rating) <= 1.1 Then
                cPlayer = ctPlayer
                cPlayer.updGold()
            End If
        Next
    End Sub

То есть я хочу в цикле перебирать годных врагов и сопоставлять приблизительно похожего. А для этого требуется в структуру ctPlayer скопировать структуру, которая будет определена по названию.

Надеюсь, понятно объяснил С ума сойти...
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #3 : 11-04-2010 12:33 » 

Мдааа...
Вот это переделай однозначно:
Код:
    Public creatureWeakGoblin As player
    Public creatureWeakCobold As player
    Public creatureGoblin As player
    Public creatureCobold As player
    Public creatureGoblinWarrior As player
    Public creatureGoblinBerserk As player
Вместо этого создай уж тогда массив 'Public creatures(6) as player', поскольку у тебя все существа одного класса. Вводить отдельную переменную стоит лишь в том случае, если это будут разные классы - в случае наслдования, например, от базового класса.
Чтоб было красивее и правильнее - я бы сделал массив динамическим, а параметры монстров хранил, например, в отдельном XML-файле.. Тогда можно сократить размер кода раз в 6 и сделать поддержку неограниченного кол-ва монстров (ну, в смысле большого кол-ва Улыбаюсь )..
Ну а как перебирать массив - думаю, учить не надо? Улыбаюсь

Если же оставишь все как есть - придется постоянно писать костыли типа 'Select Case' и потом это все поддерживать.. Не делай так.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Sacren
Гость
« Ответ #4 : 11-04-2010 12:48 » 

Спасибо за совет. Видимо так и поступлю.

Только одно уточнение. Стоит ли заменить структуры классами? Насколько это целесообразно? Ведь в VB .NET они вроде имеют почти те же самые черты.
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #5 : 12-04-2010 06:13 » new

С точки зрени правильного ООП и инкапсуляции - классы всегда правильнее. Хотя, действительно, в общем-то это уже почти одно и то же.
Молодец что не сопротивляешься, а признаешь ошибки Улыбаюсь
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Sacren
Гость
« Ответ #6 : 12-04-2010 22:02 » 

Спасибо. Все вопросы пока сняты.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines