Skip to content

Commit

Permalink
update classic game controller
Browse files Browse the repository at this point in the history
  • Loading branch information
hoangkimminh committed Apr 13, 2019
1 parent 5b0c9ba commit 3c444e6
Show file tree
Hide file tree
Showing 9 changed files with 324 additions and 60 deletions.
2 changes: 1 addition & 1 deletion app.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const flash = require("connect-flash");
const validator = require("express-validator");
var indexRouter = require("./routes/index");
var usersRouter = require("./routes/user");
var gamesRouter = require("./routes/game");
var gamesRouter = require("./game-api/routes/game");

var app = express();

Expand Down
103 changes: 103 additions & 0 deletions game-api/controllers/game-controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
const Sequelize = require("sequelize");
const models = require("../../models");
const Question = models.question;
const UserDetails = models.userdetails;
const utils = require("../../utils/utils");

exports.getGamePage = function(req, res) {
console.log(req.user);
res.render("games/classic", {
title: "Classic",
isLogged: req.isLogged,
username: req.user
? req.user.firstname + " " + req.user.lastname
: "Not logged in"
});
};

exports.getARandomTopicQuestion = function(req, res) {
Question.findOne({
order: [[Sequelize.fn("RAND")]],
limit: 1
})
.then(data => {
var answers = utils.shuffleArray([
data.dataValues.answer,
data.dataValues.falseAnswer1,
data.dataValues.falseAnswer2,
data.dataValues.falseAnswer3
]);
const question = {
topic: data.dataValues.topic,
question: data.dataValues.question,
answerA: answers[0],
answerB: answers[1],
answerC: answers[2],
answerD: answers[3]
};
res.send(question);
})
.catch(err => {
console.log(err);
});
};

exports.checkAnswer = function(req, res) {
const submitData = req.body;
//get current user
var user = req.user;
//find user'details inorder to update information
UserDetails.findOne({ where: { user_id: user.id } }).then(userDetails => {
console.log("USER DETAILS: " + userDetails);
Question.findOne({ where: { question: submitData.question } })
.then(data => {
console.log(data.dataValues);
//if user had true answer, send result
if (data.dataValues.answer === submitData.answer) {
res.send({ result: true });
// update true quiz quantity
userDetails.update({
trueQuizQuantity: userDetails.dataValues.trueQuizQuantity + 1
});
//update true quiz series
userDetails.update({
currentTrueQuizSeries:
userDetails.dataValues.currentTrueQuizSeries + 1
});
//if current true quiz series is greater than true quiz series, update
if (
userDetails.dataValues.currentTrueQuizSeries >
userDetails.dataValues.trueQuizSeries
) {
userDetails.update({
trueQuizSeries: userDetails.dataValues.currentTrueQuizSeries
});
}
console.log(userDetails.dataValues.trueQuizQuantity);
//if user had false answer, send result and update false quiz quantity
} else {
res.send({ result: false });
//current true quiz series back to 0
userDetails.update({
falseQuizQuantity: userDetails.dataValues.falseQuizQuantity + 1,
currentTrueQuizSeries: 0
});
console.log(userDetails.dataValues.falseQuizQuantity);
}
})
.catch(err => {
console.log(err);
});
});
};

exports.getTrueAnswer = function(req, res) {
const ques = req.body;
Question.findOne({ where: { question: ques.question } })
.then(data => {
res.send(data.answer);
})
.catch(err => {
console.log(err);
});
};
17 changes: 17 additions & 0 deletions game-api/routes/game.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
var express = require("express");
var router = express.Router();
var controller = require("../controllers/game-controller");
const utils = require("../../utils/utils");
/* GET classic game page */
router.get("/classic", utils.isLoggedIn, controller.getGamePage);

/* GET a question */
router.get("/getQuestion", controller.getARandomTopicQuestion);

/* POST an answer and check it */
router.post("/getAnswer", controller.checkAnswer);

/* Get true answer */
router.post("/getTrueAnswer", controller.getTrueAnswer);

module.exports = router;
21 changes: 17 additions & 4 deletions public/javascripts/QuizGame.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class QuizGame {
this.checkMaxQuestionAmount();
this.isAnswered = true;
}
$("#nextQuestion").show();
}

/**
Expand All @@ -84,7 +85,11 @@ class QuizGame {
});
}
);
this.checkMaxQuestionAmount();
if (!this.checkMaxQuestionAmount()) {
$("#nextQuestion").show();
} else {
this.showEndGameStage();
}
}

/**
Expand All @@ -102,6 +107,7 @@ class QuizGame {
this.currentQuestionIndex++;
this.isAnswered = false;
});
$("#nextQuestion").hide();
}

/**
Expand All @@ -117,9 +123,16 @@ class QuizGame {
*/
checkMaxQuestionAmount() {
if (this.currentQuestionIndex == this.maxQuestionAmount) {
$("#newGame").text(
"Kết thúc. Bạn được " + this.score + "/" + this.maxQuestionAmount
);
return true;
}
return false;
}

showEndGameStage() {
$("#game-stage").hide();
$("#end-stage").show();
$("#result").text(
"Bạn trả lời đúng: " + this.score + "/" + this.maxQuestionAmount
);
}
}
44 changes: 31 additions & 13 deletions public/javascripts/classic-mode-controller.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,45 @@
//countdown timer
var game;
var isAnswered = false;

function startNewGame() {
game = new QuizGame(10);
game.resetStyle();
game.progressCountdown(10).then(value => {
if (value) {
game.getTrueAnswer();
}
});
game.getARandomQuestion();
isAnswered = false;
}

function nextQuestion() {
game.resetStyle();
game.progressCountdown(10).then(value => {
if (value) {
game.getTrueAnswer();
}
});
game.getARandomQuestion();
isAnswered = false;
}

//get next question
$(document).ready(function() {
//get a random question
$("#newGame").click(() => {
game = new QuizGame(10);
$("#newGame").text("Ván mới");
$(".start-btn").click(() => {
$("#intro-stage").hide();
$("#game-stage").show();
$("#end-stage").hide();
startNewGame();
});
$("#nextQuestion").click(() => {
game.resetStyle();
game.progressCountdown(10).then((value) => {
if(value) {
game.getTrueAnswer();
}
}
);
game.getARandomQuestion();
isAnswered = false;
nextQuestion();
});

$(".btn-answer").each((i, element) => {
$(element).click(()=> {
$(element).click(() => {
isAnswered = true;
game.checkAnswer($(element).attr("id"));
});
Expand Down
49 changes: 49 additions & 0 deletions public/stylesheets/classic-game.css
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,53 @@

#game-container {
padding-top: 75px;
}

#topic,
#countdown {
color: #ffffff;
height: 45.6px;
min-width: 50%;
max-width: 50%;
text-align: center;
}

#topic {
background-color: #14a76c;
}

#countdown {
background-color: #ff652f;
}

.rounded-btn {
font-size: 30px;
color: #272727;
letter-spacing: 1px;
line-height: 40px;
border: 2px solid #fff;
border-spacing: 4px;
border-radius: 40px;
background: #fff;
transition: all 0.3s ease 0s;
width: 140px;
padding: 10px;
display: flex;
margin: 0 auto;
}

.rounded-btn:hover {
color: #14a76c;
background: #14a76c;
border: 2px solid #14a76c;
}

#nextQuestion {
color: #747474
}

.game-info {
color:#ffe400;
font-size: 25px;
padding-left: 10px;
}
4 changes: 2 additions & 2 deletions routes/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,15 @@ router.use("/", notLoggedIn, (req, res, next) => {
router.post(
"/signup",
passport.authenticate("local-signup", {
successRedirect: "/user/profile",
successRedirect: "/",
failureRedirect: "/user/signup"
})
);

router.post(
"/signin",
passport.authenticate("local-signin", {
successRedirect: "/user/profile",
successRedirect: "/",
failureRedirect: "/user/signin"
})
);
Expand Down
26 changes: 26 additions & 0 deletions utils/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
exports.isLoggedIn = function(req, res, next) {
if (req.isAuthenticated()) {
req.isLogged = true;
return next();
}
res.redirect("/user/signin");
};

exports.notLoggedIn = function(req, res, next) {
if (!req.isAuthenticated()) {
return next();
}
res.redirect("/");
};

/**
* Shuffles array in place. ES6 version
* @param {Array} a items An array containing the items.
*/
exports.shuffleArray = function(a) {
for (let i = a.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[a[i], a[j]] = [a[j], a[i]];
}
return a;
};
Loading

0 comments on commit 3c444e6

Please sign in to comment.