Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Потестите игру плиз (https://javascript.ru/forum/misc/38193-potestite-igru-pliz.html)

enigmat 23.05.2013 08:16

Потестите игру плиз
 
Я недавно увлёкся javascript'ом и написал игру. Беда в том что по непонятной причине скрипт иногда зависает, при этом немного грузится проц, но страница не подаёт признаков жизни. Гуру яваскрипта, может вы заметите где там косяк?
Правила игры - нужно накопить власть 100 или уничтожить противника. каждая карта стоит ресурс который написан в нижнем углу. Ресурсы добавляются каждый ход. Дизайн ещё не доделал но думаю разберётесь.
https://c9.io/iwinalone/lernphp/workspace/Acromage.html

dmitriymar 23.05.2013 08:30

Цитата:

Сообщение от enigmat
Гуру яваскрипта, может вы заметите где там косяк?

Это шутка? Кто ту простыню будет просматривать? Да это и не форум тестеров .
Инструментов отладки( инструменты разработчика) не существует? В любом браузере есть профилировщик, запустив который можно узнать что выполняется дольше, сколько выполняется каждая функция. В тех же инструментах и ошибки можно посмотреть

enigmat 23.05.2013 08:50

Спасибо за плофилировщик, с ним ещё не работал, поищу инфу на эту тему... Но всё же мне бы хотелось чтобы профи посмотрели на код и сказали чего не хватает и что можно оптимизировать. Явных ошибок там вроде нет.

enigmat 23.05.2013 09:31

Я не могу понять в чём проблема. Просто по прошествии нескольких минут скрипт останавливается и весь браузер виснет. При обновлении страницы игра начинается заново. Может кто подскажет как от этого избавиться, ведь не всегда получается довести игру до конца

skrudjmakdak 23.05.2013 09:38

фигасе нет.. просто тупо потыкал, по кликал.. ерроры сыпятся..

Uncaught TypeError: Object #<player> has no method 'Drop'. вываливается на 373 строчке
Uncaught TypeError: Cannot call method 'reload' of null. вывалилось на 379 строчке

используйте фаербаг. в хроме вызывается f12. вкладка console

enigmat 23.05.2013 09:58

Большое спасибо, нашёл в фаербаге и исправил ошибку. AI не мог сбрасывать карты. Просто метод дроп должен писаться с маленькой буквы, а вторая вылезла из за первой. Может ещё что найдёте?:)

skrudjmakdak 23.05.2013 10:15

ммм, давайте исправленный код
или на том сайте исправили? на 379-й по прежнему валится ошибка...

enigmat 23.05.2013 10:16

Всё там же по ссылке, правлю в онлайн ide cloud9
https://c9.io/iwinalone/lernphp/workspace/Acromage.html

skrudjmakdak 23.05.2013 10:35

такое возможно из за циклов. идет бесконечный цикл(т.е. без выхода) грузится проц и притормаживает страница.. сразу нужно искать циклы..
там у вас они есть несколько, но они все с определенным интервалом? например: for (i=7;i<13;i++). разумеется здесь ни будет бесконечного цикла.. а вот есть два цикла странных..
// это первый
while( i ){
          j = Math.floor( ( i-- ) * Math.random() );
          t = b && typeof this[i].shuffle!=='undefined' ? this[i].shuffle() : this[i];
          this[i] = this[j];
          this[j] = t;
        }

//вот это второй
while(rCard===undefined){takeCard();lvl=lvl-1;}

разместите туда console.log(1) и console.log(2)
вот так:

while( i ){
          j = Math.floor( ( i-- ) * Math.random() );
          t = b && typeof this[i].shuffle!=='undefined' ? this[i].shuffle() : this[i];
          this[i] = this[j];
          this[j] = t;
         console.log(1);
        }

while(rCard===undefined){takeCard();lvl=lvl-1; console.log(2);}


откройте фаербаг, вкладка консоль и смотрите.. если туда бесконечно будут сыпаться 1 или двойки - значит у вас бесконечный цикл!

skrudjmakdak 23.05.2013 10:37

я заметил, когда это происходит в конце вашей игры..

enigmat 23.05.2013 10:42

Добавил консоли, буду смотреть...
Спасибо за подсказки в использовании отладчика)

skrudjmakdak 23.05.2013 10:54

вообще на будующее. console.log() - очень удобная функция для отладки. когда нужно проверить промежуточные данные в проге используется имеено console.log(имя_переменной); если будет передана строковая переменная то выводится будет строка, если числовая - то число, если массив - то будет выводится массив (var a = [1, 2, 3, 4]; console.log(a);) ну и так далее.. в нете можно найти лит-ру.. советую почитать

dmitriymar 23.05.2013 21:00

Цитата:

Сообщение от enigmat
Но всё же мне бы хотелось чтобы профи посмотрели на код и сказали чего не хватает и что можно оптимизировать.

давайте, когда след. раз вам придёт в голову подобная мысль , вы задумаетесь -а нужно ли кому отвлекаться от своей работы чтобы поискать за вас ошибки. ок? и будете свои желания переносить из космоса на землю.

enigmat 24.05.2013 08:24

dmitriymar - Помощь мне нужна была, и я её получил. Узнал как искать ошибки. Для этого и существуют форумы как бы. Опытному человеку достаточно беглого взгляда на код чтобы подсказать и направить. И если вам это не интересно (помогать другим), стойте молча в сторонке...

dmitriymar 24.05.2013 08:46

Цитата:

Сообщение от enigmat
Опытному человеку достаточно беглого взгляда на код чтобы подсказать и направить.

Да ща , взглянуть, код читают и на это уходит гораздо больше времени чем на его написание
А есть ещё тонкости и особенности клиентского языка , причём могут быть индивидуальные для браузеров.
А ещё алгоритмы правильные, а ещё нагрузка ....
И на это всё нужно время, понимание, глубокое тестирование . ...
На эту простыню кода нужно часов 5 тестов - беглый взгляд блин, ему так кажется ...

enigmat 24.05.2013 09:10

Я просил именно бегло осмотреть и посоветовать мне, на что обратить внимание и как лучше тестировать. Сейчас я уже продвинулся дальше, выставил правильную последовательность событий onload, добавив консоль лог на каждую функцию. Теперь стоит проблема что делать если картинка карты не загрузилась (допустим из за слабого интернета), как сделать чтобы скрипт не стопорился и попытка загрузки происходила до успешного завершения?. Копаю в сторону onerror но не пойму пока как его применить. window.onerror почему то не работает в chrome. И ещё как заставить картинку перезагрузиться (метод reload?). Если подскажете буду признателен

dmitriymar 24.05.2013 09:11

Цитата:

Сообщение от enigmat
Теперь стоит проблема что делать если картинка карты не загрузилась (допустим из за слабого интернета), как сделать чтобы скрипт не стопорился и попытка загрузки происходила до успешного завершения?. Копаю в сторону onerror но не пойму пока как его применить. window.onerror почему то не работает в chrome. И ещё как заставить картинку перезагрузиться (метод reload?). Если подскажете буду признателен

http://learn.javascript.ru/

enigmat 24.05.2013 10:13

В основном по этому учебнику и учился JS
Было бы хорошо если б в нём были ответы на все вопросы...

tsigel 24.05.2013 10:25

прочитайте про объет Image, у него есть событие onload

dmitriymar 24.05.2013 11:39

Цитата:

Сообщение от enigmat
В основном по этому учебнику и учился JS
Было бы хорошо если б в нём были ответы на все вопросы...

Сомнительное заявление учитывая что инструменты разработчика в нём описаны http://learn.javascript.ru/tools-browser-extensions ,в то время как вы только сейчас :
Цитата:

Сообщение от enigmat
Узнал как искать ошибки.

P.S все ответы на ваши вопросы в нём есть .

enigmat 24.05.2013 13:08

Дизайн я буду переделывать мне щас логику отладить надо
Пока что всё что синим себе всё что красным врагу

enigmat 24.05.2013 13:12

Цитата:

Сообщение от dmitriymar (Сообщение 252493)
Сомнительное заявление.

Я не читал учебник от и до, я искал то что нужно и кодил сразу. Может быть это не удачный подход, но так получается быстрее и понимание приходит вместе с практикой. Сейчас изучил главу про отладку.

enigmat 24.05.2013 13:15

Цитата:

Сообщение от tsigel (Сообщение 252489)
прочитайте про объет Image, у него есть событие onload

Это событие я уже использую. Проблема как раз в том что оно не наступает, если картинка не загрузилась. Как в таком случае вызвать загрузку повторно и как отловить ошибку методом onerror кроссбраузерно пока что не разобрался

enigmat 24.05.2013 13:23

Цитата:

Сообщение от nasqad (Сообщение 252498)
Я не понимаю как играть

Напишу правила игры
Цель - накопить 100 власти или уничтожить противника понизив его власть до 0.
Чем больше власти тем более высокого уровня карты приходят из колоды.
Каждая карта стоит ресурсов. Если она раскрашена оранжевым нужен труд, если зелёным, нужна пища, если синим - нужна мана.
Бывают составные карты которые стоят несколько ресурсов. Ресурс по цвету цифры в этом случае определяется.
Прогресс - труд добавляемый за ход
Магия - мана добавляемае за ход
Урожай - еда добавляемая за ход
В картах всё что красным относится к противнику, всё что синим - себе.
Ну вот вроде и всё. Скоро реализую карты с правилами. например шпион будет показывать карты противника. пока что он не делает ничего

oneguy 24.05.2013 16:50

В Фаерфоксе при клике на карту (попытке ходить) выдаётся ошибка на строке 446: ReferenceError: event is not defined. Это из-за того, что вы используете глобальную переменную event в обработчике события. Насколько я понимаю, такой способ передачи события считается устаревшим, нужно брать событие из первого параметра обработчика.

oneguy 24.05.2013 17:02

Я бы ещё посоветовал всегда использовать строгий режим, когда пишете свой код. Подробнее - здесь. Хоть и он может сломать работающий код, работать в строгом режиме легче, так как он часто выдает ошибки там, где нестрогий режим просто игнорирует операцию, а запрещает он только то, что и в нестрогом режиме делать не рекомендуется.

oneguy 24.05.2013 17:17

Вы создаете функцию this.turn и this.drop для каждого объекта, который создаёт конструктор player. Таким образом, когда вы создаёте 2 игроков, каждый из них имеет копию этих функций. Это негативно сказывается на памяти. Лучше добавить эти функции один раз в player.prototype. То же самое касается и карт.

skrudjmakdak 24.05.2013 22:18

oneguy. хочу выразится про строгий режим. то что можно работать с ним это может и хорошо. но.. если есть правила в которых указывается что перед использованием нужно ставить var, то это нужно делать.. вы свой код знайте. а если работайте в команде?? и ваш код просматривает ваш сотрудник?? и попробуй разбери.. локальная то переменная или глобальная...

лично я против этого

skrudjmakdak 24.05.2013 22:22

enigmat, попробуйте свой код сделать с использованием библиотеки jquery. конечно нужно время для изучения этой библиотеки. о том как она работает. но у нее есть плюс. она кроссбраузерная. документацию можно найти в нете, даже на русском.. вот офиц сайт http://jquery.com/
на этом же сайте можно и скачать библиотеку

oneguy 24.05.2013 22:39

skrudjmakdak,
вы что-то перепутали. Одно другому не противоречит. Строгий режим запрещает создавать глобальные переменные неявным способом, а через var - разрешает.

enigmat 04.06.2013 16:50

Итак, теперь всё играбельно.
Я написал ИИ, теперь он не рандомный.
Переделал дизайн немного.
Сделал игру рабочей во всех популярных браузерах.
Спасибо большое всем за советы. Скоро перепишу код с использованием use strict и разберусь с созданием методов в prototype, ну а до jquery доберусь когда освоюсь получше с javascript'ом.
Жду ещё ваших советов и замечаний по оптимизации кода.


Часовой пояс GMT +3, время: 20:12.