Някой може ли да помогне за решаването на проблемите споменати в тази тема
http://www.google.com/search?hl=en&q=meta+refresh
Но няма да може да се направи така, че да опреснява след като противникът е играл, а просто през някакъв интервал. Може би има начин всеки юзер да си избира след колко време...
Не съм от най-вещите в областта, но по принцип не би трябвало да е трудно. Ако става въпрос за слагане на код в страница, която да се рефрешва сама , най-елементарното, което да свърши работа според мен е:
Слага се между <head></head> таговете. Цифрата (в случая 10000) показва интервала на презареждане в милисекунди.Код:<script type=text/javascript> setTimeout('document.location=document.location',10000); </script>
Иначе, по някои от браузърите си има и настройки мисля, сам да си зададеш да се презарежда дадена страница. Трябва да се порови малко тук...
Това не е решение за платен хостинг с лимитиран трафик. Не може ли нещо със скрит фрейм който да проверява дали има местене и да рефрешва ако има ход?
Така както аз го разбрах има начини, но не само html + http, а примерно с аплетче.
Иначе няма как сървъра да стане инициатор на функцията, без заявка от клиента.
Идеята е малко подобна на това което предлагате с автоматичния рефреш на някакво време. Правиме един скрит фрейм който на н-минути проверява базата данни дали няма нов ход и ако има тогава реферешва цялата страница. Принципно знам че може да стане, трафика е по-малко, но от java не разбирам бъкел. То не че от html и php разбирам много, но поне имам идя.
Прав си, има такъв начин със скрит фрейм, но още ровя да намеря подробности.
Но имало и нещо ново и по-добро - нарича се AJAX. Май първо за него ще почета...
//
http://spisanie.com/downloads.php (брой 2/2005)
AJAX е cutting edge технология в момента общо взето, тепърва се правят големи неща с него, но ми се струва, че ти трябва солидни JavaScript познания за да нагазиш там.
Ето какво научих от добри хора:
Това рефрешва невидимия прозорец през 1 секунда.Код:<head> <script type=text/javascript> setTimeout('document.location=document.location',10000); </script> </head> <body> <iframe frameborder="1" src="chess.php" width="100" height="100" onLoad="setTimeOut"></iframe> </body>
За да се опреснява само когато е налице дадено условие, трябва да се вмъкне функция:
Като гледам полетата на таблицата, си мисля, че трябва да се проверява за дадената партия (`game_id`) дали полето `fen_active_color`се е променило. След всеки ход инициализираме един флаг със стойност "цвета на нашите фигури" (`b`/`w`) и периодически го сравняваме с въпросното поле от базата, докато получим, че са различни съвпадат (пак ние сме на ход).Код:function neshtosi($parametur, $what) { $table = getLang().'_nqkyde si'; if (($parametur == "") or ($parametur == undefined)) { $q = "SELECT * FROM ".$table." WHERE `where` = '0'"; } else { $q = "SELECT * FROM ".$table." WHERE `pid` = '".$_GET['id']."'"; } $qr = mysql_query($q); $r = mysql_fetch_array($qr); return $r[$what]; }
Но не съм сигурна в значението на тази променлива. В нея може да се пази не информация кой отбор е на ход, а кой отбор праща заявката към базата (т.е. "аз играя с белите, дай ми страницата, която се отнася за тях").
Друг начин е да ползваме полето `fen_fullmove_number`. В него явно се пази номерът на последния изигран ход. В началото ще се инициализира флагът със стойността му от базата, след като местим, стойността ще се увеличава с 1 и ще се чака до момента, в който станат различни.
Дано обаче тук под "ход" не разбират поредица от два хода - един на белите и един на черните.
Ако този код е вкаран в главната страница, в която е и 'невидимия' прозорец, той ще рефрешва нея (главаната), която ще извика и невидимия с нея си и така всичко се рефрешва. АКо идеята е да се рефрешва невидима рамка в страница през ХХХ сек мисля, че е достатъчноПървоначално публикувано от Bibi
дано не подведа някого.Код:<html> <head> </head> <body> ... <iframe frameborder="1" src="chess.php" width="100" height="100" onLoad="setTimeout('document.location=document.location',XXX000)"></iframe> ... </body> </html>
Това е таблицата. Наличието на тези `white_uid`, `black_uid` ме кара да мисля, че `fen_active_color` ще ни свърши работа.CREATE TABLE `7812256881_chess_games` (
`game_id` int(10) unsigned NOT NULL auto_increment,
`white_uid` mediumint(8) unsigned NOT NULL default '0',
`black_uid` mediumint(8) unsigned NOT NULL default '0',
`create_date` datetime NOT NULL default '0000-00-00 00:00:00',
`start_date` datetime NOT NULL default '0000-00-00 00:00:00',
`last_date` datetime NOT NULL default '0000-00-00 00:00:00',
`fen_piece_placement` varchar(71) NOT NULL default 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR',
`fen_active_color` enum('w','b') NOT NULL default 'w',
`fen_castling_availability` varchar(4) NOT NULL default 'KQkq',
`fen_en_passant_target_square` char(2) NOT NULL default '-',
`fen_halfmove_clock` smallint(5) unsigned NOT NULL default '0',
`fen_fullmove_number` smallint(5) unsigned NOT NULL default '1',
`pgn_fen` varchar(100) NOT NULL default '',
`pgn_result` varchar(7) NOT NULL default '*',
`pgn_movetext` text NOT NULL,
`offer_draw` enum('','w','b') NOT NULL default '',
`suspended` text NOT NULL,
`white_confirm` enum('0','1') NOT NULL default '1',
`black_confirm` enum('0','1') NOT NULL default '1',
PRIMARY KEY (`game_id`)
)
ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
`fen_halfmove_clock` пък е причината да се усъмня в смисъла на полето `fen_fullmove_number`.
Ако някой забележи друг параметър, който може да играе роля при взимането на решение, моля да каже.
Само се сетих да добавя, че е добре да има опресняване не само когато противникът е местил, а и когато е предложил реми или се предава. Тогава едва ли броят на ходовете се променя и значи те не са добър критерий.
//
Още нещо ми хрумна. За да може и при "кибиците" да се актуализира страницата след всеки игран ход, инициализирането и проверката на онзи флаг, трябва да се направи по друг начин.
`white_uid`, `black_uid` Са указатели към таблицата с потребителите на сайта. Всъщност това показва кой с кого играе. Или поне така си мисля. Скрипта не съм го писал аз, изполвам го на готово. `fen_halfmove_clock` и `fen_fullmove_number` според мен имат отношение само към записването на играта в pgn формат и изрисуването на позицията.
Биби мисля че митко е прав за рефреша. Така написан кода ще рефрешва цялата страница не само скрития фрейм.
Трябва да помислиме как да спреме рефреша на скрития фрейм когато трябва ние да играеме. Безмислено е да се рефрешва след като сме ние на ход.
// Това е относително лесно. Трябва да се включи един if при рефреша на цялата страница ако сме ние на ход кода за скрития фрейм се пропуска.
// Това е сайта на порталната система която ползвам.
От тук можете да свалите последната версия на шах модула.
А от базата няма ли начин да се извади броя изиграни ходове?
По-точно: то, че има начин, е сигурно.
Въпросът ми по-скоро е как да стане с тази конкретна база.
С length(историята на партията) или директно с онази променлива, или с комбинация между нейната стойност и онова b/w поле?
Искам да кажа да направиш малко експерименти, за да видим какво се записва в полетата `fen_fullmove_number` - след всеки ход ли се увеличава стойността им или след двойка ходове.
И променя ли се стойността, ако играчът предложи реми, или се предаде?
Създадох игра срещу себеси. Без да е играно нищо данните в таблицата са:
fen_active_color=w;
fen_halfmove_clock=0;
fen_fullmove_number=1;
Ход с белите ->
fen_active_color=b;
fen_halfmove_clock=1;
fen_fullmove_number=1;
Ход с черните ->
fen_active_color=w;
fen_halfmove_clock=0;
fen_fullmove_number=2;
Ход с белите ->
fen_active_color=b;
fen_halfmove_clock=1;
fen_fullmove_number=2;
Ход с черните ->
fen_active_color=w;
fen_halfmove_clock=0;
fen_fullmove_number=3;
Предаване ->
fen_active_color=w;
fen_halfmove_clock=0;
fen_fullmove_number=3;
Реми както се сещате сам на себеси не мога да предложа
Ако някой иска да се включи да изтестваме в реална игра как стават нещата.
Тъй като никой от изявените ни участници в раздела Вебдевелопмент и радетелите за настоящия раздел "програмиране' не прояви се инициатива, на добра воля впрегнах минималните си познания в областта. Според мен всяко 'решение' в партията се записва като ходове в полето pgn_movetext от таблицата xoops_chess_games (xoops=представката която изпозлвам за инсталацията си). Резонно идеята е да се направи скрита рамка рамка която да провеверява въпросното поле (задал съм го на минута) и ако дължината му е нарастнала (има ново действие) да поскаже на 'родителя' да се опресни. Резулатът е прикачен по-долу. В хронологичне ред:
- променил съм функция chess_create_game() в create.php да ъздава още една таблица с две полета - за коя партия иде реч и поле BODYCOUNT което съдържа стойността за направените ходове до момента
- в game.php има един ред за добавяне на 'скритата' рамка skrita.php иопресняването и на ХХХ секунди (1 мина съм задал)
- skrita.php проверява стийоността на pgn_movetext от таблицата xoops_chess_games (xoops=представката която изпозлвам за инсталацията си) и сравнява BODYCOUNT. ако има промяна праща заявка на родителя(game.php?=КОЯ_ИГРА) да се опресни
Вероятно не е най удачното, но поне е начало.Тествал съм го за няколко игри и работеше. Зип файлът съдържа трите [create.php, game.php, skrita.php] които да направят промените (бекъп първо, плийз )
Тепърва предполагам трябва да го тестваме пълно и / или да променим според нуждите също както и някой да тества трафика който генерира (към това се стремим все пак май)
Никога преди не съм виждал виждал пхп+MySql през живота си , а и по настоящем се измъчвам на един PII 400МHz с 128МБ РАМ и си е*** м****. хелп!
[attachment deleted by admin]