Думаю система очень проста. У пользователей на сайте есть "Поинты". Хочется сделать мини-игру на удачу. Шанс 50% и возможность делать ставку. мне нужна только основа... проще говоря как реализовать: Посылаю значение 32 -> Вероятность 50% то что удвоится или обнулится > Результат
Количество всех действий и каждое действие пронумеровано: 1 - удвоится 2 - обнулится 3 - останется прежним 4 - примет значение х И пр. Теперь варианты 1 и 2 должны быть выбраны с вероятностью 50%, т.е с удвоенной по отношению к другим. Это можно сделать, как один из вариантов, случайным числом в интервале (общее кол-во действий) * 2, где в результате проверяется кратность. Это ОДИН ИЗ возможных вариантов, думай, как нравится. Но помни, что в конце всех вычислений для конечного варианта должна быть единица (100%)
1.В страничке выводим, количество поинтов, и форму с полем для ввода ставки. 2.при отправки, проверяем есть ли столько поинтов у пользователя, 3. если есть, то запускаем функцию которая вернёт или нуль или один, 4. ставим в условие возвращённое значение, если верно то удваиваем поинты и прибавляем к общему количеству поинтов. Как вариант: PHP: <?php if(isset($_GET['iframe'])){ if(isset($_POST['point'])){ $out=$_GET['iframe']-$_POST['point']; if($out<0)return; $out+=rand(0,1)?$_POST['point']*2:0; echo '<script type="text/javascript">parent.document.getElementById("output").innerHTML="'.$out.'"; parent.document.forma.action="index.php?iframe='.$out.'"; </script>';}} else{$point=100; echo '<HTML><head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>поиграем</title></head><BODY>'; echo "<b>у вас:<span id='output'>$point</span> очков.</b>"; echo'<form name="forma" action="index.php?iframe='.$point.'" target="hiddenframe" enctype="multipart/form-data" method="POST"> <b>Введите ставку </b><input type="text" name="point" value=""><br> <input type="submit" value="играем)"><br> </form><iframe name="hiddenframe" style="width:0px; height:0px; border:0px"></iframe> </BODY></HTML>';} ?> Переделал немного свой старый скрипт)
Вопрос а если я вот так заюзаю: PHP: // Сколько поинтов у игрока $mypoint = 1000; // Если поступил запрос с сданными из input point то продолжим if (isset($_POST['point'])) { // Добавляем в переменную значение из post point $stavka = $_POST['point']; // Проверяем на целые числа, если есть отрицательные или другие значения приостанавливаем... if ((int)$stavka <= 0 ){ echo "<font color=\"orange\"><b>Только целые числа</b></font>"; exit(); } // Проверяем хватает ли игроку поинтов.... if (($_POST['point']) >= $mypoint) { echo "<font color=\"orange\"><b>У тебя недостаточно поинтов</b></font>"; exit(); } // Если значение = 0 то выиграл (вероятность 50%) if (mt_rand(0, 1) == 0) { $rezultat = $stavka*2; echo "<font color=\"green\"><b>Выигрыш составил $rezultat поинтов!</b></font>"; // Если нет то отнимаем столько сколько поставил присвоив переменную результат } else { $rezultat = -$stavka; echo "<font color=\"red\"><b>Вы проиграли</b></font>"; } } else { // Форма отправки значения echo " <form name=\"game\" method=\"post\"> <input type=\"text\" value=\"Ваша ставка\" name=\"point\" onclick=\"this.value='';\"> <input type=\"submit\" value=\"Играть\" > </form> "; } если где криво написал скажите я только учусь)) Просто вероятность появления 0 или 1 будет = 50% в таком случае можно на основе этого писать мини-игру?
и вот еще вопрос в качестве проверки целых чисел подойдет ли: PHP: if ((int)$stavka <= 0 ){ echo "<font color=\"orange\"><b>Только целые числа</b></font>"; exit(); }
Строка 14 если игрок все поинты введёт?? Строка 17 нафиг сравнивать? Строка 22 ??? преобразовать из числового в инт: $stavka |=0;//при строке вернёт 0; проверить на тип инт: is_int ($stavka); P.S. А на счёт вашего примера проверти сами. $stavka="а вот хер знает чему"; if ((int)$stavka <= 0 ) echo "Ахринеть работает"; else echo"нихера не работает";
ох со строкой 17 никак не пойму =) там же генерирует 1 и 0, вот и сделал сравнение если 0 то выиграл если 1 то проиграл.. Разница есть? p.s мне кажется или 0 чаще выпадает) или мне просто везет? я уже в сайт вкрутил и с базой соединил, как бы работает но все же чаще 0 чем 1 =)
Просто нуль равно ложь, все остальные значения истина, просто если нуль то проиграл, а если один то выиграл и тогда скрипт проще достаточно: if(mt_rand(0, 1)) или как у тебя не меняя: if(!mt_rand(0, 1)) То есть у тебя тоже правильно, но как то неприлично смотрится))
советую использовать не rand(0,1), а хотя бы нечто if (rand(0,1000) > 500) do_somthing1; else do_something2; генератор в таком случае себя более адекватно ведет.
engager Тогда уж правильнее так: rand(1,1000) > 500 так как ваше rand(0,1000) генерирует 1001 значение.
Ребята подскажите почему не работает Код (Text): // Проверяем хватает ли игроку поинтов.... if (($stavka) >= $mypoint) { header("Location:../"); } И скрипт все равно выполняется?! Проверил через echo данные поступают к этим переменным.. Однако я могу ввести любое значение 99999 и он выполнится если у юзера всего 100 поинтов.. Значение ставки обрабатывается через Код (Text): $stavka = preg_replace("/[^0-9]/", "", $stavka1); Очень нужна ваша помощь.. Получилось не плохо на сайте, со списком самых везучих сортировка по рейтингам итд) народ заинтересовался но некоторые пользуются случаем и накручивают, отключил но возмущаются когда сделаю)) ---------------------------------------------------------------- А вот сами блоки с кодом полностью: (я знаю многое сделано оч глупо, но однако я только учусь делаем на это скидку, принимаю строгие замечания)) PHP: <div id="stage" <?php if (isset($_POST['point'])) { } else { echo "style='display: none;'";}?> > <? $userpointid = $this->translate('%1$s', $this->viewer()->getIdentity()); $sqlstat = mysql_query("SELECT win, fuu FROM engine4_semods_userpoints WHERE userpoints_user_id='$userpointid'"); $rowstat = mysql_fetch_array($sqlstat); ?> <?php echo ' <style> .win { border: 1px solid green; color: green; padding: 6px; width: 160px } .fu { border: 1px solid red; color: red; padding: 6px; width: 160px } .butwite { background: #fff; border:solid 1px #79b4d4; color: #007cbc; font-size:11px; height: 25px; padding: 5px 5px 5px 5px; margin-top: 5px; font-weight: bold; } </style> '; // Сколько поинтов у игрока $mypoint = $this->user_points; // Если поступил запрос то продолжим if (isset($_POST['point'])) { // Добавляем в переменную значение из post point $stavka1 = $_POST['point']; // Замена на целое число $stavka = preg_replace("/[^0-9]/", "", $stavka1); // Проверяем на целые числа, если есть отрицательные или другие значения приостанавливаем... if ($stavka <= 0) { header("Location:../"); } // Проверяем хватает ли игроку поинтов.... if (($stavka) >= $mypoint) { header("Location:../"); } // Максимум ставка.... if (($_POST['point']) >= 151) { header("Location:../"); } // Если значение = 0 то выйграл (вероятность 50%) if (mt_rand(0, 1) == 0) { $rezultat = $stavka*2; $sql2 = mysql_query("UPDATE `engine4_semods_userpoints` SET userpoints_count=userpoints_count+'$rezultat', userpoints_totalearned=userpoints_totalearned+'$rezultat', win=win+'1' WHERE `userpoints_user_id`='$userpointid' LIMIT 1 ;"); echo "<div class='win'><b>Получено $rezultat поинтов!</b></div>"; // Если нет то отнимаем столько сколько поставил присвоив переменную результат } else { $rezultat = $stavka*2; $sql2 = mysql_query("UPDATE `engine4_semods_userpoints` SET userpoints_count=userpoints_count-'$rezultat', userpoints_totalearned=userpoints_totalearned-'$rezultat', fuu=fuu+'1' WHERE `userpoints_user_id`='$userpointid' LIMIT 1 ;"); echo "<div class='fu'><b>Проиграно $rezultat поинтов.</b></div>"; }} // Форма отправки значения echo " <b>Ваша ставка:</b><br> <form name=\"game\" method=\"post\" action=\"\"> <input type=\"text\" value=\"Осталось $mypoint поинтов\" name=\"point\" onclick=\"this.value='';\"> <input type=\"submit\" value=\"Мне повезет!\" class=\"butwite\" > </form><br> <font style=\"font-size:11px;\"><font color=\"red\">*</font> Максимум ставка 150 поинтов</font><br> <font style=\"font-size:11px;\"><font color=\"red\">*</font> Шанс 50% - X2</font> "; ?> <br> <i>Побед: <? echo $rowstat['win']; ?></i> <font color="grey"> | </font> <i>Поражений: <? echo $rowstat['fuu']; ?></i> </div><br> <div id="popular" style='display: none;'> <center><b>Список самых везучих</b></center><hr style='padding-top: 7px;border-bottom:dashed 1px #CECECE;'> <table width="100%"> <tbody> <tr> <td style='border-bottom:dashed 1px #CECECE;'><b>Имя</b></td> <td width='5'></td> <td style='color: green; border-bottom:dashed 1px #CECECE;' align='right'><b>В</b></td> <td width='5'></td> <td style='color: red; border-bottom:dashed 1px #CECECE;' align='right'><b>П</b></td> </tr> </tbody> <? $query = "SELECT userpoints_user_id, win, fuu FROM `engine4_semods_userpoints` ORDER BY win DESC LIMIT 10"; $res = mysql_query($query); while($row = mysql_fetch_array($res)) { $named = mysql_query ("SELECT user_id, username, displayname FROM `engine4_users` WHERE user_id='".$row['userpoints_user_id']."'"); $rownamed = mysql_fetch_array($named); echo " <tbody> <tr> <td style='border-bottom:dashed 1px #CECECE;'><a href='http://live.tomsk.ru/profile/".$rownamed['username']."' title='".$rownamed['displayname']."'>".$rownamed['displayname']."</a></td> <td width='5'></td> <td style='border-bottom:dashed 1px #CECECE;' align='right'><b>".$row['win']."</b></td> <td width='5'></td> <td style='border-bottom:dashed 1px #CECECE;' align='right'><b>".$row['fuu']."</b></td> </tr> </tbody>\n "; } ?> </table> <font style='font-size:11px;'><b style='color: green;'>В</b> - выигрыш</font><br> <font style='font-size:11px;'><b style='color: red;'>П</b> - проигрыш</font> <hr style='padding-top: 7px;border-bottom:dashed 1px #CECECE;'> </div>
PHP: if (($stavka) >= $mypoint) { header("Location:../"); exit; } exit надо ставить, что бы не выполнялся дальше
Я же в прошлый раз говорил Зачем там равно? Или это сделано чтобы игрок никогда не мог все поинты проиграть?
И еще помогите составить запрос правильно чтобы выводились самые везучие.. В смысле не по числу выигрышей как уже стоит а по соотношению побед и поражений. т.е человек у которого 22 победы и 34 поражения хуже чем 20 побед и 22 поражения... Спасибо вам
[sql]SELECT *, win / fuu AS result FROM `engine4_semods_userpoints` ORDER BY result DESC LIMIT 10[/sql] Тоже не в счет, к примеру тот у кого 5 игр 4 побед и 1 поражение попадает на 1 место.. помогите грамотно построить запрос