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:
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;");
}