За последние 24 часа нас посетили 22544 программиста и 1015 роботов. Сейчас ищут 716 программистов ...

Ужасный алгоримт добавления и проверок вешей.

Тема в разделе "Решения, алгоритмы", создана пользователем engine.energy, 21 фев 2016.

  1. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    Я хотел делать при добавки массив из массива разбирали и если такой предмет есть то увеличиваем на нудно но если он достигает проедел ячейка 1 итема максимальный то ишем другой. Но если нету то добавляем новый. А после чего проверяют сколько я могу иметь слота если он превышает количество слотов предмета то ошибка.

    Я сделал так работает, но проблема том что если оба предмет не максимальный такого же типа то 1 предмет обновляет а 2 не обновляет остаток а создает новый и итог слот 3 веши. а ведь остаток если у 2 предмета хватит место то обновлять должен.

    $items - это который мы уже знает какие предметы есть в сумке.

    PS извини за русский. Ни как все правильно писать =)

    Код (PHP):
    1. public function getInventoryItems()
    2.     {
    3.         if (!$this->items AND $this->id > 0) {
    4.             $res = \Service::getPDO()->prepare("SELECT `account_items`.*, `items`.`name`, `items`.`icon`, `items`.`max_count`, `items`.`buy_money`, `items`.`sell_money` FROM `account_items` LEFT JOIN `items` ON `account_items`.`item_id` = `items`.`id` WHERE `account_id` = ?");
    5.             $res->execute([$this->id]);
    6.  
    7.             if ($items = $res->fetchAll()) {
    8.                 $this->items = $items;
    9.             }
    10.         }
    11.         return $this->items;
    12.     }
    13.  
    14.     public function addItemInventory($new_item)
    15.     {
    16.         $items = $this->getInventoryItems();
    17.         $update_items = array();
    18.  
    19.         foreach ($items AS &$item) {
    20.             if (!isset($new_item)) {
    21.                 break;
    22.             }
    23.  
    24.             if ($item['item_id'] == $new_item['item_id']) {
    25.                 $item_count = $item['max_count'] - $item['count'];
    26.                 $new_item_count = isset($new_item['count']) ? $new_item['count'] : 1;
    27.                 if ($item_count == 0) {
    28.                     continue;
    29.                 } else {
    30.                     if ($item_count < $new_item_count) {
    31.                         $item['count'] = $item['max_count'];
    32.                         $update_items[] = $item;
    33.                         $update_items[] = $items[] = [
    34.                             'item_id' => $new_item['item_id'],
    35.                             'count' => $new_item_count - $item_count
    36.                         ];
    37.                         unset($new_item);
    38.                     } else {
    39.                         $item['count'] += $new_item_count;
    40.                         $update_items[] = $item;
    41.                         unset($new_item);
    42.                     }
    43.                 }
    44.             }
    45.         }
    46.  
    47.         if (isset($new_item)) {
    48.             $update_items[] = $new_item;
    49.         }
    50.  
    51.         if ($this->inventory_slot >= count($items)) {
    52.             foreach ($update_items AS $update_item) {
    53.                 if (isset($update_item['id'])) {
    54.                     $res = Service::getPDO()->prepare("UPDATE `account_items` SET `count` = ? WHERE `account_id` = ? AND`id` = ? LIMIT 1");
    55.                     $res->execute([$update_item['count'], $this->id, $update_item['id']]);
    56.                 } else {
    57.                     $res = Service::getPDO()->prepare("INSERT INTO `account_items` (`account_id`, `item_id`, `count`) VALUES (?, ?, ?)");
    58.                     $res->execute([$this->id, $update_item['item_id'], $update_item['count']]);
    59.                 }
    60.             }
    61.             return true;
    62.         }
    63.  
    64.         return false;
    65.     }
    66.  
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    engine.energy, знаю, почему такой русский, но реально непонятно, чего тебе нужно. Приведи данные, которые на входе, и что хочешь получить на выходе в разных случаях. Без текстового описания
     
  3. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    mkramer, суть нужно отработать проверки слотов.

    Я получил веши "топор" x2 и "бумага" x5

    И начнет цикл на топор и бумага а может и другие....

    А в сумке есть у меня бумага их 2 штук не максимальный ячейка количество. то есть оба имеет по х7 штук.

    Вот и алгоритм нашел такой бумага и добавляет у 1 предмет +3 так как у бумага максимальынй ячейка имеет 10 штук. Значит осталось х2 бумага на 2 предмет итог 1 предмет бумаа стало 10 а 2 предмет стало 9. и добавили предмет топор новый так как в сумке нету его. Всего предметов стало 3 штук а сумке разрешено 5 слотов для предмета.


    Но у меня так не выходит, ТО есть 1 обновили 10 а 2 осталось попрежнему и добавили как новый бумага итог 3 бумага и 1 топор в слоте. так не должно..

    Добавлено спустя 5 минут 56 секунд:
    Простой пример массива

    Код (PHP):
    1. // id 1 = Это бумага
    2. // 1. Старт
    3. $items = array(
    4.     [
    5.         'id' => 1,
    6.         'count' => 7
    7.     ],
    8.     [
    9.         'id' => 1,
    10.         'count' => 7
    11.     ]
    12. );
    13.  
    14. // 2. Добавляю в сумку бумагу 5 шт.
    15.  
    16. $add_items = array(
    17.     [
    18.         'id' => 1,
    19.         'count' => 7
    20.     ]
    21. );
    22.  
    23.  
    24. // 3. Отработчик кода 
    25.  
    26. // 4. Итог (Должно быть!)
    27.  
    28. $items = array(
    29.     [
    30.         'id' => 1,
    31.         'count' => 10
    32.     ],
    33.     [
    34.         'id' => 1,
    35.         'count' => 9
    36.     ]
    37. );
    38.  
    39.  
    40. // 5. Итог (Так у меня сейчас так выходит!)
    41.  
    42. $items = array(
    43.     [
    44.         'id' => 1,
    45.         'count' => 10
    46.     ],
    47.     [
    48.         'id' => 1,
    49.         'count' => 7
    50.     ],
    51.     [
    52.         'id' => 1,
    53.         'count' => 2
    54.     ]
    55. );
    56.  
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    не понятно что не выходит. Три ифа не выходят?