Результаты поиска
| |
creativengised | Дата: Суббота, 08 Февраля 2014, 19:12 | Сообщение # 1 | Тема: Классы и объекты |
был не раз
Сейчас нет на сайте
| есть игрок у которого есть хп и урон (к примеру) и есть бот у которого есть хп, урон и магия (то, чего нет у игрока), но хп и урон у них общие, верно?
вот и получается, что можно прописать класс Персонаж у которого будет хп и урон, а на его основе создать дочерний класс ПерсонажБот и дать ему всего навсего 1 новое свойство - магия, т.к. хп и урон он унаследует от родительского класса Персонаж.
в этом смысле ООП очень удобно, можно создавать классы и на их основе делать новые виды, ладно если ты сразу все предусмотрел (что очень сложно) может быть можно и без классов обойтись, но по мне удобнее сделать основу и с нее клепать модифицированые виды
мнение новичка, так, что можно всерьез его не воспринимать
|
|
| |
creativengised | Дата: Среда, 05 Февраля 2014, 20:01 | Сообщение # 2 | Тема: Как изменить кодировку базы данных mysql |
был не раз
Сейчас нет на сайте
| Если интересно, прими совет нуба
1. создай файл .htaccess и помести его в корневую директорию проекта, этот файлик "научит" браузеры понимать, что дефотная кодировка utf8 Код AddDefaultCharset utf-8 2. при создании БД выставляй Collation = utf8_genegal_ci, а если БД уже существует, то зайди в закладку Operation (Операции) и там поменяй Collation на utf8_genegal_ci (если у тебя что-то другое) + на всяк пожарный пройдись по всем таблицам и проверь, чтобы во всех текстовых полях Collation было = utf8_genegal_ci 3. пользуйся редактором, который поддерживает кодировку файла UTF8 (без BOM) отлично подходит для этих целей Notepad++, в котором можно настроить документ по умолчанию именно в этом виде. 4. ну и для полного спокойствия, того, что данные ушли как надо после mysql соединения выставь mysql_query("SET NAMES 'utf8'"); или если соединение через PDO, то вот пример, куда я вставляю аналог СЭТ НЭЙМС Код $conn = new PDO("mysql:host=localhost;dbname=game;charset=utf8","root","");
скажу, как новичек в этом деле, набил тонну шишек с этими кодировками, то файлы пытался в одной делать, а базу в другой, то наоборот, но всяк раз были косяки, после долгих набиваний шишек, пришел к предлагаемому рецепту и все работает более, чем корректно
Сообщение отредактировал creativengised - Среда, 05 Февраля 2014, 20:08 |
|
| |
creativengised | Дата: Понедельник, 03 Февраля 2014, 22:21 | Сообщение # 3 | Тема: Создание персонажа (делаем игрульку) |
был не раз
Сейчас нет на сайте
| Цитата Assasin ( ) ожидаем-с в шапке обновил архив добавил кольца
Сообщение отредактировал creativengised - Среда, 05 Февраля 2014, 21:44 |
|
| |
creativengised | Дата: Понедельник, 03 Февраля 2014, 13:24 | Сообщение # 4 | Тема: Создание персонажа (делаем игрульку) |
был не раз
Сейчас нет на сайте
| Цитата Assasin ( ) В чем тайный смысл данной темы? Тайного смысла нет. Хотел было поделиться набросками создания перса. Но весь код в шапку не влез + по ходу дела доредактирую пару файлов. Скоро покажу что получается. Будет создан перс, на него можно будет надеть какой-то предмет с проверкой требований предмета. Снять предмет, после чего он окажется в инвентаре (или рюкзаке). В целом это я хочу выложить для того, чтобы знатоки посмотрели и оценили насколько криво и ужасно все. Файлы выложу в архиве, когда закончу функции одевания, раздевания.
А вообще как бы есть цель создать пусть и очень примитивную (по меркам 21го века) браузерку, где можно развивать персонажа, выполнять квесты, принимать участие в состязаниях между игроками. Игра не коммерческая, а скажем так для портфеля + для набивания шишек. Буду благодарен за советы, рекомендации и подсказки. Никогда не прошу никого, предоставить готовое решение в виде кода, т.к. иначе не вижу смысла заниматься этим делом.
!!! Предметы честно позаимствовал в интернете !!! где не помню, но у какой то похожей браузерки, не корысти ради, а токмо для отладки, в конечном варианте будут нарисованы 100% свои комплекты (3D max, Maya тьфу тьфу пока не забыто)
Сообщение отредактировал creativengised - Понедельник, 03 Февраля 2014, 13:31 |
|
| |
creativengised | Дата: Пятница, 31 Января 2014, 00:15 | Сообщение # 5 | Тема: Создание персонажа (делаем игрульку) |
был не раз
Сейчас нет на сайте
| Архив качать для скачивания нужно указать пароль "game" (обновлено 06.02.2014)
Что это? Это одна из заготовок для браузерки. Делаю исключительно для набивания шишек, т.е. тренировки (осознаю, что коммерческий проект из этого сделать не выйдет)
Почему шпоргалка? Возможно, кто-то знает в этом деле, еще меньше меня. Можно подсматривать. Для этого и выкладываю архивы (постоянно обновляя их).
Что в архиве?
1. стартовый файл char.php где можно создать перса 2. после создания открывается вход во временный инвентарь (с полным комлектом вещей, кроме рун и бонусов) 3. вещи надеваются, снимаются, проходят проверки на соответствие требованиям (последнее, что доработал это если снять зависимую вещь, дающую что-то нужное другой вещи, то та слетит без нужных требований) 4. поправил отображение полосок (была ошибка с выносливостью, просто опечатка) 5. пока все.
Что нужно для того, чтобы корректно повторить сделаное мной?
1. Использовать редактор позволяющий открывать документы и сохранять их в кодировке utf8 без ВОМ 2. Использовать Collation в БД utf8_general_ci (по умолчанию) 3. Использовать файл .htaccess который надо поместить в корень вашего проекта, этот файл "научит" браузеры понимать, что дефолтная кодировка utf8
Что хотелось бы услышать в комментариях?
1. Конструктивную критику 2. Советы 3. Рекомендации по оптимизации некоторых частей кода (если вдруг вы явно видите, что и как можно оптимизировать) буду очень благодарен. 4. Готовые решения в виде кода не нужны. Достаточно объяснить. Не тупой, постараюсь вникнуть.
Какие планы?
Создать играбельную модель, куда войдет: 1. Дуэль 1 на 1. 2. Бой против бота. 3. Квесты от различных NPC. 4. Квесты с боями против ботов. 5. Покупка / Продажа (пока магазин). 6. Работа - на некоторое время перс блокируется (работает). 7. Система внутренних сообщений и системных уведомлений (почта) 8. Чат (на Ajax технологии, без перезагрузки страницы) 9. Отрисовать несколько полных комплектов (в настоящий момент картинки взяты из интернета, для отладки)
Пока вот такой мизер. Процесс создания начал с персонажа, как довольно объемного модуля. Что он умеет написал выше. Но скоро у него добавятся новые свойства. Следите за обновлением архива.
Сообщение отредактировал creativengised - Четверг, 06 Февраля 2014, 21:04 |
|
| |
creativengised | Дата: Пятница, 24 Января 2014, 16:38 | Сообщение # 6 | Тема: нужен совет по формуле расчета боя |
был не раз
Сейчас нет на сайте
|
lvovand, все получилось, осталось мелочи доработать, но главное, что хотел получилось спасибо за совет!
|
|
| |
creativengised | Дата: Пятница, 24 Января 2014, 12:52 | Сообщение # 7 | Тема: нужен совет по формуле расчета боя |
был не раз
Сейчас нет на сайте
| lvovand, была задумка сделать отдельно таблицу char (персонаж) но честно говоря смены чаров не подразумевается, и чтобы не накосячить с данными решил хранить их в таблице юзеров, идейку с логом понял - огромное спасибо, постараюсь реализовать!
Действительно ларчик просто открывался
Хотя наверно поспешил ((( вот смотри допустим есть ход Васи и такая строка (row) Вася ударил а Петя увернулся. а следующий ход Вася попадает и уже получается Вася ударил и нанес урон ХХХХ т.е. еще одна строка (row) вот тут я честно говоря теряюсь, по идее в одной временной таблице боя такое можно реализовать, добавляя нужные строки, но я не думаю, что резонно создавать под каждый поединок таблицу.
Видимо я не до конца понял конструкцию БД. Хотя идея в целом понятна и действительно удобна, подменять текст числовыми значениями.
Прошу если не затрудтнит lvovand, можно схематично изобразить таблицу и что откуда вызывается?
Может быть я немного коряво понимаю, но структура БД должна быть такой:
таблица Battles где id = просто id записи как таковой... дальше id_battle (где записывается уникальный номер поединка) и дальше события Event1 Event2 Event3 и тд... а параллельно сделать таблицу куда добавлять id (тот самый уникальный id поединка) user1_id user2_id тогда можно повытаскивать, но почему то мне кажется, что это утопия, т.к. если юзеров в бою окажется больше 2х, то куда вписывать третьего? А если 100 юзеров в каком нибудь хаоте? Может быть наоборот у юзера хранить где-то запись о проведеном поединке? Но тогда это уже 3я дополнительная таблица причем каждому юзеру
Сообщение отредактировал creativengised - Пятница, 24 Января 2014, 13:32 |
|
| |
creativengised | Дата: Пятница, 24 Января 2014, 08:09 | Сообщение # 8 | Тема: нужен совет по формуле расчета боя |
был не раз
Сейчас нет на сайте
| lvovand, если я понял правильно (насчет логов) то это должно выглядеть примерно так?
id login hod event1 event2 event3 event4 event5 1 vasya 1 2 1 0 1 22
где каждое число под эвентом(событием) = какой-то фразе например ударил, увернулся, нанес урон, значение урона и тп
а потом это считать в обычный лог и вывести, подставляя нужные слова и фразы
так?
|
|
| |
creativengised | Дата: Пятница, 24 Января 2014, 01:25 | Сообщение # 9 | Тема: нужен совет по формуле расчета боя |
был не раз
Сейчас нет на сайте
| maker-rus, спасибо в целом за ответ, но самое забавное то, что все, что вы ответили и я знаю. Вопрос же я задавал в целом для другого, как найти под мою конструкцию оптимальное решение? Ведь формул урона пожалуй столько же сколько типов игр, и если взять игру где на исход влият все юниты то формула будет одна, а если взять как например Carnage или БК, то там считается иначе. У меня скорее ближе к Carnage конструкция.
впрочем вот наваял сам, с комментариями чего для чего
Код //если игрок 1 и игрок 2 походили if((!empty($u1_attack))AND(!empty($u1_defense1))AND(!empty($u1_defense2))AND(!empty($u1_position)) AND(!empty($u2_attack))AND(!empty($u2_defense1))AND(!empty($u2_defense2))AND(!empty($u2_position))){ if($u1_position==1)$u1_critical_hit*=2; //позиция Атака дает прирост Криту *2 if($u1_position==1)$u1_anti_dexterity*=2; //позиция Атака дает прирост АнтиУвороту *2 if($u1_position==2)$u1_anti_critical_hit*=2; //позиция Защита дает прирост АнтиКриту *2 if($u1_position==2)$u1_dexterity*=2; //позиция Защита дает прирост Увороту *2 if($u2_position==1)$u2_critical_hit*=2; //позиция Атака дает прирост Криту *2 if($u2_position==1)$u2_anti_dexterity*=2; //позиция Атака дает прирост АнтиУвороту *2 if($u2_position==2)$u2_anti_critical_hit*=2; //позиция Защита дает прирост АнтиКриту *2 if($u2_position==2)$u2_dexterity*=2; //позиция Защита дает прирост Увороту *2
//ИГРОК1 $u1_event1="$u1_login ударил"; //проверка попал игрок1 в противника или нет $dexterity=rand(1,100); //определим случайное значение уворота $trigger=rand(1,($u2_dexterity-$u1_anti_dexterity)); //триггер = Уворот игрока2 - АнтиУворот игрока1 //уворот сработает либо при 5% if($dexterity<=5){ $u1_event2=", но $u2_login увернулся"; } //либо если значение триггера окажется выше случайного числа elseif($dexterity<=$trigger){ $u1_event2=", но $u2_login увернулся"; } //проверка обычный удар или критический else{ $critical_hit=rand(1,100); //определим случайное значение уворота $trigger2=rand(1,($u1_critical_hit-$u2_anti_critical_hit)); //триггер = Крит игрока1 - АнтиКрит игрока2 //крит сработает либо при 5% if($critical_hit<=5){ //если удар попал в блок1 if($u1_attack==$u2_defense1){ $u1_event2=", но $u2_login заблокировал удар"; } //если удар попал в блок2 elseif($u1_attack==$u2_defense2){ $u1_event2=", но $u2_login заблокировал удар"; } else{ //урон = от (мин_урон + 75% текущей выносливости) до (макс_урон + 25% текущей выносливости) $damage=(rand(($u1_min_damage+(($u1_current_endurance/100)*75)),(($u1_max_damage+($u1_current_endurance/100)*25))))*2; $u1_event3=" и нанес критический урон -$damage"; } } //либо если значение триггера окажется выше случайного числа elseif($critical_hit<=$trigger2){ //если удар попал в блок1 if($u1_attack==$u2_defense1){ $u1_event2=", но $u2_login заблокировал удар"; } //если удар попал в блок2 elseif($u1_attack==$u2_defense2){ $u1_event2=", но $u2_login заблокировал удар"; } else{ //урон = от (мин_урон + 75% текущей выносливости) до (макс_урон + 25% текущей выносливости) $damage=(rand(($u1_min_damage+(($u1_current_endurance/100)*75)),(($u1_max_damage+($u1_current_endurance/100)*25))))*2; $u1_event3=" и нанес критический урон -$damage"; } } else{ //если удар попал в блок1 if($u1_attack==$u2_defense1){ $u1_event3=", но $u2_login заблокировал удар"; } //если удар попал в блок2 elseif($u1_attack==$u2_defense2){ $u1_event3=", но $u2_login заблокировал удар"; } else{ //урон = от (мин_урон + 75% текущей выносливости) до (макс_урон + 25% текущей выносливости) $damage=rand(($u1_min_damage+(($u1_current_endurance/100)*75)),(($u1_max_damage+($u1_current_endurance/100)*25))); $u1_event3=" и нанес урон -$damage"; } } } //ИГРОК2 }
ИГРОК2 пока не прописывал, еще с 1м не полностью разобрался, но надеюсь разберусь. Но все же буду очень благодарен за дельные советы в этом направлении. Ведь наверняка есть люди, которые эти алгоритмы уже прописывали и знают о подводных камушках. Заранее спасибо, за совет, а не за ссылку на гугл.
maker-rus а насчет вывода лога, то как бы не вижу проблем как его показать в хтмл или пхп коде, сложность в другом, как корректно создать таблицу в БД и какие туда вложить поля кроме id-поединка?
Может быть надо связывать несколько таблиц? У кого есть опыт буду рад выслушать концепцию. Понимаю, что лог должен дописываться в таблицу и выводится по строчно с сортировкой по времени. Ок. Еще раз говорю, чернобелую запись лога я могу соорудить, вписав в текст без всяких переменных просто текст и выведя его потом из БД. Это не проблема.
НО! Хочется получить лог с переменными, которые можно оформить различными стилями. А для этого я так понимаю, уже простого текста не достаточно. Да и потом ведь в поединке может участвовать более, чем 2 участника, отсюда и вопрос с перспективой, как грамотно выстроить таблицу для лога боя?
Сообщение отредактировал creativengised - Пятница, 24 Января 2014, 01:37 |
|
| |
creativengised | Дата: Четверг, 23 Января 2014, 18:00 | Сообщение # 10 | Тема: нужен совет по формуле расчета боя |
был не раз
Сейчас нет на сайте
| Добрый день уважаемые гуру!
Сразу хочу сказать о том, что я не прошу готовый код, а всего лишь совет о том, как лучше реализовать формулы расчета боя.
Итак. Скажу чего у меня имеется.
1. Есть БД с таблицей users, где помимо регистрационных данных хранятся всевозможные параметры игрока. Полей много. Но если я правильно понимаю, то в расчете урона и отъема хп и выноса, будут задействованы такие как: Сила = 3 Ловкость = 3 Инстинкт = 3 Жизнь = 3 *(3 - стартовое значение навыка, которое игрок будет увеличивать)
Жизнеспособность - зависит от Жизнь*6 + то, что дадут предметы Выносливость - зависит от Сила*6 + то, что дадут предметы
Урон(Мин-Макс) = 1-2 + то, что дадут предметы
Защита_головы + то, что дадут предметы Защита_корпуса + то, что дадут предметы Защита_пояса + то, что дадут предметы Защита_ног + то, что дадут предметы
Крит - базовый берет от Инстинкт*3 + то, что дадут предметы АнтиКрит - базовый берет от Инстинкт*3 + то, что дадут предметы Уворот - базовый берет от Ловкость*3 + то, что дадут предметы АнтиУворот - базовый берет от Ловкость*3 + то, что дадут предметы
Это так сказать те параметры, которые я уже создал и более менее прописал как они считаются, что от чего зависит. (очень надеюсь, что двигаюсь в +/- верном направлении)
Что еще есть? Есть форма, в которой игрок делает выбор. Куда ударить (1 вариант) Что защитить (2 варианта) и в какой позиции он находится в Атакующей или Защитной
После чего из формы через POST уходят данные и попадают на страницу боя.
Вот тут собственно говоря у меня загвоздка случилась. Формул много и в разных играх они по разному прописываются. Потому хотел бы попросить ваших советов, как лучше рассчитать урон игрока, и главное в какой последовательности.
Мне видится картина примерно так (подчеркиваю примерно!!! и именно потому пишу сообщение о помощи)
ЕСЛИ игрок1 походил (т.е. выставил ход) проверяем попал игрок1 или промазал (5% вероятность, что игрок2 увернется)+(Уворот игрок2 + влияние от позиции Защита)-(АнтиУворот игрока1 + влияние от позиции Атака) по логике при защитной стойке уворот должен работать лучше, так же как АнтиУворот при атакующей
ЕСЛИ игрок1 попал, то проверяем обычный удар или критический (5% вероятность, что удар критический)+(Крит игрока1 + влияние от позиции Атака)-(АнтиКрит игрока2 + влияние от позиции Защита) так же как и с уворотом, Крит скорее прилетит при атаке, а ослабить его может как раз Защита соперника
ЕСЛИ удар Крит, урон игрока1 = ВОТ ТУТ у меня как раз сложность... и так, и этак пробовал, что-то все не то. Нужен совет опытных игроделов ЕСЛИ удар Обычный (не Крит) ну вообщем то же нужен совет
+ у меня есть 2 блока, которые выставил игрок, надо бы как то и их учесть, только в каком моменте? допустим удар игрока 1 пришелся в блок 1(голова) переменную по броне я знаю она = $defense_head и значение берет из БД. Вопрос в том, где ее лучше подставить и как правильно вычислить влияние брони. Предположим 2 варианта. Броня_головы = 0 (вообще нет шляпы) и Броня_головы = 5 (надета какая-то шапка). Насколько я правильно понимаю, броня поглощает урон но не выше, своего значения и не всегда на свое максимальное значение, а скорее всего от 1 до своего значения.. Ну эт я так думаю, вот тут нужен ваш совет.
ЕСЛИ удар пробил броню - условие при котором удар пробивает броню (то же надо) дальше понятно, что нужно отнять от Здоровья игрока2 тот урон игрока1 который получился в финале + отнять у обоих немного Выносливости ЕСЛИ удар не пробил броню - условие при котором считается блокировка удара, ну и в любом случае отнять немного выносливости
Теперь. Пожалуй самое геморойное для моего пока неопытного разума. Вот допустим игрок1 завершил свой ход. Так же просчитали и игрока2. Есть некоторые данные и события. Размер урона, сколько хп осталось после удара, куда били, с атаки или с защиты, и все такое.
Все эти данные хотелось бы поместить в лог боя. Понимаю это mysql_query("UPDATE tablename SET .............."); Обновить то не вопрос. Но. Хотелось бы получить лог, который можно будет закрепить за игроками, которые в нем участвовали (где-то в завершенных боях) и главное не просто вбить туда события, а и вывести их потом с оформлением.
Поясню.
Допустим вбить в текстовое поле строку лога наподобии:
00:00:00 Игрок1 ударил с атаки, но Игрок2 увернулся 00:00:00 Игрок1 ударил с атаки, и Игрок2 от защиты нанес критический удар в корпус -10 (8/18)
и потом вывести его в лог НЕ проблема, но он выведется именно так, как и здесь, в черном варианте без оформления, а хотелось бы получить нечто такое:
00:00:00 Игрок1 ударил с атаки, но Игрок2 увернулся 00:00:00 Игрок1 ударил с атаки, и Игрок2 от защиты нанес критический удар в корпус -10 (8/18)
ВОТ тут я немного ломаю мозг. Как это получше создать? Нужен совет. Считаю лог боя неотъемлемой частью боя, и потому хотелось бы прикрутить его для дальнейших анализов.
Заранее благодарен за советы. И еще раз говорю, мне не нужен готовый код. А вот правильное направление мысли бы очень даже было надо Заранее спасибо!
p.s. в принципе намудрить чего-то с формулами и сам могу, но решил спросить как это сделать максимально корректно и пока нет мыслей насчет реализации лога с оформлением, хотя уж думал по разному и так пробовал и этак, все не то, слишком громоздко
User2 у меня сейчас как бы бот, генерирует удар, блоки и позицию, т.е. автоматом совершает ход, хотя вместо него могут так же использоваться данные от реального соперника
и еще в данной модели, у меня только 2 игрока участвуют, возможно это изначально неправильно, тут то же бы хотелось получить консультацию, ведь в перспективе может быть в команде больше, чем 1 игрок, допустим боевой зверь.
Сообщение отредактировал creativengised - Четверг, 23 Января 2014, 18:23 |
|
| |
creativengised | Дата: Воскресенье, 19 Января 2014, 06:02 | Сообщение # 11 | Тема: Регистрация PHP+MySQL+Ajax |
был не раз
Сейчас нет на сайте
| Добрый день уважаемые гуру!
Жизнь вынуждает осваивать новые технологии. В вэб-разработке я практически нуб (и пока не претендую ни на что). Хотелось бы получить вашу оценку тому кусочку работы, который я проделал. Подглядывая в разные источники соорудил некое подобие стартового минимума для сайта, в который входит
1. Регистрация с проверкой данных без перезагрузки страницы (Ajax) 2. Активация аккаунта (с подтверждением E-mail на который приходит код активации) 3. Авторизация и вход на главную страницу 4. Выход 5. Восстановление забытого пароля (генерируется новый и высылается автоматически на E-mail)
Пока это все. Ниже выложу код страниц. От вас прошу конструктивную критику, замечания, советы по улучшению. Это мой 1й проект с использованием Ajax и хотя его там не сильно много, но все же хочется понять на верном ли я пути или двигаюсь вообще не туда и все печально.
Заранее благодарю. И собственно исходники к вашему вниманию.
SQL таблица `users` (база `lessons`)
Код CREATE TABLE IF NOT EXISTS `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `login` char(64) NOT NULL, `password` char(64) NOT NULL, `email` char(64) NOT NULL, `ip` char(20) NOT NULL, `browser` char(255) NOT NULL, `date` datetime NOT NULL, `activation` tinyint(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
index.php
Код <html> <head> <title>Корневая страница сайта</title> <link rel="stylesheet" href="style.css"> </head> <body>
<table class=round width=800 align=center cellspacing=4><tr> <td align=center> <form action="enter.php" method=POST> <input type=text name=login placeholder=Логин > <input type=password name=password placeholder=Пароль > <input class=button type=submit value=Войти> <a href=registration.php>Регистрация</a> <a href=passwordrepair.php>Восстановить пароль</a> </form></td></tr></table>
</body> </html>
registration.php
Код <html> <head> <title>Регистрация</title> <script type="text/javascript" src="jquery-1.7.min.js"></script> <script type="text/javascript" src="check.js"></script> <link rel="stylesheet" href="style.css"> </head> <body onLoad=page_load();>
<table class=round width=800 align=center cellspacing=4> <form action=""> <tr><td valign=top width=50% align=right><input type=text name=login id=login placeholder=Логин onChange=check_login();></td><td><div id=result_login></div></td></tr> <tr><td valign=top width=50% align=right><input type=password name=password id=password placeholder=Пароль onChange=check_password();></td><td><div id=result_password></div></td></tr> <tr><td valign=top width=50% align=right><input type=text name=email id=email placeholder=E-mail onChange=check_email();></td><td><div id=result_email></div></td></tr> <tr><td valign=top width=50% align=right><input type=button value=Регистрация onClick=send();></td><td><div id=result></div></td></tr> </form> </table>
</body> </html>
activation.php
Код <?php include "functions.php" ?> <html> <head> <title>Активация</title> <link rel="stylesheet" href="style.css"> </head> <body>
<table class=round width=800 align=center cellspacing=4> <tr><td align=center>
<?php //чистим неактивных mysql_query("DELETE FROM users WHERE activation='0' AND UNIX_TIMESTAMP()-UNIX_TIMESTAMP(date)>3600"); //код активации if(isset($_GET['code'])) {$code =$_GET['code']; } //если не указали code, то выдаем ошибку else{ print "<font color=#ff0000> <small>код активации не обнаружен</small></font>"; goto_index(); exit; } //id,который нужно активировать if (isset($_GET[id])) {$id=$_GET[id];} //если не указали id, то выдаем ошибку else{ print "<font color=#ff0000> <small>ID пользователя не обнаружен</small></font>"; goto_index(); exit; } //получаем логин по ID пользователя $sql = mysql_fetch_array(mysql_query("SELECT id, login FROM users WHERE id='$id'")); $activation = md5($id).md5($sql[login]);//создаем такой же код подтверждения //сравниваем полученный из url и сгенерированный код, если равны, то активируем пользователя if ($activation==$code){ mysql_query("UPDATE users SET activation='1' WHERE id='$id'"); unset($activation); print "<font color=#339900> <small>код активации подтвержден</small></font>"; goto_index(); exit; } //если же полученный из url и сгенерированный код не равны, то выдаем ошибку else { print "<font color=#ff0000> <small>код активации не подтвержден</small></font>"; goto_index(); exit; } ?> </td></tr></table>
</body> </html>
login.php
Код <html> <head> <title>Авторизация</title> <script type="text/javascript" src="jquery-1.7.min.js"></script> <script type="text/javascript" src="check.js"></script> </head> <body>
<table> <form action="enter.php" method=POST> <tr><td><input type=text name=login placeholder=Логин ></td> <td><input type=password name=password placeholder=Пароль ></td> <td><input class=button type=submit value=Войти></td></tr> </form> </table>
</body> </html>
logout.php
Код <? session_start(); include "functions.php";
if(!empty($_GET[login])){ session_unset(); session_destroy(); $_SESSION = array(); goto_index_quick(); } ?>
main.php
Код <? session_start(); include "functions.php"; ?> <html> <head> <title>Главная страница</title> <script type="text/javascript" src="hideshow.js"></script> <link rel="stylesheet" href="style.css"> </head> <body> <table class=round width=800px align=center><tr> <td valign=top width=50% align=left> <? if((!empty($_GET[login]))AND(!empty($_SESSION[login]))AND($_GET[login]==$_SESSION[login])){ print "<font color=#339900> <small>Доброго времени суток </small><b>$_GET[login]</b></font>"; $sql = mysql_fetch_array(mysql_query("SELECT activation FROM users WHERE login='$_GET[login]'")); if($sql[activation]==0){ print "<font color=#ff0000> <small>ваш аккаунт еще не активирован. Отключаю...</small></font>"; goto_index(); exit; } } else{ print "<font color=#ff0000> <small>логин и/или сессия не совпадают</small></font>"; goto_index(); exit; } ?> </td> <td valign=top width=50% align=right><a href="logout.php?login=<?print $_SESSION[login];?>">Выход</a></td> </tr></table>
</body> </html>
passwordrepair.php
Код <html> <head> <title>Восстановление пароля</title> <script type="text/javascript" src="jquery-1.7.min.js"></script> <script type="text/javascript" src="check.js"></script> <link rel="stylesheet" href="style.css"> </head> <body>
<table class=round width=800 align=center cellspacing=4> <tr><td align=center> <form action=""> <input type=text class=reg_email name=email id=email placeholder="введите e-mail указаный при регистрации" onChange=test_email();> <div id=result_test_email></div> </form> </td></tr></table>
</body> </html>
enter.php
Код <? session_start(); include "functions.php"; ?> <html> <head> <title>Активация</title> <link rel="stylesheet" href="style.css"> </head> <body>
<table class=round width=800 align=center cellspacing=4> <tr><td align=center>
<?php $password_md = md5($_POST[password]);
if((!empty($_POST[login]))AND(!empty($_POST[password]))){ $sql = mysql_fetch_array(mysql_query("SELECT login, password FROM users WHERE login='$_POST[login]'")); if(($sql[login]==$_POST[login])AND($sql[password]==$password_md)){ //print "<font color=#339900> <small>входим на сайт</small></font>"; //print "<br><small><font color=#999999>DB логин:</font></small> $sql[login]<br><small><font color=#999999>POST логин:</font></small> $_POST[login]<br><small><font color=#999999>DB пароль:</font></small> $sql[password]<br><small><font color=#999999>POST пароль:</font></small> $password_md"; $_SESSION[login]=$_POST[login]; goto_main($_POST[login]); } else{ print "<font color=#ff0000> <small>логин и пароль не совпадают</small></font>"; //print "<br><small><font color=#999999>DB логин:</font></small> $sql[login]<br><small><font color=#999999>POST логин:</font></small> $_POST[login]<br><small><font color=#999999>DB пароль:</font></small> $sql[password]<br><small><font color=#999999>POST пароль:</font></small> $password_md"; goto_index(); } }else goto_index_quick(); ?> </td></tr></table>
</body> </html>
check.php
Код <? session_start(); include "functions.php";
//конвертер utf8 в WINDOWS-1251 $login = iconv("utf-8","windows-1251",$_POST[login]); $password = iconv("utf-8","windows-1251",$_POST[password]); $email = iconv("utf-8","windows-1251",$_POST[email]);
if(!empty($_POST[test_email])){ //проверка среди пользователей $sql = mysql_num_rows(mysql_query("SELECT id FROM users WHERE email='$_POST[test_email]'")); if($sql==0){ if($mode==0) print "<font color=#ff0000> <small>e-mail не найден</small></font>"; //$_SESSION[errors]+=1; } else{ if($mode==0) print "<font color=#339900> <small>новый пароль отправлен на e-mail</small></font>"; //генерируем новый пароль $chars="qazxswedcvfrtgbnhyujmkiolp1234567890QAZXSWEDCVFRTGBNHYUJMKIOLP"; $max=10; $size=StrLen($chars)-1; $password=null; while($max--)$password.=$chars[rand(0,$size)]; //шифруем и обновляем пользователя по email mysql_query("UPDATE users SET password='".md5($password)."' WHERE email='$_POST[test_email]'"); //отправляем сообщение пользователю send_new_password($password, $_POST[test_email]); goto_index(); } }
if((!empty($_POST[login]))AND(!empty($_POST[password]))AND(!empty($_POST[email]))){ check_login($login,1); check_password($password,1); check_email($email,1);
if($_SESSION[errors]==0){ $sql = mysql_query("INSERT INTO users (login,password,email,ip,browser,date) VALUES ('$login', '".md5($password)."', '$email', '".ip()."', '".browser()."', NOW())"); if($sql=='TRUE'){ send_activation_code($login, $email); print "<font color=#339900> <small>регистрация успешно завершена!</small></font>"; unset($_SESSION[errors]); goto_index(); } } else{ print "<font color=#ff0000> <small>регистрация невозможна</small></font>"; unset($_SESSION[errors]); } } else{ if(!empty($_POST[login]))check_login($login,0); if(!empty($_POST[password]))check_password($password,0); if(!empty($_POST[email]))check_email($email,0); } ?>
functions.php
Код <? session_start(); //устанавливаем настройки соединения $host=$_SERVER['REMOTE_ADDR']; $user='root'; $login=''; $base='lessons'; //подключаемся к серверу $sql = mysql_connect ($host, $user, $login); if(!$sql){ exit('Error'.mysql_error()); } //выбираем БД mysql_select_db ($base,$sql); if(!mysql_select_db ($base,$sql)){ exit('Error'.mysql_error()); } //при необходимости устанавливаем кодировку запросов cp1251 или utf8 mysql_query("SET NAMES 'cp1251'"); //mysql_query("SET NAMES 'utf8'");
//**********************************************************************************************\\ function goto_index() { $dir='../lessons/'; //здесь меняем путь к корневой директории с вашим проектом $ip=$_SERVER['REMOTE_ADDR']; //здесь меняем ip вашего сервера (на Денвере это 127.0.0.1) print "<script>setTimeout('index()', 5000); function index(){ location='http://".$ip."/".$dir."'; }</script>"; } //**********************************************************************************************\\ function goto_index_quick() { $dir='../lessons/'; //здесь меняем путь к корневой директории с вашим проектом $ip=$_SERVER['REMOTE_ADDR']; //здесь меняем ip вашего сервера (на Денвере это 127.0.0.1) print "<script>setTimeout('index()', 0); function index(){ location='http://".$ip."/".$dir."'; }</script>"; } //**********************************************************************************************\\ function goto_main($login) { $dir='../lessons/'; //здесь меняем путь к корневой директории с вашим проектом $ip=$_SERVER['REMOTE_ADDR']; //здесь меняем ip вашего сервера (на Денвере это 127.0.0.1) print "<script>setTimeout('index()', 0); function index(){ location='http://".$ip."/".$dir."main.php?login=$login'; }</script>"; } //**********************************************************************************************\\ function goto_login() { $dir='../lessons/'; //здесь меняем путь к корневой директории с вашим проектом $ip=$_SERVER['REMOTE_ADDR']; //здесь меняем ip вашего сервера (на Денвере это 127.0.0.1) print "<script>setTimeout('index()', 5000); function index(){ location='http://".$ip."/".$dir."login.php'; }</script>"; } //**********************************************************************************************\\ function check_login($login,$mode) { //проверка запрещенных символов if(!preg_match("/^[А-Яа-я Ёё a-zA-Z0-9]+$/",$login)){ if($mode==0) print "<font color=#ff0000> <small>логин</small> <b>$login</b> <small>содержит запрещенные символы</small></font>"; $_SESSION[errors]+=1; } else{ //проверка количества символов if (strlen ($login)<3 || strlen ($login)>20){ if($mode==0) print "<font color=#ff0000> <small>логин должен быть от 3 до 20 символов</small></font>"; $_SESSION[errors]+=1; } else{ //проверка среди пользователей $sql = mysql_num_rows(mysql_query("SELECT id FROM users WHERE login='$login'")); if($sql!=0){ if($mode==0) print "<font color=#ff0000> <small>логин</small> <b>$login</b> <small>занят</small></font>"; $_SESSION[errors]+=1; } else{ //если все ок, выводим сообщение зеленого цвета if($mode==0) print "<font color=#339900> <small>логин</small> <b>$login</b> <small>свободен</small></font>"; //$_SESSION[errors]=0; } } } } //**********************************************************************************************\\ function check_password($password,$mode) { //проверка количества символов if (strlen ($password)<8 || strlen ($password)>32){ if($mode==0) print "<font color=#ff0000> <small>пароль должен быть от 8 до 32 символов</small></font>"; $_SESSION[errors]+=1; } else{ //проверка запрещенных символов if(!preg_match("/^[А-Яа-яЁёa-zA-Z0-9]+$/",$password)){ if($mode==0) print "<font color=#ff0000> <small>пароль содежит недопустимые символы</small></font>"; $_SESSION[errors]+=1; } else{ //если все ок, выводим сообщение зеленого цвета if($mode==0) print "<font color=#339900> <small>пароль корректный</small></font>"; //$_SESSION[errors]=0; } } } //**********************************************************************************************\\ function check_email($email,$mode) { //проверка e-mail на валидность if(!preg_match('/^[_\.0-9a-z-]{1,}@[_\.0-9a-z-]{1,}\.[_\.0-9a-z-]{2,}$/',$email)){ if($mode==0) print "<font color=#ff0000> <small>e-mail:</small> <b>$email</b> <small>некорректный</small></font>"; $_SESSION[errors]+=1; } else{ //проверка среди пользователей $sql = mysql_num_rows(mysql_query("SELECT id FROM users WHERE email='$email'")); if($sql!=0){ if($mode==0) print "<font color=#ff0000> <small>пользователь с таким e-mail уже зарегистрирован</small></font>"; $_SESSION[errors]+=1; } else{ //если все ок, выводим сообщение зеленого цвета if($mode==0) print "<font color=#339900> <small>e-mail:</small> <b>$email</b> <small>корректный</small></font>"; //$_SESSION[errors]=0; } } } //**********************************************************************************************\\ function ip() { $ip = $_SERVER['REMOTE_ADDR']; return $ip; } //**********************************************************************************************\\ function browser() { $browser = strtoupper($_SERVER['HTTP_USER_AGENT']); if (strpos($browser, 'MSIE') !== false) { $browser = 'Internet Explorer';} else if (strpos($browser, 'FIREFOX') !== false){ $browser = 'Firefox'; } else if (strpos($browser, 'KONQUEROR') !== false){ $browser = 'Konqueror'; } else if (strpos($browser, 'LYNX') !== false){ $browser = 'Lynx'; } else { $browser = $_SERVER['HTTP_USER_AGENT']; } return $browser; } //**********************************************************************************************\\ function send_activation_code($login, $email) { $sql = mysql_fetch_array(mysql_query ("SELECT id FROM users WHERE login='$login'")); $dir='lessons'; //здесь меняем название директории с вашим проектом $sender='Администрация Проекта localhost'; //здесь меняем названия отправителя $activation = md5($sql[id]).md5($login); $subject = "Подтверждение регистрации"; $message = "Доброго времени суток ".$login."! Спасибо за регистрацию на ".$_SERVER['REMOTE_ADDR']."\n Перейдите по ссылке, чтобы активировать ваш аккаунт:\nhttp://".$_SERVER['REMOTE_ADDR']."/".$dir."/activation.php?id=".$sql[id]."&code=".$activation."\n С уважением,\n ".$sender.""; mail($email,$subject,$message, "Content-type:text/plain; Charset=windows-1251\r\n"); } //**********************************************************************************************\\ function send_new_password($password, $email) { $dir='lessons'; //здесь меняем название директории с вашим проектом $sender='Администрация Проекта localhost'; //здесь меняем названия отправителя $subject = "Восстановление пароля"; $message = "Доброго времени суток!\n Ваш новый пароль: ".$password."\n С уважением,\n ".$sender.""; mail($email,$subject,$message, "Content-type:text/plain; Charset=windows-1251\r\n"); } //**********************************************************************************************\\ ?>
check.js
Код function check_login(){ var login=$("#login").val() $.ajax({ type: "POST", url: "check.php", data: {login: login}, success: function(html) { $("#result_login").empty(); $("#result_login").append(html); } }); } function check_password(){ var password=$("#password").val() $.ajax({ type: "POST", url: "check.php", data: {password: password}, success: function(html) { $("#result_password").empty(); $("#result_password").append(html); } }); } function check_email(){ var email=$("#email").val() $.ajax({ type: "POST", url: "check.php", data: {email: email}, success: function(html) { $("#result_email").empty(); $("#result_email").append(html); } }); } function send(){ var login = $("#login").val() var password = $("#password").val() var email = $("#email").val() $.ajax({ type: "POST", url: "check.php", data: {login: login, password: password, email: email}, success: function(html) { $("#result").empty(); $("#result").append(html); } }); } function test_email(){ var email=$("#email").val() $.ajax({ type: "POST", url: "check.php", data: {test_email: email}, success: function(html) { $("#result_test_email").empty(); $("#result_test_email").append(html); } }); } function page_load(){ document.getElementById('result_login').innerHTML = '<small><font color=Silver>логин должен быть от 3 до 20 символов</font></small>'; document.getElementById('result_password').innerHTML = '<small><font color=Silver>пароль должен быть от 8 до 32 символов</font></small>'; document.getElementById('result_email').innerHTML = '<small><font color=Silver>e-mail должен быть рабочим, на него придет код активации</font></small>'; }
style.css
Код a:link {color:Blue; text-decoration:none;} a:visited {color:Blue; text-decoration:none;} a:active {color:Blue; text-decoration:none;} a:hover {color:DodgerBlue; text-decoration:none;}
body, table, div { font-family: sans-serif; font-size: 11pt; vertical-align: baseline; } input { background-color: White; border-collapse: separate; font-family: sans-serif; font-size: 9pt; vertical-align: baseline; border: 1px solid DarkGray; border-radius: 4px; width: 130px; }
.button { background-color: White; border-collapse: separate; font-family: sans-serif; font-size: 9pt; vertical-align: baseline; border: 1px solid DarkGray; border-radius: 4px; width: 60px; } .reg_email { background-color: White; border-collapse: separate; font-family: sans-serif; font-size: 9pt; vertical-align: baseline; border: 1px solid DarkGray; border-radius: 4px; width: 300px; } .round { background-color: GhostWhite; border-collapse: separate; padding: 8px; border: 1px solid DarkGray; border-radius: 8px; box-shadow: inset 0 1px 0 rgba(255,255,255,0.5), 0 2px 2px rgba(0,0,0,0.3), 0 0 4px 1px rgba(0,0,0,0.2); }
jquery-1.7.min
библиотека надеюсь не нужна?
все файлы находятся на localhost в директории ../lessons/
Прошу ваши оценки в студию, всевозможные замечания, критику, кучу матюков и тп Серьезно, выложил именно для критики и чтобы услышать мнения специалистов, что хорошо, что плохо, а что сойдет. И еще раз честно говорю, какие-то части кода подсмотрел (вернее даже не сам код, а решение, как это сделать) но старался все писать сам, выстраивая свою конструкцию. Прежде всего преследую цель создание современного удобного сайта + понять лучше где что и когда лучше использовать или неиспользовать.
Вообщем я нуб и учусь. Извините коль че не так. Надеюсь на вашу помощь (но не прошу что-то делать за меня, иначе толку в том, чем я занимаюсь?)
|
|
| |
|