This commit is contained in:
syuilo
2018-03-07 18:45:16 +09:00
parent 161fd4afab
commit 0bca0e8a02
7 changed files with 124 additions and 56 deletions

View File

@ -475,8 +475,8 @@ class OthelloContext extends Context {
othelloAi('white', this.othello);
if (this.othello.getPattern('black').length === 0) {
this.bot.clearContext();
const blackCount = this.othello.board.map(row => row.filter(s => s == 'black').length).reduce((a, b) => a + b);
const whiteCount = this.othello.board.map(row => row.filter(s => s == 'white').length).reduce((a, b) => a + b);
const blackCount = this.othello.board.filter(s => s == 'black').length;
const whiteCount = this.othello.board.filter(s => s == 'white').length;
const winner = blackCount == whiteCount ? '引き分け' : blackCount > whiteCount ? '黒の勝ち' : '白の勝ち';
return this.othello.toString() + `\n\n終了\n\n黒${blackCount}、白${whiteCount}${winner}です。`;
} else {

View File

@ -3,7 +3,7 @@ import Game, { pack } from '../../models/othello-game';
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'my' parameter
const [my = false, myErr] = $(params.my).boolean().$;
const [my = false, myErr] = $(params.my).optional.boolean().$;
if (myErr) return rej('invalid my param');
const q = my ? {

View File

@ -34,6 +34,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
black_user_id: parentIsBlack ? exist.parent_id : user._id,
white_user_id: parentIsBlack ? user._id : exist.parent_id,
turn_user_id: parentIsBlack ? exist.parent_id : user._id,
is_ended: false,
logs: []
});

View File

@ -11,6 +11,9 @@ export interface IGame {
created_at: Date;
black_user_id: mongo.ObjectID;
white_user_id: mongo.ObjectID;
turn_user_id: mongo.ObjectID;
is_ended: boolean;
winner_id: mongo.ObjectID;
logs: any[];
}
@ -40,6 +43,7 @@ export const pack = (
// Populate user
_game.black_user = await packUser(_game.black_user_id, meId);
_game.white_user = await packUser(_game.white_user_id, meId);
_game.winner = await packUser(_game.winner_id, meId);
resolve(_game);
});

View File

@ -19,51 +19,68 @@ export default function(request: websocket.request, connection: websocket.connec
switch (msg.type) {
case 'set':
if (msg.pos == null) return;
const pos = msg.pos;
const game = await Game.findOne({ _id: gameId });
const o = new Othello();
game.logs.forEach(log => {
o.set(log.color, log.pos);
});
const myColor = game.black_user_id.equals(user._id) ? 'black' : 'white';
const opColor = myColor == 'black' ? 'white' : 'black';
if (!o.canReverse(myColor, pos)) return;
o.set(myColor, pos);
let turn;
if (o.getPattern(opColor).length > 0) {
turn = myColor == 'black' ? game.white_user_id : game.black_user_id;
} else {
turn = myColor == 'black' ? game.black_user_id : game.white_user_id;
}
const log = {
at: new Date(),
color: myColor,
pos
};
await Game.update({
_id: gameId
}, {
$set: {
turn_user_id: turn
},
$push: {
logs: log
}
});
publishOthelloGameStream(gameId, 'set', {
color: myColor,
pos
});
set(msg.pos);
break;
}
});
async function set(pos) {
const game = await Game.findOne({ _id: gameId });
if (game.is_ended) return;
const o = new Othello();
game.logs.forEach(log => {
o.set(log.color, log.pos);
});
const myColor = game.black_user_id.equals(user._id) ? 'black' : 'white';
const opColor = myColor == 'black' ? 'white' : 'black';
if (!o.canReverse(myColor, pos)) return;
o.set(myColor, pos);
let turn;
if (o.getPattern(opColor).length > 0) {
turn = myColor == 'black' ? game.white_user_id : game.black_user_id;
} else if (o.getPattern(myColor).length > 0) {
turn = myColor == 'black' ? game.black_user_id : game.white_user_id;
} else {
turn = null;
}
const isEnded = turn === null;
let winner;
if (isEnded) {
const blackCount = o.board.filter(s => s == 'black').length;
const whiteCount = o.board.filter(s => s == 'white').length;
winner = blackCount == whiteCount ? null : blackCount > whiteCount ? game.black_user_id : game.white_user_id;
}
const log = {
at: new Date(),
color: myColor,
pos
};
await Game.update({
_id: gameId
}, {
$set: {
turn_user_id: turn,
is_ended: isEnded,
winner_id: winner
},
$push: {
logs: log
}
});
publishOthelloGameStream(gameId, 'set', {
color: myColor,
pos
});
}
}