За последние 24 часа нас посетили 23636 программистов и 1543 робота. Сейчас ищут 1005 программистов ...

Как разделить монету на разных типах?

Тема в разделе "PHP для новичков", создана пользователем engine.energy, 13 ноя 2015.

  1. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    У меня есть поле money у каждого игрока...

    А мне надо его превратив на 3 тип монету.

    Бронза
    Серебро
    Золото

    Когда у меня будет монета у игрока например 12902 то это будет 12 золото 90 серебро 2 бронза как то так выйдет.

    Не могу составить алгоритм. Не хочеться использовать 3 поля чтобы при покупки проверяли с 3 полями это много код. А 1 поле вполне хватит проверку если 100 монет стоит то купить если есть 100 монет это значит надо 1 серебра.
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    нужно просто знать внутренний курс.
    1 Золотая = 10 Серебрянных
    1 Серебрянная = 100 Бронзовых
    1 Бронзовая = 100 Рублей(внутриигровая валюта например)

    тогда будет очень легко вычислять сколько у игрока монет в любом эквиваленте. и конвертировать их при операций купли/продажи инвентаря, артефактов и т.д.

    и поле для хранения останется только одно.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ты волшебник, получается?
     
  4. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    А ты у нас умный да?! Помочь тема значит помогай а не бред-ответ постить в тему!

    Добавлено спустя 32 минуты 54 секунды:
    Вот набросал пример пока он работает! А оптимального нету еще проще?

    Код (PHP):
    1. function getGold() {
    2.         if(10000 > $this->money) {
    3.             return 0;
    4.         }
    5.  
    6.         return (int) substr($this->money, 0, -4);
    7.     }
    8.  
    9.     function getSilver() {
    10.         if(100 > $this->money) {
    11.             return 0;
    12.         }
    13.  
    14.         if(1000 > $this->money) {
    15.             return (int) substr($this->money, -4, 1);
    16.         }
    17.  
    18.         return (int) substr($this->money, -4, 2);
    19.     }
    20.  
    21.     function getBronze() {
    22.         if(100 > $this->money) {
    23.             return (int) $this->money;
    24.         }
    25.  
    26.         return (int) substr($this->money, -2);
    27.     } 
     
  5. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Код (PHP):
    1. header('Content-type: text/plain; charset=utf-8');
    2.  
    3. $money = 12902;//это будет 12 золото 90 серебро 2 бронза
    4. echo 'modey: ', $money, "\n";
    5. $gold = (int)($money / 1000); echo 'gold: ', $gold, "\n";
    6. $money = $money - $gold * 1000;
    7. $silver = (int)($money / 10); echo 'silver: ', $silver, "\n";
    8. $bronze = $money - $silver * 10; echo 'bronze: ', $bronze, "\n"; 
     
  6. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    YSandro, не правильно ведь! =)

    1 голд это требует 100 серебра
    1 серебра требует 100 бронза

    поэтому чуть поправил и уже лучше спасибо за помошь! =)

    Добавлено спустя 42 секунды:
    оставлю тут кому будет нужно если!

    Код (PHP):
    1. $money = 123456;
    2.  
    3.     $gold = (int)($money / 10000);
    4.     echo 'gold: ', $gold, "\n";
    5.  
    6.     $silver = (int)(($money - $gold * 10000) / 100);
    7.     echo 'silver: ', $silver, "\n";
    8.  
    9.     $bronze = ($money - $gold * 10000) - $silver * 100;
    10.     echo 'bronze: ', $bronze, "\n";
    11.  
     
  7. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ты написал
    мой пример так и выдает
    Код (Text):
    1. modey: 12902
    2. gold: 12
    3. silver: 90
    4. bronze: 2
     
  8. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    YSandro, но это значит что бронза не может набрать 10 до 99 его как бы пропадет =) поэтому я его поправил...

    Добавлено спустя 50 секунд:
    Вот так стало проше спс а то математик чета из меня стало плохо!

    Код (PHP):
    1.     public function getGold() {
    2.         return (int)($this->_money / 10000);
    3.     }
    4.  
    5.     public function getSilver() {
    6.         return (int)(($this->_money - $this->getGold() * 10000) / 100);
    7.     }
    8.  
    9.     public function getBronze() {
    10.         return ($this->_money - $this->getGold() * 10000) - ($this->getSilver() * 100);
    11.     }
    12.  
     
  9. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Кстати, имя getBronze() может ввести в заблуждение в будущем, т.к. читается, будто нужно узнать, сколько бронзы будет стоить 12345 уе, например.
     
  10. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    YSandro смысл блуждения? Сам класс получит каждый товар монету и сам выводит количество золото или серебро или бронзы!
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ответили ж в первом же ответе. Куда ж больше-то.

    Добавлено спустя 1 минуту 40 секунд:
    один метод сделай, который массив возвзращает.
     
  12. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    igordata, зачем массив?
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а зачем три метода?
     
  14. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    igordata, чтобы проверять условие если золото нет то скрываем и так далее!

    Добавлено спустя 22 секунды:
    если вернет 0 то условие не упустит а если массив то его пропустит так что!
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    так зачем их три
    если всё равно
    проверять три раза
    не проще ли вернуть сразу четыре значения: золото, серебро, медь и настоящее число
    ?
     
  16. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    настоящего не нужно! =) так как везде исползует простое число монет и класс разделители монет типов для показов =)