This commit is contained in:
Bertrand BRUN 2011-02-04 13:37:12 +01:00
commit 144e9dfb99
6 changed files with 106 additions and 24 deletions

View File

@ -10,11 +10,11 @@
</intent-filter>
</activity>
<activity android:name=".Preference" android:label="Préférence"></activity>
<activity android:name=".games.BaseGame"></activity>
<activity android:label="Information" android:name=".Information"></activity>
<activity android:name=".Score" android:label="Score"></activity>
<activity android:name=".FrontPage"></activity>
<activity android:name=".Preference" android:label="Préférence" android:screenOrientation="portrait"></activity>
<activity android:name=".games.BaseGame" android:screenOrientation="portrait"></activity>
<activity android:label="Information" android:name=".Information" android:screenOrientation="portrait"></activity>
<activity android:name=".Score" android:label="Score" android:screenOrientation="portrait"></activity>
<activity android:name=".FrontPage" android:screenOrientation="portrait"></activity>
</application>

View File

@ -13,30 +13,28 @@
<ImageView android:layout_height="wrap_content"
android:text="@string/play_label" android:layout_width="wrap_content"
android:id="@+id/play" android:clickable="true" android:padding="30dip" android:src="@drawable/mode_normal"/>
android:id="@+id/play" android:clickable="true" android:padding="30dip"
android:src="@drawable/mode_normal"/>
<ImageView android:src="@drawable/config" android:layout_height="wrap_content" android:id="@+id/prefs"
<ImageView android:src="@drawable/config"
android:layout_height="wrap_content" android:id="@+id/prefs"
android:layout_width="wrap_content" android:layout_below="@+id/play"
android:layout_alignLeft="@+id/play" android:layout_alignRight="@+id/play" android:padding="30dip"></ImageView>
android:layout_alignLeft="@+id/play" android:layout_alignRight="@+id/play"
android:padding="30dip"></ImageView>
</RelativeLayout>
</RelativeLayout>
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_height="wrap_content" android:layout_width="fill_parent" android:orientation="vertical" android:layout_weight="1">
android:layout_height="wrap_content" android:layout_width="fill_parent"
android:orientation="vertical" android:layout_weight="1">
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent" android:textStyle="bold"
android:gravity="center_horizontal" android:text="@+id/login"
android:id="@+id/login"></TextView>
<ImageView android:layout_height="wrap_content" android:id="@+id/infoButton"
android:layout_width="wrap_content" android:layout_gravity="right" android:layout_weight="5"
android:clickable="true" android:src="@drawable/aide"/>
android:layout_width="wrap_content" android:layout_gravity="right"
android:layout_weight="5" android:clickable="true" android:src="@drawable/aide" />
</LinearLayout>

View File

@ -9,13 +9,11 @@ import org.pticlic.model.Network;
import org.pticlic.model.Network.Mode;
import org.pticlic.model.Relation;
import android.R.anim;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.Display;

View File

@ -229,16 +229,26 @@ function main($action) {
} else if($action == 1) { // "Set partie"
// Requête sql d'ajout d'informations (et calcul de résultat).
// TODO : nettoyer, finir
$gid = $_GET['gid']; // TODO : vérifier qu'on a bien distribué cette partie à cet utilisateur, et qu'il n'y a pas déjà répondu (répercuter ça sur le random_game).
$userReputation = 5; // TODO : un nombre entre 0 et 5 environ. Par ex. log(pointsUtilisateur) est un bon choix.
$gid = $_GET['gid'];
if(ĝid != $db->querySingle("SELECT gid FROM played_game WHERE login='".$user."'"))
mdie(3,"Cette partie n'est associée à votre nom d'utilisateur");
$userReputation = log($db->querySingle("SELECT score FROM user WHERE login='".$user."'"));
$db->exec("begin transaction;");
$db->exec("insert into played_game(pgid, gid, login) values (null, $gid, null);");
$db->exec("INSERT INTO played_game(pgid, gid, login) VALUES (null, $gid, null);");
$pgid = $db->lastInsertRowID();
for ($i=0; $i < 10; $i++) {
for($i=0; $i < 10; $i++)
{
$x = $_GET['$i'];
// TODO : calculer le score. Score = proba[réponse de l'utilisateur]*coeff - proba[autres reponses]*coeff
// TODO : adapter le score en fonction de la réputation de l'utilisateur (plus quand il est jeune, pour le motiver, par ex. avec un terme constant qu'on ajoute).
$score = 1;
$db->exec("insert into played_game_cloud(pgid, gid, type, num, relation, weight, score) values($pgid, $gid, 1, ".$c['pos'].", $r1, ".($x*$userReputation).", ".$score.");");
// TODO : game_cloud(probaR_x_) += $réputationJoueur * $coeff
// TODO : game_cloud(totalWeight) += $réputationJoueur * $coeff (NOTE : même coeff que pour game_cloud(probaR_x_))

View File

@ -1,3 +1,24 @@
- Une classe Constante pour toutes les constantes ("symboles" pour les paramètres, ...).
- Boutons pour les différents modes de jeu directement sur la "page de garde".
- Icônes : http://developer.android.com/guide/practices/ui_guidelines/icon_design.html
NOTES SUITE A LA REUNION
- addiction -> IMPORTANT ... teasing socialisation
- choix de la thématique : cadeau thématique
- game with a purpose GWAP
- espi
- liberman (sp?)
- indexation des images Google
- code pour Google.com code.google.com/intl/fr~FR/apis/chart/index.html
- qrcode
- lire sur site pour installer appli
- bêta testeurs externes
- intuitivité
- réflexion : intuitivité - prototypes -
- bouton aide -> affiche les icônes en vertical + texte, il y a moins de place pour le mot du nuage, mais on peut continuer à jouer en cliquant sur ces "gros" boutons.
- Modes de jeu supplémentaires payants par ex.
POUR LAFOURCADE
- lien : code.google.com/intl/fr~FR/apis/chart/index.html
- note techniques exactes pour le serveur au LIRMM

View File

@ -60,6 +60,45 @@ Un grand nombre de développeurs ont créés des applications pour étendre la f
\section{Conception}
\begin{verbatim}
NODE(EID integer primary key autoincrement, name string, #type (ref TYPE_NODE.num), weight);
RELATION(RID integer primary key autoincrement, #start (ref NODE.eid), #end (ref NODE.eid), #type (ref TYPE_RELATION.num), weight);
TYPE_NODE(NUM, name string);
TYPE_RELATION(NUM, name string, extended_name string, info string);
USER(LOGIN string primary key, mail string, hash_passwd string (md5sum du password), #score (contrainte : somme de tous les scores des PLAYED_GAME_CLOUD);
GAME(GID integer primary key autoincrement, #eid_central_word (ref NODE.eid, #relation_1 (ref RELATION.rid), #relation_2 ( (ref RELATION.rid), difficulty);
GAME_CLOUD(GID, NUM, difficulty, #eid_word(ref NODE.eid), totalWeight (contrainte : = somme des probas), probaR1 (contrainte : = somme des probas des PLAYED_GAME_CLOUD.weight avec la bonne relation et la même gid et num), probaR2 (idem), probaR0 (idem), probaTrash (idem));
PLAYED_GAME(PGID integer primary key autoincrement, #gid (ref GAME.gid), #login (ref USER.login);
PLAYED_GAME_CLOUD(#PGID (ref PLAYED_GAME.pgid), #GID (ref PLAYED_GAME.gid), NUM, type (contrainte : 0 = partie de référence, 1 = réponse d'un joueur), #relation (ref RELATION.rid), weight (contrainte : probabilité estimée de cette réponse pour les bots (robots), réputation du joueur sinon), score (score donné au joueur, 0 pour les bots);
**INT unless otherwise marked
\end{verbatim}
\begin{verbatim}
create table node(eid integer primary key autoincrement, name, type, weight);
create table relation(rid integer primary key autoincrement, start, end, type, weight);
create table type_node(name, num);
create table type_relation(name, num, extended_name, info);
create table user(login primary key, mail, hash_passwd, score);
create table game(gid integer primary key autoincrement, eid_central_word, relation_1, relation_2, difficulty);
create table game_cloud(gid, num, difficulty, eid_word, totalWeight, probaR1, probaR2, probaR0, probaTrash);
create table played_game(pgid integer primary key autoincrement, gid, login);
create table played_game_cloud(pgid, gid, type, num, relation, weight, score);
create index i_relation_start on relation(start);
create index i_relation_end on relation(end);
create index i_relation_type on relation(type);
create index i_relation_start_type on relation(start,type);
create index i_relation_end_type on relation(end,type);
\end{verbatim}
TODO: UML, diagrammes de classes, Use cases, etc...
@ -87,6 +126,22 @@ TODO: UML, diagrammes de classes, Use cases, etc...
\item Caractères non échappés dans le dump de la base.% gd
\end{itemize}
\subsubsection{Itération 1, semaine 3}
\begin{itemize}
\item SQLite3 n'est pas capable d'utiliser un index pour la requête extérieure sur une requête du type
\begin{verbatim}
select * from (select * from table where condition) where condition
\end{verbatim}
Donc nécessité de ré-écrire certaines requêtes avec des jointures à priori beaucoup moins efficaces, mais qui le sont plus grâce aux index.
\item SQLite3 tranforme les requêtes de la forme~:
\begin{verbatim}
select * from table limit 100 order by random();
\end{verbatim}
en une requête qui récupère tout le set de résultats, ajoute une colonne random(), prend les 100 premiers résultats et les trie. Mais cela
l'oblige à récupérer tout le set de résultats, et calculer le random() pour chaque ligne, pour ensuite jeter tout ce qui dépasse la ligne
100. Cela est évidemment très coûteux dans le cadre de requêtes avec beaucoup de résultats, et nous avons donc dû isoler la requête avec
\verb!limit! de son \verb!order by! avec des «hacks» assez tordus.
\end{itemize}
\section{Conclusions}