Créé dans le cadre du projet de fin d'année de la promo 2018 de CIR2 de l'ISEN Brest/Rennes, le Burger Quizz est une adaptation numérique du jeu télévisé éponyme, plus précisément d'une épreuve spécifique de ce jeu : le "Sel ou Poivre".

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /**************************************************
  2. ** GAME VARIABLES
  3. **************************************************/
  4. var socket; // Socket
  5. var gameInfos;
  6. /**************************************************
  7. ** GAME INITIALISATION
  8. **************************************************/
  9. var disconnect = true;
  10. var scoreAdversaire = 0;
  11. var pseudo ='';
  12. var reponseUser = -1, bonneReponse;
  13. function init() {
  14. var hostname = $('script')[1]['src'].match(/http:\/\/(.+)\:/)[1];
  15. // Connexion à socket.io
  16. socket = io.connect('http://'+hostname+':8000');
  17. // Gestion des evenements
  18. setEventHandlers();
  19. // On demande le pseudo a l'utilisateur, on l'envoie au serveur et on l'affiche dans le titre
  20. $("#game").html("<input type=\"text\" id=\"pseudo\" placeholder=\"Nom ou pseudonyme\" /><input type=\"submit\" id=\"start\" value=\"Valider\" />");
  21. $("#start").on("click", function() {
  22. pseudo = $("#pseudo").val();
  23. socket.emit('nouveau', pseudo);
  24. document.title = $("#pseudo").val() + ' - ' + document.title;
  25. $("#game").html("Recherche d'un adversaire...");
  26. });
  27. $("#pseudo").on('keypress', function(event) {
  28. if(event.which == 13) {
  29. pseudo = $("#pseudo").val();
  30. socket.emit('nouveau', pseudo);
  31. document.title = $("#pseudo").val() + ' - ' + document.title;
  32. $("#game").html("Recherche d'un adversaire...");
  33. }
  34. });
  35. };
  36. /**************************************************
  37. ** GAME EVENT HANDLERS
  38. **************************************************/
  39. var setEventHandlers = function() {
  40. socket.on("message", onMessage);
  41. socket.on("autres", onAutres);
  42. socket.on("game", onGame);
  43. socket.on("questions", play);
  44. socket.on("lolheded", endGame);
  45. socket.on("end", onEnd);
  46. socket.on("qpass", function() {
  47. reponseUser = -1;
  48. checkAnswer();
  49. })
  50. };
  51. function onEnd(score) {
  52. disconnect = false;
  53. scoreAdversaire = score;
  54. endGame();
  55. }
  56. function onGame(game) {
  57. gameInfos = game;
  58. $("#game").html("Adversaire trouvé : "+game[0]+"<br />Début de la partie dans 5s.");
  59. window.setTimeout(function() {
  60. socket.emit('start', gameInfos[1])
  61. }, 5000);
  62. }
  63. function onMessage(message) {
  64. alert(message);
  65. };
  66. function onAutres(pseudo) {
  67. alert("Voici un nouveau joueur : " + pseudo);
  68. };
  69. /**************************************************
  70. ** GAME ENGINE (SORT OF)
  71. **************************************************/
  72. // IDs
  73. var id_cat = 0, id_theme = 0, id_quest = 0;
  74. // Shortcuts
  75. var json, category, theme;
  76. // Timer
  77. var timing = 5, secRestantes, timer;
  78. var baseWidth;
  79. var score = 0;
  80. var canClick = true;
  81. function apiReq() {
  82. $.ajax({
  83. async: false,
  84. url: "../../api/",
  85. dataType: 'json',
  86. success: function(data) {
  87. json = data;
  88. }
  89. });
  90. }
  91. function loadCat(id) {
  92. if(id === 0) category = json.cat1;
  93. if(id === 1) category = json.cat2;
  94. console.log(category);
  95. $("#game").html("<p id=\"category\">Catégorie : "+category.nom_cat+"</p>");
  96. $("#game").append("<div id=\"theme\"></div>");
  97. $("#game").append("<div id=\"timer\" style=\"width:100%;height:20px;background:green\"></div>");
  98. $("#game").append("<div id=\"score\"></div>");
  99. loadTheme(id_theme);
  100. }
  101. function loadTheme(id) {
  102. theme = category.themes[id];
  103. $("#theme").html("<p id=\"question\"></p>");
  104. $("#theme").append("<ul id=\"answers\"><li id=\"rep1\">"+theme.reponse1+"</li>"
  105. +"<li id=\"rep2\">"+theme.reponse2+"</li><li id=\"both\">Les deux</li></ul>");
  106. quest(id_quest);
  107. }
  108. function quest(id) {
  109. $("#question").html(theme.questions[id].intitule);
  110. startTimer();
  111. bonneReponse = parseInt(theme.questions[id].bonneReponse);
  112. console.info('Question ' + (id_quest + 1) + '/' + theme.questions.length + ' : '
  113. +theme.questions[id].intitule);
  114. if(canClick) {
  115. $("#rep1").off('click');
  116. $("#rep1").one("click", function() { reponseUser = 1; checkAnswer(); socket.emit('nextQuestion'); });
  117. $("#rep2").off('click');
  118. $("#rep2").one("click", function() { reponseUser = 2; checkAnswer(); socket.emit('nextQuestion'); });
  119. $("#both").off('click');
  120. $("#both").one("click", function() { reponseUser = 0; checkAnswer(); socket.emit('nextQuestion'); });
  121. }
  122. }
  123. function checkAnswer() {
  124. canClick = false;
  125. $("#rep1").off('click');
  126. $("#rep2").off('click');
  127. $("#both").off('click');
  128. stopTimer();
  129. if(reponseUser == bonneReponse) {
  130. score += secRestantes+1;
  131. }
  132. $("#score").html("Score : "+score);
  133. switch(bonneReponse) {
  134. case 0: $("#rep1").addClass("wrong-answer");
  135. $("#rep2").addClass("wrong-answer");
  136. $("#both").addClass("good-answer");
  137. break;
  138. case 1: $("#rep1").addClass("good-answer");
  139. $("#rep2").addClass("wrong-answer");
  140. $("#both").addClass("wrong-answer");
  141. break;
  142. case 2: $("#rep1").addClass("wrong-answer");
  143. $("#rep2").addClass("good-answer");
  144. $("#both").addClass("wrong-answer");
  145. break;
  146. }
  147. window.setTimeout(nextQuestion, 2000);
  148. }
  149. function nextQuestion() {
  150. $("#rep1").removeClass();
  151. $("#rep2").removeClass();
  152. $("#both").removeClass();
  153. canClick = true;
  154. // Dernière question du thème en cours
  155. if((id_quest+1) == theme.questions.length) {
  156. // Dernier thème de la catégorie en cours
  157. if((id_theme+1) == category.themes.length) {
  158. // Dernière catégorie
  159. if((id_cat+1) == 2) {
  160. pauseGame();
  161. } else {
  162. id_quest = 0;
  163. id_theme = 0;
  164. id_cat++;
  165. loadCat(id_cat);
  166. }
  167. } else {
  168. id_quest = 0;
  169. id_theme++;
  170. loadTheme(id_theme);
  171. }
  172. } else {
  173. id_quest++;
  174. quest(id_quest);
  175. }
  176. }
  177. function play(questions) {
  178. json = questions;
  179. loadCat(id_cat);
  180. }
  181. function startTimer() {
  182. $("#timer").css("width", "100%");
  183. baseWidth = $("#timer").width();
  184. $("#timer").animate({'width' : '0%'}, timing*1000);
  185. timer = window.setTimeout(checkAnswer, timing*1000);
  186. }
  187. function stopTimer() {
  188. window.clearTimeout(timer);
  189. $("#timer").stop();
  190. secRestantes = Math.round($("#timer").width()/baseWidth*timing);
  191. }
  192. function pauseGame() {
  193. $("#game").html("<h2 id=\"score\">Vous avez marqué "+score+" miams</h2>"
  194. +"<p id=\"registerScore\">En attente de l'adversaire...</p>");
  195. // On indique au serveur qu'on a fini
  196. var options = [gameInfos[1], score];
  197. socket.emit('findugame', options);
  198. }
  199. function endGame() {
  200. stopTimer();
  201. $("#game").html("<h2 id=\"score\">Vous avez marqué "+score+" miams</h2>"
  202. +"<p id=\"registerScore\">");
  203. if(disconnect) {
  204. $("#game").append(gameInfos[0]+" s'est déconnecté.");
  205. } else {
  206. $("#game").append("Votre adversaire a marqué "+scoreAdversaire+" miams.<br />Le gagnant est... ");
  207. if(score > scoreAdversaire) {
  208. $("#game").append(pseudo+" (vous).");
  209. } else if(score < scoreAdversaire) {
  210. $("#game").append(gameInfos[0]+".");
  211. } else {
  212. $("#game").append("personne (égalité).");
  213. }
  214. }
  215. $("#game").append("</p>");
  216. }
  217. function addScore(userLogin, userScore) {
  218. $.ajax({
  219. async: false,
  220. url: "../../api/?page=palmares",
  221. type: "POST",
  222. dataType: 'json',
  223. data: {login: userLogin, score: userScore},
  224. success: function(data) {
  225. json = data;
  226. }
  227. });
  228. }
  229. function displayScores() {
  230. $.get("./api/?page=palmares", function(data) {
  231. var list = "<ol>";
  232. for(var i = 0; i < 10; i++) {
  233. list += "<li>"+data[i].login+" - "+data[i].score+"</li>";
  234. }
  235. list += "</ol>";
  236. $("#palmares").html(list);
  237. });
  238. }