www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 278b4d4780b3d05de0d81862fe405db47f32ee45
parent 21bb2972067c19061012963dcfdf3352e45d8e1d
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Wed,  2 Feb 2011 00:45:59 +0100

Création de partie : presque terminé.

Diffstat:
Mcode/serveur/php/pticlic.php | 79+++++++++++++++++++++++++++++++------------------------------------------------
1 file changed, 31 insertions(+), 48 deletions(-)

diff --git a/code/serveur/php/pticlic.php b/code/serveur/php/pticlic.php @@ -41,41 +41,52 @@ function random_node() { function cg_build_result_sets($cloudSize, $centerEid, $r1, $r2) { global $db; - // 'w' => weight (poids), 's' => select + // 'w' => weight (poids), 'd' => difficulté, 's' => select + // Le select doit ranvoyer trois colonnes : + // eid => l'eid du mot à mettre dans le nuage, + // r1 => la probabilité pour que le mot soit dans r1, entre -1 et 1 (négatif = ne devrait pas y être, positif = devrait y être à coup sûr, 0 = on sait pas). // TODO : comment mettre un poids sur random, sachant qu'il ne peut / devrait pas être dans ces select, mais plutôt un appel à random_node() ? $typer1r2 = "type in ($r1, $r2)"; $sources = array( // Voisins 1 saut du bon type (= relations déjà existantes) - array('w'=>10, 's'=>"select end as eid from relation where start = $centerEid and $typer1r2 order by random();"), + array('w'=>10, 'd'=>1, 's'=>"select end as eid, type = $r1 as r1, type = $r2 as r2 from relation where start = $centerEid and $typer1r2 order by random();"), // Voisins 1 saut via r_associated (0), donc qu'on voudrait spécifier si possible. - array('w'=>10, 's'=>"select end as eid from relation where start = $centerEid and type = 0 order by random();"), + array('w'=>10, 'd'=>2, 's'=>"select end as eid, 0 as r1, 0 as r2 from relation where start = $centerEid and type = 0 order by random();"), // Voisins 1 saut via les autres relations - array('w'=>10, 's'=>"select end as eid from relation where start = $centerEid and type not in (0, $r1, $r2) order by random();"), + array('w'=>10, 'd'=>3, 's'=>"select end as eid, 0 as r1, 0 as r2 from relation where start = $centerEid and type not in (0, $r1, $r2) order by random();"), // Voisins 2 sauts, avec un mix de R1 et R2 pour les liens. Par ex [ A -R1-> B -R2-> C ] ou bien [ A -R2-> B -R2-> C ] // Version optimisée de : "select end as eid from relation where $typer1r2 and start in oneHopWithType order by random();" - array('w'=>10, 's'=>"select B.end as eid from relation as A, relation as B where A.start = $centerEid and A.$typer1r2 and B.start = A.end and B.$typer1r2 order by random();"), + array('w'=>10, 'd'=>4, 's'=>"select B.end as eid, ((A.type = $r1) + (B.type = $r1)) / 3 as r1, ((A.type = $r2) + (B.type = $r2)) / 3 as r2 from relation as A, relation as B where A.start = $centerEid and A.$typer1r2 and B.start = A.end and B.$typer1r2 order by random();"), // Voisins 1 saut r1/r2 + 1 saut synonyme // Version optimisée de : "select end as eid from relation where start in oneHopWithType and type = 5 order by random();" - array('w'=>10, 's'=>"select B.end as eid from relation as A, relation as B where A.start = $centerEid and A.$typer1r2 and B.start = A.end and B.type = 5 order by random();"), + array('w'=>10, 'd'=>5, 's'=>"select B.end as eid, (A.type = $r1) * 0.75 as r1, (A.type = $r2) * 0.75 as r2 from relation as A, relation as B where A.start = $centerEid and A.$typer1r2 and B.start = A.end and B.type = 5 order by random();"), // Version optimisée de : "select end as eid from relation where start in (select end from relation where start = $centerEid and type = 5) and $typer1r2 order by random();" - array('w'=>10, 's'=>"select B.end as eid from relation as A, relation as B where A.start = $centerEid and A.type = 5 and B.start = A.end and B.$typer1r2 order by random();"), + array('w'=>10, 'd'=>6, 's'=>"select B.end as eid, (B.type = $r1) * 0.75 as r1, (B.type = $r2) * 0.75 as r2 from relation as A, relation as B where A.start = $centerEid and A.type = 5 and B.start = A.end and B.$typer1r2 order by random();"), // Voisins 2 sauts (tous) - array('w'=>10, 's'=>"select end as eid from relation where start in (select end from relation where start = $centerEid) order by random();"), + array('w'=>10, 'd'=>7, 's'=>"select end as eid, 0.1 as r1, 0.1 as r2 from relation where start in (select end from relation where start = $centerEid) order by random();"), // Centre pointe vers X, M pointe vers X aussi, on prend M. // Version optimisée de : "select start as eid from relation where end in (select end from relation where start = $centerEid) and type not in (4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001) order by random();" // Ce n'est toujours pas ça… : "select eid from (select B.start as eid from relation as A, relation as B where A.type not in (4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001) and A.start = $centerEid and B.type not in (4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001) and B.end = A.end limit 1) order by random();" // Tordu, mais ça marche \o/ . En fait il faut empêcher l'optimiseur de ramener le random avant le limit (et l'optimiseur est malin… :) - array('w'=>10, 's'=>"select x as eid from (select x from (select X.eid + Y.dumb as x from (select B.start as eid from relation as A, relation as B where A.type not in (4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001) and A.start = 74860 and B.type not in (4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001) and B.end = A.end limit $cloudSize) as X, (select 0 as dumb) as Y)) order by random();"), - array('w'=>10, 's'=>false) // random + array('w'=>10, 'd'=>8, 's'=>"select x as eid, -0.1 as r1, -0.1 as r2 from (select x from (select X.eid + Y.dumb as x from (select B.start as eid from relation as A, relation as B where A.type not in (4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001) and A.start = 74860 and B.type not in (4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001) and B.end = A.end limit $cloudSize) as X, (select 0 as dumb) as Y)) order by random();"), + array('w'=>10, 's'=>false) // random. Le r1 et r2 de random sont juste en-dessous ); $sumWeights = 0; foreach ($sources as $k => $x) { $sumWeights += $x['w']; if ($x['s'] !== false) { - $sources[$k]['resultSet'] = $db->query($x['s']); + $sources[$k]['resultSet'] = array(); + $res = $db->query($x['s']); + $i = 0; + while ($i < 10 && $sources[$k]['resultSet'][] = $res->fetchArray()) { + $i++; + } } else { - $sources[$k]['resultSet'] = false; + $sources[$k]['resultSet'] = array(); + for ($i = 0; $i < 10; $i++) { + $sources[$k]['resultSet'][] = array('eid'=>random_node(), 'r1'=>-1, 'r2'=>-1); + } } } return array($sources, $sumWeights); @@ -100,24 +111,19 @@ function cg_build_cloud($cloudSize, $sources, $sumWeights) { // On choisit une source aléatoire en tennant compte des poids. $rands = rand(1,$sumWeights); $sumw = 0; - $resultSet = false; // TODO : gérer l'erreur si ce n'est pas écrasé (-> random) + $res = false; // TODO foreach ($sources as $x) { $sumw += $x['w']; if ($rands < $sumw) { - $resultSet = $x['resultSet'] ? $x['resultSet'] : false; + $res = $x['resultSet']; break; } } - if ($resultSet) { - // TODO : vérifier qu'on peut fetch avant ! - if (!$res = $resultSet->fetchArray()) { - $nbFailed++; - continue; - } - $res = $res['eid']; - } else { - $res = random_node(); + if (/* dépassé la fin de ce set */) { + $nbFailed++; + continue; } + $res = $res['eid']; if (in_array($res, $cloud)) { $nbFailed++; continue; @@ -139,36 +145,13 @@ function create_game($cloudSize) { var_dump($cloud); exit; - // select neighbors 1 hop - if (!$difficulty_1 = $db->query()) { mDie(4,"Erreur dans la requête d1"); } - - - // select neighbors 2 hops - if (!$difficulty_2 = $db->query()) { mDie(4,"Erreur dans la requête d1"); } - - // select neighbors relative to the end (one hop start->end, one hop start<-end). - if (!$difficulty_3 = $db->query()) { mDie(4,"Erreur dans la requête d1"); } - - // TODO : faire les select ci-dessous en les limitant à certaines relations. $db->exec("begin transaction;"); $db->exec("insert into game(gid, eid_central_word, relation_1, relation_2, relation_3, relation_4, reference_played_game) values (null, ".$centerEid.", 1,2,3,4,null);"); $gid = $db->lastInsertRowID(); - for ($i=0; $i < $cloudSize; $i++) { - switch (rand(1,4)) { - case 1: - if ($eid = $difficulty_1->fetchArray()) { $eid=$eid['eid']; $difficulty=1; break; } - case 2: - if ($eid = $difficulty_2->fetchArray()) { $eid=$eid['eid']; $difficulty=2; break; } - case 3: - if ($eid = $difficulty_3->fetchArray()) { $eid=$eid['eid']; $difficulty=3; break; } - case 4: - $eid = random_node(); - $difficulty=4; - } - $db->exec("insert into game_cloud(gid, num, difficulty, eid_word) values(".$gid.", ".$i.", ".$difficulty.", ".$eid.");"); + foreach ($cloud as $eid) { + $db->exec("insert into game_cloud(gid, num, difficulty, eid_word) values(".$gid.", ".$i.", ".$difficulty.", ".$eid.");"); } // TODO : insert into game_played une partie de référence. - $db->exec("commit;"); }