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".

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