
Новичок
Профиль
Группа: Участник
Сообщений: 16
Регистрация: 2.8.2006
Репутация: нет Всего: нет
|
Я вот тут решил написать игру больше-меньше. Игра стара как мир. Кто не знает правила, вкратце опишу: даётся число, игроку надо угадать - слудующее число будет боьше или меньше, если угадал - выиграл, если нет - проиграл. Короче, проще некуда. Но я также добавил туда проверку честности: до выбора ставки игроку выдаётся результат игры в зашифрованном виде (алгоритм MD5). Этот результат содержит и загаданное число, поэтому после завершения игры человек может сравнить данный ему изначально хэш с тем, который можно сделать из незашифрованного результата. Вообщем, вот здесь можно посмотреть: http://moreless.mcdir.ru/Я бы хотел, чтобы вы, уважаемые программеры, посмотрели хотя бы мельком мой код и, по возможности, написали его недостатки. Прежде всего я имею ввиду безопасность (хотя авторизацию я ещё не писал, но всё же). Возможно также у вас будут идеи по более рациональному решению некоторых задач. А может где-то есть вообще лишние проверки  ? Игра вроде бы простая, а кода у меня получилось немало. Но я старался везде всё комментировать. Комментарии к функциям находятся в файле functions.php. Файл index.php | Код | <?php
session_start();
require_once('baseconnect.php'); // подключение базы require_once('functions.php'); // подключение функций require('stavkib.php'); // размеры ставок
// $marker - это маркер (он записывается в БД), по которому скрипт определяет, // чья это игра
if (!isset($_POST['radio'])) { $zapusk = 1; // первый шаг игры $user = ''; // будем считать, что игрок не залогинился if ($user <> '') { $marker = filtr($user); } elseif (isset($_SESSION['marker'])) { $marker = $_SESSION['marker']; } else { $marker = SID; } session_register('marker'); include('sourceb.php'); // запускаем игру } else { $kod = filtr($_POST['kod']); // это MD5-хэш результата игры $zapusk = 'empty'; include('sourceb.php'); // определяем результат игры и записывавем его в БД }
if ($zapusk<>'ok') { echo('Извините, но сейчас сыграть не удастся.<br> Попробуйте зайти через несколько секунд.'); } else { $que = mysql_fetch_array(mysql_query("SELECT * FROM `odnaigra` WHERE kodmd5='$rkod'")); // $out = 'yes' значит, это первый шаг игры // $out <> 'yes' значит, это второй шаг игры if ($out <> 'yes' && !isset($error)) { if ($que['stavka'] == '') { $error = '<br>Ваша игра не обнаружена в базе данных. Если вы уверены, что всё сделали правильно, обратитесь к администратору сайта.<br><br>'; } else { $rchislo = $que['1_number']; // первое число $rnumber = $que['2_number']; // второе число $result = $que['result']; // выиграл или проиграл $rstavka = $que['stavka']; // ставка $choice = $que['choice']; // выбрал "больше" или "меньше" $win_amount = $que['win_amount']; // выигрыш (если проиграл, то=0) $rstroka = $que['stroka']; // строка со вторым числом, MD5-хэш которой // равен $rkod (для проверки честности) $choice = ($choice == 'bolshe') ? 'БОЛЬШЕ' : 'МЕНЬШЕ'; $result = ($result == 'win') ? 'выиграли '.$win_amount.'!' : 'проиграли.';
?>
<u><b>Результат</b></u>:<br><br> Первое число: <?=$rchislo ?><br> Загаданное число: <?=$rnumber ?><br> Ваша ставка: <?=$rstavka ?> на <?=$choice ?><br> Вы <?=$result ?><br><br> Строка для проверки честности: <?=$rstroka ?><br> (<i>загаданное число стоит перед знаком "_"</i>)<br> Её MD5-хэш должен быть равен: <?=$rkod ?><br>
<?php } } elseif(isset($error)) { echo $error; } ?>
<hr> <u><b>Больше\Меньше</b></u>:<br><br> Нынешнее число: <?=$chislo ?><br> <form action='index.php' method='post'> Следующее число будет: больше <input type='radio' value='1' name='radio' checked> или меньше <input type='radio' value='2' name='radio'> <input type='hidden' value='<?=$kod ?>' name='kod'> ?<br><br> <select name='stavka'>
<?php for ($i = 0; $i <= $posl; $i++) {
?>
<option value='<?=$stavki[$i] ?>'><?=$stavki[$i] ?></option>
<?php }
$koefb = (100/(100-$chislo))*$proc/100; // коэф. умножения при ставке на больше $koefb = round($koefb, 2); $koefm = (100/($chislo-1))*$proc/100; // коэф. умножения при ставке на меньше $koefm = round($koefm, 2);
?>
</select><br><br> <input type='submit' value='Играть!'> </form> MD5-хэш результата равен: <?=$kod ?><br> При ставке на "БОЛЬШЕ" в случае выигрыша ставка умножится на: <?=$koefb ?><br> При ставке на "МЕНЬШЕ" в случае выигрыша ставка умножится на: <?=$koefm ?><br>
<?php }
?>
|
Файл sourceb.php | Код | <?php
make_seed();
// если скрипт запускается в первый раз ($zapusk=1), // то нет смысла делать кучу проверок ///////////////////////////////// if ($zapusk == 1) { $out = 'yes'; } else { $out = 'no'; $radio = $_POST['radio']; $stavka = $_POST['stavka']; } /////////////////////////////////
$zapusk = 'ok'; // запуск состоялся
$proc = 91; // процент возврата игрокам
if ($out == 'yes') { // если это первый шаг игры gen(); $query = @mysql_query("SELECT * FROM `odnaigra` WHERE marker='$marker' AND result='nothing'"); $que = @mysql_fetch_array($query);
// есть ли у этого игрока незавершённые игры if ($que[0] == '') { // если нет @mysql_query("INSERT INTO `odnaigra` (1_number, 2_number, procent, stroka, kodmd5, result, marker) VALUES ($chislo, $number, $proc, '$stroka', '$kod', 'nothing', '$marker')") or die('Извините, проблемы с базой данных. Попробуйте зайти позже.' ); } else { // если есть $chislo = $que['1_number']; // первое число $number = $que['2_number']; // второе число $stroka = $que['stroka']; // строка, содержащая результат игры // (напр. "7_21160944d2391ed72e2", где // число 7 - это $number)
$kod = $que['kodmd5']; // MD5-хэш этой строки } } else { // если это второй шаг игры $stav = $stavka; // размер ставки $que = mysql_fetch_array(mysql_query("SELECT * FROM `odnaigra` WHERE kodmd5='$kod'")); $chislo = $que['1_number']; // первое число $number = $que['2_number']; // второе число $itog = $que['result']; // выиграл или проиграл // (здесь должно быть "nothing", т. к. // игра ещё не состоялась) if ($itog <> 'nothing') { $error = '<br>Игра уже была произведена ранее.<br>'; }
// здесь проверяется размер ставки: соответствует ли он одному из тех, // которые указаны в массиве $stavki[] ($posl - это последний номер в массиве) ///////////////////////////////// for ($i = 0; $i <= $posl; $i++) { if ($stavki[$i] == $stav) { $noerror = 1; } } if ($noerror <> 1) { $error = '<br>Вы сделали неправильную ставку.<br>'; } /////////////////////////////////
$balance = $balance-$stav; // уменьшаем баланс на ставку
if ($radio == 1) { // если ставка была на "больше" bolshe(); } elseif($radio == 2) { // если ставка была на "меньше" menshe(); } else { $error = 'Вы не сделали выбор.'; }
if(!isset($error)) { @mysql_query("UPDATE `odnaigra` SET stavka=$stav, win_amount=$win_amount, result=$itog, choice=$radio, koef=$koef, balance=$balance WHERE kodmd5='$kod'") or die('Извините, проблемы с базой данных. Обновите страницу.'); }
$marker = $_SESSION['marker']; $rkod = $kod; $query = @mysql_query("SELECT * FROM `odnaigra` WHERE marker='$marker' AND result='nothing'"); $que = @mysql_fetch_array($query);
// есть ли у этого игрока незавершённые игры if ($que[0] == '') { // если нет gen(); @mysql_query("INSERT INTO `odnaigra` (1_number, 2_number, procent, stroka, kodmd5, result, marker) VALUES ($chislo, $number, $proc, '$stroka', '$kod', 'nothing', '$marker')") or die('Извините, проблемы с базой данных. Попробуйте зайти позже.' ); } else { // если есть $chislo = $que['1_number']; $number = $que['2_number']; $stroka = $que['stroka']; $kod = $que['kodmd5']; } }
?>
|
Файл functions.php | Код | <?php
// рандомизировать микросекундами (ф-я из мануала PHP) ///////////////////////////////// function make_seed() { list($usec, $sec) = explode(' ', microtime()); return (float) $sec + ((float) $usec * 100000); } /////////////////////////////////
// фильтрация переменных ///////////////////////////////// function filtr($perem) { return ereg_replace("[^0-9a-zA-Z_=]|insert|delete|update/i", "", $perem); } /////////////////////////////////
// в этой функции выбирается "больше", если // первое(нынешнее) число <50, а "меньше", если // первое число >50; если же оно = 50, то выбор случаен ///////////////////////////////// function Random1() { global $chislo, $radio; if ($chislo < 50) { $radio = 1; } elseif($chislo > 50) { $radio = 2; } elseif($chislo == 50) { $radio = rand(1,2); // больше(1) или меньше(2) } return true; } /////////////////////////////////
// если игрок выбрал "БОЛЬШЕ" ///////////////////////////////// function bolshe() { global $radio, $number, $chislo, $koef, $proc, $win_amount, $stav, $balance, $itog, $kolvo; $radio = '\'bolshe\''; if ($number > $chislo) { // $chislo - это первое число $koef = (100/(100-$chislo))*$proc/100; // коэф. умножения ставки при выигрыше $koef = round($koef, 2); $win_amount = $stav*$koef; $win_amount = round($win_amount, 2); // размер выигрыша $balance = $balance+$win_amount; // увеличиваем баланс на выигрыш $itog = '\'win\''; // результат=выиграл } else { $koef = 0; $win_amount = 0; $itog = '\'lose\''; // результат=проиграл } return true; } /////////////////////////////////
// если игрок выбрал "МЕНЬШЕ" ///////////////////////////////// function menshe() { global $radio, $number, $chislo, $koef, $proc, $win_amount, $stav, $balance, $itog, $kolvo; $radio = '\'menshe\''; if ($number < $chislo) { $koef = (100/($chislo-1))*$proc/100; $koef = round($koef, 2); // коэф. умножения ставки при выигрыше $win_amount = $stav*$koef; $win_amount = round($win_amount, 2); // размер выигрыша $balance = $balance+$win_amount; // увеличиваем баланс на выигрыш $itog = '\'win\''; // результат=выиграл } else { $koef = 0; $win_amount = 0; $itog = '\'lose\''; // результат=проиграл } return true; } /////////////////////////////////
// генерация первого и второго(загаданного) числа, // а также случайной строки и её MD5-хэша ///////////////////////////////// function gen() { global $chislo, $number, $stroka, $kod, $koef; $chislo = rand(21,80); // первое число $number = $chislo; do { $number = rand(1,100); // загаданное число } while($number == $chislo); $stroka = "$number".uniqid("_".rand(1,1000000)); $kod = md5($stroka); return true; } /////////////////////////////////
?>
|
Файл stavkib.php | Код | <?php
$stavki[0] = 0.2; $stavki[1] = 0.5; $stavki[2] = 1; $stavki[3] = 3; $stavki[4] = 5; $stavki[5] = 10;
$posl = count($stavki)-1; // последний номер в массиве
?>
|
|