За последние 24 часа нас посетили 52377 программистов и 1756 роботов. Сейчас ищут 1109 программистов ...

помогите написать простой скрипт (мини-игры) на вероятность

Тема в разделе "PHP для новичков", создана пользователем Invision, 22 дек 2010.

  1. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Думаю система очень проста. У пользователей на сайте есть "Поинты". Хочется сделать мини-игру на удачу. Шанс 50% и возможность делать ставку. мне нужна только основа...

    проще говоря как реализовать:

    Посылаю значение 32 -> Вероятность 50% то что удвоится или обнулится > Результат
     
  2. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    движок будет основан на rand(0,1) что ли?
     
  3. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Количество всех действий и каждое действие пронумеровано:
    1 - удвоится
    2 - обнулится
    3 - останется прежним
    4 - примет значение х

    И пр.
    Теперь варианты 1 и 2 должны быть выбраны с вероятностью 50%, т.е с удвоенной по отношению к другим.
    Это можно сделать, как один из вариантов, случайным числом в интервале (общее кол-во действий) * 2, где в результате проверяется кратность. Это ОДИН ИЗ возможных вариантов, думай, как нравится.
    Но помни, что в конце всех вычислений для конечного варианта должна быть единица (100%)
     
  4. RX200

    RX200 Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    56
    Симпатии:
    0
    1.В страничке выводим, количество поинтов, и форму с полем для ввода ставки.
    2.при отправки, проверяем есть ли столько поинтов у пользователя,
    3. если есть, то запускаем функцию которая вернёт или нуль или один,
    4. ставим в условие возвращённое значение, если верно то удваиваем поинты и прибавляем к общему количеству поинтов.
    Как вариант:
    PHP:
    1. <?php
    2. if(isset($_GET['iframe'])){
    3. if(isset($_POST['point'])){
    4. $out=$_GET['iframe']-$_POST['point'];
    5. if($out<0)return;
    6. $out+=rand(0,1)?$_POST['point']*2:0;
    7. echo '<script type="text/javascript">parent.document.getElementById("output").innerHTML="'.$out.'";
    8. parent.document.forma.action="index.php?iframe='.$out.'";
    9. </script>';}}
    10. else{$point=100;
    11. echo '<HTML><head>
    12. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    13. <title>поиграем</title></head><BODY>';
    14. echo "<b>у вас:<span id='output'>$point</span> очков.</b>";
    15. echo'<form name="forma" action="index.php?iframe='.$point.'" target="hiddenframe" enctype="multipart/form-data" method="POST">
    16. <b>Введите ставку </b><input type="text" name="point" value=""><br>
    17. <input type="submit" value="играем)"><br>
    18. </form><iframe name="hiddenframe" style="width:0px; height:0px; border:0px"></iframe>
    19. </BODY></HTML>';}
    20. ?>
    Переделал немного свой старый скрипт)
     
  5. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Вопрос а если я вот так заюзаю:

    PHP:
    1. // Сколько поинтов у игрока
    2. $mypoint = 1000;
    3.  
    4. // Если поступил запрос с сданными из input point то продолжим
    5. if (isset($_POST['point'])) {
    6.  
    7. // Добавляем в переменную значение из post point
    8. $stavka = $_POST['point'];
    9.  
    10. // Проверяем на целые числа, если есть отрицательные или другие значения приостанавливаем...
    11. if ((int)$stavka <= 0 ){ echo "<font color=\"orange\"><b>Только целые числа</b></font>";  exit(); }
    12.  
    13. // Проверяем хватает ли игроку поинтов....
    14. if (($_POST['point']) >= $mypoint) { echo "<font color=\"orange\"><b>У тебя недостаточно поинтов</b></font>"; exit(); }
    15.  
    16. // Если значение = 0 то выиграл (вероятность 50%)
    17. if (mt_rand(0, 1) == 0) {
    18. $rezultat = $stavka*2;
    19. echo "<font color=\"green\"><b>Выигрыш составил $rezultat поинтов!</b></font>";
    20. // Если нет то отнимаем столько сколько поставил присвоив переменную результат
    21. } else {
    22. $rezultat = -$stavka;
    23. echo "<font color=\"red\"><b>Вы проиграли</b></font>";
    24. }
    25. } else {
    26. // Форма отправки значения
    27. echo "
    28. <form name=\"game\" method=\"post\">
    29. <input type=\"text\" value=\"Ваша ставка\" name=\"point\" onclick=\"this.value='';\">
    30. <input type=\"submit\" value=\"Играть\" >
    31. </form>
    32. ";
    33.  
    34. }
    если где криво написал скажите я только учусь))

    Просто вероятность появления 0 или 1 будет = 50% в таком случае можно на основе этого писать мини-игру?
     
  6. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    и вот еще вопрос в качестве проверки целых чисел подойдет ли:

    PHP:
    1. if ((int)$stavka <= 0 ){ echo "<font color=\"orange\"><b>Только целые числа</b></font>";  exit(); }
     
  7. RX200

    RX200 Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    56
    Симпатии:
    0
    Строка 14 если игрок все поинты введёт??
    Строка 17 нафиг сравнивать?
    Строка 22 ???

    преобразовать из числового в инт:
    $stavka |=0;//при строке вернёт 0;
    проверить на тип инт:
    is_int ($stavka);

    P.S.
    А на счёт вашего примера проверти сами.
    $stavka="а вот хер знает чему";
    if ((int)$stavka <= 0 ) echo "Ахринеть работает";
    else echo"нихера не работает";
     
  8. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    ох со строкой 17 никак не пойму =) там же генерирует 1 и 0, вот и сделал сравнение если 0 то выиграл если 1 то проиграл.. Разница есть?

    p.s мне кажется или 0 чаще выпадает) или мне просто везет? я уже в сайт вкрутил и с базой соединил, как бы работает но все же чаще 0 чем 1 =)
     
  9. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    соре в php полный тупень только учусь)
     
  10. RX200

    RX200 Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    56
    Симпатии:
    0
    Просто нуль равно ложь, все остальные значения истина,
    просто если нуль то проиграл, а если один то выиграл и тогда скрипт проще достаточно:
    if(mt_rand(0, 1))
    или как у тебя не меняя:
    if(!mt_rand(0, 1))
    То есть у тебя тоже правильно, но как то неприлично смотрится))
     
  11. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    аха ну работает и ладно) все равно в исходники кроме меня и хакеров никто не смотрит =)
     
  12. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    и работников хостинга.
     
  13. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    никогда не доварял хостерам по этому свой серв :D
     
  14. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    советую использовать не rand(0,1), а хотя бы нечто
    if (rand(0,1000) > 500) do_somthing1; else do_something2;
    генератор в таком случае себя более адекватно ведет.
     
  15. RX200

    RX200 Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    56
    Симпатии:
    0
    engager
    Тогда уж правильнее так:
    rand(1,1000) > 500
    так как ваше rand(0,1000) генерирует 1001 значение.
     
  16. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Ребята подскажите почему не работает


    Код (Text):
    1. // Проверяем хватает ли игроку поинтов....
    2. if (($stavka) >= $mypoint) {
    3. header("Location:../");
    4. }
    И скрипт все равно выполняется?! Проверил через echo данные поступают к этим переменным.. Однако я могу ввести любое значение 99999 и он выполнится если у юзера всего 100 поинтов.. Значение ставки обрабатывается через
    Код (Text):
    1.  
    2. $stavka = preg_replace("/[^0-9]/", "", $stavka1);
    Очень нужна ваша помощь.. Получилось не плохо на сайте, со списком самых везучих сортировка по рейтингам итд) народ заинтересовался но некоторые пользуются случаем и накручивают, отключил но возмущаются когда сделаю))

    ----------------------------------------------------------------

    А вот сами блоки с кодом полностью: (я знаю многое сделано оч глупо, но однако я только учусь делаем на это скидку, принимаю строгие замечания))


    PHP:
    1. <div id="stage" <?php if (isset($_POST['point'])) { } else { echo "style='display: none;'";}?> >
    2. <? $userpointid = $this->translate('%1$s', $this->viewer()->getIdentity());
    3.  
    4. $sqlstat = mysql_query("SELECT win, fuu FROM engine4_semods_userpoints WHERE userpoints_user_id='$userpointid'");
    5. $rowstat = mysql_fetch_array($sqlstat);
    6. ?>
    7.  
    8.  
    9. <?php
    10.  
    11. echo '
    12. <style>
    13. .win {
    14. border: 1px solid green;
    15. color: green;
    16. padding: 6px;
    17. width: 160px
    18. }
    19. .fu {
    20. border: 1px solid red;
    21. color: red;
    22. padding: 6px;
    23. width: 160px
    24. }
    25. .butwite {
    26.    background: #fff;
    27.    border:solid 1px #79b4d4;
    28.    color: #007cbc;
    29.    font-size:11px;
    30.    height: 25px;
    31.    padding: 5px 5px 5px 5px;
    32.   margin-top: 5px;
    33. font-weight: bold;
    34. }
    35. </style>
    36. ';
    37.  
    38.  
    39. // Сколько поинтов у игрока
    40. $mypoint = $this->user_points;
    41.  
    42. // Если поступил запрос то продолжим
    43. if (isset($_POST['point'])) {
    44.  
    45. // Добавляем в переменную значение из post point
    46. $stavka1 = $_POST['point'];
    47.  
    48. // Замена на целое число
    49. $stavka = preg_replace("/[^0-9]/", "", $stavka1);
    50.  
    51. // Проверяем на целые числа, если есть отрицательные или другие значения приостанавливаем...
    52. if ($stavka <= 0) {
    53. header("Location:../");
    54. }
    55.  
    56. // Проверяем хватает ли игроку поинтов....
    57. if (($stavka) >= $mypoint) {
    58. header("Location:../");
    59. }
    60.  
    61. // Максимум ставка....
    62. if (($_POST['point']) >= 151) {
    63. header("Location:../");
    64. }
    65.  
    66. // Если значение = 0 то выйграл (вероятность 50%)
    67. if (mt_rand(0, 1) == 0) {
    68. $rezultat = $stavka*2;
    69.  
    70. $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 ;");
    71.  
    72. echo "<div class='win'><b>Получено $rezultat поинтов!</b></div>";
    73. // Если нет то отнимаем столько сколько поставил присвоив переменную результат
    74. } else {
    75. $rezultat = $stavka*2;
    76. $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 ;");
    77. echo "<div class='fu'><b>Проиграно $rezultat поинтов.</b></div>";
    78. }}
    79. // Форма отправки значения
    80. echo "
    81. <b>Ваша ставка:</b><br>
    82. <form name=\"game\" method=\"post\" action=\"\">
    83. <input type=\"text\" value=\"Осталось $mypoint поинтов\" name=\"point\" onclick=\"this.value='';\">
    84. <input type=\"submit\" value=\"Мне повезет!\" class=\"butwite\" >
    85. </form><br>
    86. <font style=\"font-size:11px;\"><font color=\"red\">*</font> Максимум ставка 150 поинтов</font><br>
    87. <font style=\"font-size:11px;\"><font color=\"red\">*</font> Шанс 50% - X2</font>
    88. ";
    89.  
    90. ?>
    91. <br>
    92. <i>Побед: <? echo $rowstat['win']; ?></i> <font color="grey"> | </font>  
    93. <i>Поражений: <? echo $rowstat['fuu']; ?></i>
    94. </div><br>
    95.  
    96. <div id="popular" style='display: none;'>
    97. <center><b>Список самых везучих</b></center><hr style='padding-top: 7px;border-bottom:dashed 1px #CECECE;'>
    98. <table width="100%">
    99.  
    100. <tbody>
    101. <tr>
    102. <td style='border-bottom:dashed 1px #CECECE;'><b>Имя</b></td>
    103. <td width='5'></td>
    104. <td style='color: green; border-bottom:dashed 1px #CECECE;' align='right'><b>В</b></td>
    105. <td width='5'></td>
    106. <td style='color: red; border-bottom:dashed 1px #CECECE;' align='right'><b>П</b></td>
    107. </tr>
    108. </tbody>
    109.  
    110. <?
    111. $query = "SELECT userpoints_user_id, win, fuu FROM `engine4_semods_userpoints` ORDER BY win DESC LIMIT 10";
    112. $res = mysql_query($query);
    113. while($row = mysql_fetch_array($res))
    114.  
    115. {
    116. $named = mysql_query ("SELECT user_id, username, displayname FROM `engine4_users` WHERE user_id='".$row['userpoints_user_id']."'");
    117. $rownamed = mysql_fetch_array($named);
    118.  
    119. echo "
    120. <tbody>
    121. <tr>
    122. <td style='border-bottom:dashed 1px #CECECE;'><a href='http://live.tomsk.ru/profile/".$rownamed['username']."' title='".$rownamed['displayname']."'>".$rownamed['displayname']."</a></td>
    123. <td width='5'></td>
    124. <td style='border-bottom:dashed 1px #CECECE;' align='right'><b>".$row['win']."</b></td>
    125. <td width='5'></td>
    126. <td style='border-bottom:dashed 1px #CECECE;' align='right'><b>".$row['fuu']."</b></td>
    127. </tr>
    128. </tbody>\n
    129.  
    130. ";
    131. }
    132. ?>
    133. </table>
    134. <font style='font-size:11px;'><b style='color: green;'>В</b> - выигрыш</font><br>
    135. <font style='font-size:11px;'><b style='color: red;'>П</b> - проигрыш</font>
    136. <hr style='padding-top: 7px;border-bottom:dashed 1px #CECECE;'>
    137. </div>
     
  17. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    PHP:
    1. if (($stavka) >= $mypoint) {
    2.     header("Location:../");
    3.     exit;
    4. }
    exit надо ставить, что бы не выполнялся дальше
     
  18. RX200

    RX200 Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    56
    Симпатии:
    0
    Я же в прошлый раз говорил
    Зачем там равно?
    Или это сделано чтобы игрок никогда не мог все поинты проиграть?
     
  19. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Спасибо все работает. И еще один глупый вопрос разница между exit; и exit(); есть? :D
     
  20. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    И еще помогите составить запрос правильно чтобы выводились самые везучие.. В смысле не по числу выигрышей как уже стоит а по соотношению побед и поражений.

    т.е человек у которого 22 победы и 34 поражения хуже чем 20 побед и 22 поражения...

    Спасибо вам :)
     
  21. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    [sql]SELECT *, win / fuu AS result FROM `engine4_semods_userpoints` ORDER BY result DESC LIMIT 10[/sql]
    Тоже не в счет, к примеру тот у кого 5 игр 4 побед и 1 поражение попадает на 1 место.. помогите грамотно построить запрос