Ботва-онлайн

Игра конечно норм,но там нереально кланы делать,точнее создать моно но раскрутить никак ;(


Создать реально. не спорь.

Но вот раскрутить, хм.. а другую любую игру можно да?!?! Ты можеш к любой игре здесь написать что раскрутить невозможно.
 
Такой вот нубский вопрос. Делаю постраничный вывод к примеру сообщений, вот запрос
Код:
$sql = "SELECT * FROM `message` WHERE `to`='".$row['name']."' OR `to`='1' ORDER BY id_msg DESC LIMIT ".$begin.", ".$onpage;
Но в БД есть и другие игроки, так что получается на страницу вместо полагаемых 10 сообщений иногда выводит 4, 5. Так как разрыв между сообщениями игрока, в БД, бывает большой.
Так вот вопрос: Как можно это изменить, что б выводило 10 сообщений несмотря на то какой разрыв в БД.
Я так думаю тут дело в ЛИМИТЕ, но что заюзать вместо него или как исправить мозг отказывается понимать.
 
Не совсем понятно, что за разрыв или ты имеешь ввиду пустые сообщения ?
Как вариант можно выводить допустим 15-20 сообщений, загонять их в массив, и удалять пустые, а потом отображать 10 сообщений.
Или если ты имеешь ввиду большой промежуток времени между сообщениями и тебе надо вывести все сообщения игрока, то просто их упорядочиваешь по времени и выводишь последние 10, если проепал вспышку и не учел время, тогда сортируешь сообщения игрока по id, загоняешь в массив, и в цикле выводишь изменяя индексы.

З.Ы. Лимит есть лимит, он тут не причем. Вместо лимита хз, что можно предложить, как вариант загоняем все сообщения игрока в массив, упорядочиваем и циклом выводим 10, но вот что если этих сообщений 10000 или больше, нагрузка будет пестец.
 
Код:
$sql = "SELECT * FROM `message` WHERE `to`='".$row['name']."' OR `to`='1' ORDER BY id_msg DESC LIMIT ".$begin.", 10";
 
Мне в запросе не нравится одна вещь
Если какой то косяк то вот так:
$sql = "SELECT * FROM `message` WHERE `to`='1' ORDER BY id_msg DESC LIMIT ".$begin.", 10";
Думаю более грамотно запрос будет выглядеть вот так:
[/QUOTE]
$sql = "SELECT * FROM `message` WHERE (`to`='".$row['name']."' OR `to`='1') AND ORDER BY id_msg DESC LIMIT ".$begin.", 10";
В этом случае если row['name'] есть в БД, то запрос выполняется с лимитом и прочей куйней, если row['name'] нету то to=1 и запрос так же выполняется с лимитами и прочей куйней.
 
Рэй, order by и limit не относится к условию, это порядок сортировки результата выборки и значит and там не может быть
 
Спасибо за советы. Сам думал сделать с помощью массивов, но думал может еще что то посоветуют.
По поводу разрыва сообщений: в игре около 2000 сообщений, и в БД сообщения одного игрока могут быть в разных позицыях. Пример:
Бот1: 1 мессага
Бот1: 2 мессага
Бот4: 1 мессага
Бот4: 2 мессага
Бот4: 3 мессага
Бот4: 4 мессага
Бот4: 5 мессага
Бот4: 6 мессага
Бот1: 3 мессага
Как видно разрыв между сообщениями Бот1 составляет 6 сообщений Бот4.
 
Возможно нужно предоставить больше исходного кода, к примеру откуда берутся переменные $begin $onpage, ато экстросенсорные способности есть только у чуваков с канала ТНТ.
 
А причем тут разрывы?

Пример:
тебе надо вывести сообщения, которые прислали тебе(страница номер 5, вывод на страницу 10 сообщений):
Идем по этапно, что бы понять всю систему:
1. Вывод всех сообщений в таблице
Код:
SELECT * FROM `table`

2. Мы получим не отсортированный массив. Нам надо, что бы выводились сообщения отсортированные по дате в порядке убывания.
Код:
SELECT * FROM `table` ORDER BY `table`.`date` DESC

3. Мы получили все сообщения, которые есть в таблице, отсортированные в порядке убывания даты. Дальше мы выводим сообщения, которые прислали нам.
Код:
SELECT * FROM `table` WHERE `table`.`from`='наш_айди' ORDER BY `table`.`date` DESC

4. Мы получим массив, где сообщения отсортированы по дате и получателем являемся мы. Нам остается только вывести нужный диапазон сообщений. В данном примере это будут с 50 по 60 сообщения.
Код:
SELECT * FROM `table` WHERE `table`.`from`='наш_айди' ORDER BY `table`.`date` DESC LIMIT 50, 10

5. Вот так легко мы получили все сообщения, которые должны быть выведены на странице. Скажу про лимит 2 слова: 1 число - это номер сообщения с которого выводить, 2 число - кол-во записей которые надо вывести. Учти вывод начнется с 51 сообщения и по 60.

Вот в общем и все)
P.S. если в сообщениях отправитель и получатель хранятся в айдишниках(а не логинах), то разумно будет усложнить конструкцию запроса, что бы сразу получать информацию и об отправителе(если некоторые поля совпадают, то стоит сделать форматированный вывод):
Код:
SELECT * FROM (SELECT * FROM `table` WHERE `table`.`from`='наш_айди' ORDER BY `table`.`date` DESC LIMIT 50, 10) as message, `table2` as users WHERE message.`to`=users.`id`
 
Ошибку исправил, прост как в 99,9% случаях, ошибка была в неправильном создании запроса.
Около половины файлов переписал на классы, исправил запросы, теперь их меньше, но функционал тот же.
Думаю кости сделать простым способом: по паре костей у каждого игрока и после кидка подсчитывается количество выпавших очей, у кого больше - тот и выиграл.
По-поводу классов, так как я нуб, то сильно за них не пинать, я просто в определенном классе создал функции и в них вставил куски кода, которые были на страницах. Но немного изменил что б лучше смотрелось.
Так же для особо одаренных и для того что б не запутатся прокоментировал каждый файлик.
Как только допишу все классы и доделаю что обещал, сразу выложу скрипт.
 
Жека, а можешь сделать, чтобы при апгрейде дома, менялся внешний вид, как в Битфайте? :)
 
Жека, а можешь сделать, чтобы при апгрейде дома, менялся внешний вид, как в Битфайте? :)

Это легко, проще некуда.

)) но тогда я тоже закажу

Жека, а можешь сделать игры в таверне все как в Ботве.)) я себе их поставлю :)
 
Можно, найду картинки и сделаю
Жека, а можешь сделать игры в таверне все как в Ботве.)) я себе их поставлю :)
А вот тут проблемка, так как алгоритм победы в Костях я сделать не могу. Конешно можно, но он будет как минимум на 100 строк + громоздкий. Если кто то увидит алгоритм покера, то киньте мне ссылку на него и я сделаю в Ботве *wink*
 
А вот тут проблемка, так как алгоритм победы в Костях я сделать не могу. ....

Алгоритм вкостях проще простого.
Возьми кости из ИВ и готово. делов то.
 
Такие кости сделать легко, а кости что в Ботве другие. Там наподобии покера. Есть 5 костей и после каждого проска подсчитывается что выпало, варианты бывают такие:
Ботва Пять одинаковых граней [3] [3] [3] [3] [3]
Каре Четыре одинаковые грани [1] [3] [3] [3] [3]
Фулл Хаус Одна пара и одна тройка одинаковых граней [1] [1] [3] [3] [3]
Большой стрит Последовательность чисел на гранях от 2 до 6 [2] [3] [4] [5] [6]
Малый стрит Последовательность чисел на гранях от 1 до 5 [1] [2] [3] [4] [5]
Сет Три одинаковые грани [1] [2] [4] [4] [4]
Две пары Две пары одинаковых граней [1] [1] [3] [3] [5]
Одна пара Одна пара одинаковых граней [1] [1] [2] [3] [5]
Тут алгоритм намного сложнее.
З.Ы. Цыфры приведены приблизительные, на их месте может быть любая другая.
 
Такие кости сделать легко, а кости что в Ботве другие. Там наподобии покера. Есть 5 костей и после каждого проска подсчитывается что выпало, варианты бывают такие:

Тут алгоритм намного сложнее.
З.Ы. Цыфры приведены приблизительные, на их месте может быть любая другая.

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

Код:
<?

# забиваем массив из 5-ти элементов рэндом числами 1-6
for ($i = 1; $i < 6; $i++)
    {
    $array[$i] = rand(1,6);
    }

//$array[1] = 1; $array[2] = 1; $array[3] = 2; $array[4] = 3; $array[5] = 5;    
//$array[1] = 1; $array[2] = 1; $array[3] = 3; $array[4] = 3; $array[5] = 5;    
//$array[1] = 1; $array[2] = 2; $array[3] = 4; $array[4] = 4; $array[5] = 4;    
//$array[1] = 1; $array[2] = 2; $array[3] = 3; $array[4] = 4; $array[5] = 5;    
//$array[1] = 2; $array[2] = 3; $array[3] = 4; $array[4] = 5; $array[5] = 6;    
//$array[1] = 1; $array[2] = 1; $array[3] = 3; $array[4] = 3; $array[5] = 3;    
//$array[1] = 3; $array[2] = 3; $array[3] = 3; $array[4] = 3; $array[5] = 3;    

# смотрим результат
print_r($array); 
# визуально отделяем от следующих данных
breakline();
# считаем сколько каких чисел
$arrcount = array_count_values($array);
print_r($arrcount);
# визуально отделяем от следующих данных
breakline();
# нас не волнует сколько каких, делаем еще перерасчет на кол-во комбинаций
$arrcount = array_count_values($arrcount);
print_r($arrcount);
# визуально отделяем от следующих данных
breakline();
# выключатель цикла
$end = false; 
foreach($arrcount as $key => $val)
    {
    # проверяем выключатель
    if ($end) break; 
    # значение кей, это какая комбинация. значение вал, это сколько таких комбинаций
    switch($key)
        {
        # проверяем единичные случаи
        case 1: 
            # если 5 разных чисел
            if ($val == 5)
                {
                # считаем их сумму
                $sum = 0;
                for ($i = 1; $i < 6; $i++)
                    $sum = $sum + $array[$i];
                # проверяем сумму
                switch ($sum)
                    {
                    # если сумма 15, то это 1-5
                    case 15: echo "small street"; break;
                    # если сумма 20, то это 2-6
                    case 20: echo "large street"; break;
                    # или пройгрыш
                    default : echo "looser"; break;
                    }
                $end = true;
                }
            break;
        # есть пары
        case 2: 
            switch($val)
                {
                # если одна пара
                case 1: 
                    # проверяем есть ли тройка (косяк, не придумал как упростить запись $arrcount['3'])
                    if ($arrcount['3'] == 1) 
                        echo "full house"; 
                    # нету, значит одна пара
                    else 
                        echo "one pair"; 
                    break;
                # если 2 пары
                case 2: echo "two pairs"; break;
                }
            $end = true;
            break;
        # если тройка
        case 3: 
            echo "tree in a row"; 
            $end = true; 
            break;
        # если каре
        case 4: 
            echo "care"; 
            $end = true; 
            break;
        # если все одинаковые
        case 5: 
            echo "botva"; 
            $end = true; 
            break;
        }
    }

# просто так функция, чтоб визуально отделять принты
function breakline()
    {
    echo "<hr>";
    }
?>

потестируйте побольше. набросал на скорую руку, вроде всё правильно
 
Когда я закончил сценарий, Могу ли я оставить то же графика??
 
Как себя сделать администратором? И какие у администратора возможности
Заранее благодарю
 
Как себя сделать администратором? И какие у администратора возможности
Никаких, на том уровне развития админка была в бета-версии и я не выложил.
Сейчас скрипт игры был выкуплен, поэтому дальнейшее распространение скрипта невозможно.
 

Похожие темы

Сверху