ããã«ã¡ã¯ïŒ
habranameïŒ
ïŒ
***ãã®è³æã«ã¯ã²ãŒã èªäœã«è«ççãªèª€ããå«ãŸããŠããŸãããããã¯èšäºã®æè¡çãªå
容ã«ã¯åœ±é¿ããŸããããã®ç®çã¯ãã¬ã€ããããšã§ã¯ãªããã¿ã€ãã«ã«ç€ºãããŠããããŒã«ã®äœ¿çšæ¹æ³ãç解ããããšã§ãã ç¶ç¶ããã ã³ã¡ã³ãã«èšèŒãããŠãããã¹ãŠã®ãšã©ãŒãèæ
®ããŠãã²ãŒã ãåäœç¶æ
ã«ããŸã
ä»æ¥ãNodeJSã«ã€ããŠç¥ããªããšèšã人ã¯ã»ãšãã©ããŸãããæè¿ã§ã¯ãNodeJSã«ã€ããŠå€ãã®ããšã話ããæžããŠããŸãã
ç§ã¯6ãæåã«NodeJSãæ¢çŽ¢ããæ¹æ³ãéå§ããŸããããç§ã«ãšã£ãŠã¯èå³æ·±ããæ°ãããã®ã§ããã
ãã¹ãŠã®ãã¬ãŒãã³ã°è³æã¯éåæã«é¢ããèšäºããŸãã¯ãµãŒããŒãŸãã¯ãã£ããã®äœææ¹æ³ã®ããããã§ããããããã¬ãŒãã³ã°è³æã§èªåã«ãšã£ãŠèå³æ·±ããã®ã¯èŠã€ãããŸããã§ããã 圌ã¯ãããŸããŸãªãããžã§ã¯ãã®PHPããã¯ã°ã©ãŠã³ãäœæ¥ãéšåçã«çœ®ãæããããŸããŸãªå°ããªã¢ããªã±ãŒã·ã§ã³ããã£ãããšäœæããŸããã
ããããä»ã§ã¯ãåå¿è
ããæ¬ç©ã®å®çšçãªã¢ããªã±ãŒã·ã§ã³ãŸã§ãéå±ã§ã¯ãªãæ¬æ Œçãªæè²è³æããã§ã«äœæããŠããèªåèªèº«ã®åŒ·ããæããŠããŸãã ããã¯åãªãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãªããæã人æ°ã®ããExpressããã³Socket.IOããŒã«ã䜿çšãããªã³ã©ã€ã³ã²ãŒã ã§ããããã§ããå¹³åçãªçµ±èšjséçºè
ãã§ãããã«ããã¬ã€ã€ãŒã§ãã
ExpressãšSocket.IOããã§ã«å€ãã®ããšãæžããŠããã®ã§ãéçºããã»ã¹ã«ãã£ãšæ³šæãæããªãããããã«ã€ããŠã¯èª¬æããŸããã
æå§ãã«ãå€ãè¯ãæŠè»ãéžæãããã£ãã®ã§ãããéžæããªãã£ãã®ã¯è¯ãããšã§ãã
éçºããã»ã¹ãã°ã©ãã£ãã¯ã¹ã§è€éã«ãããã·ã³ãã«ãªã²ãŒã ãæ¡çšããããšã決ããã®ã§ãç§ã®éžæã¯äžç®äžŠã¹ã§ããããç§ã®ã¿ã¹ã¯ãè€éã«ããããã«ãããããèŠæš¡ã®ç«¶æå Žãšåã€ããã®ä»»æã®æ°ã®åããèšå®ã§ããããã«ãæ®éçã«ãããè¡ãããšã«ããŸããã
ãããŠãããã¯æ±ºå®ãããŸããïŒ äžç®äžŠã¹ãäœãå§ããŠããŸãã
å°æ¥ã®ã²ãŒã ã®æ§é ãçµæãšããŠå¿
èŠãªãã®ã決å®ããŸãã
- ã²ãŒã ã«é¢ããæ
å ±ãåããäœããã®äžè¬çãªã€ã³ã¿ãŒãã§ã€ã¹
- ãã³ãã©ãŒãåãã競æå Žã®UI
- ã²ãŒã ã®ãã¹ãŠã®ããžãã¯ãåãããµãŒããŒããŒã
ç§ã¯ãã€ãã®ããã«ã€ã³ã¿ãŒãã§ãŒã¹ã§éçºãå§ããŸããã ããããjQueryãšjQueryUIãã¬ãŒã ã¯ãŒã¯ãéžæããŸããã
ããŒãžãäœæããå¿
èŠãªã¹ã¿ã€ã«ãšã©ã€ãã©ãªjqueryãjqueryUIãæ¥ç¶ããåŸïŒ
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/vader/jquery-ui.css"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script>
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ã¹ããŒã¿ã¹ããŒãçµ±èšãµã€ãããŒãã²ãŒã ãã£ãŒã«ãèªäœãæ§æãããã¹ãŠãã·ã³ãã«ãªããŒãã«ã§è¡ãããŸãïŒ
<table border="0" width="100%"> <thead> <th colspan="2" id="status" class="ui-widget ui-state-hover ui-corner-all"> ...</th> </thead> <tbody> <td id="stats" class="ui-widget" valign="top"><br /><button id="reload"> </button><br /><br /></td> <td id="board" class="ui-widget" valign="top"><div id="masked" class="ui-widget-shadow ui-corner-all ui-widget-overlay"></div> <table class="ui-widget ui-corner-all" cellpadding="0" cellspacing="0" align="left" id="board-table"></table> </td> </tbody> </table>
ããã§ã³ã¡ã³ãããããšã¯äœããªããšæããŸãããã¹ãŠãç解ã§ãã以äžã®ãã®ã§ãã 次ã«ãCSSããã°ããã¹ã±ããããã¯ã©ã€ã¢ã³ãåŽã®ã€ãã³ãåŠçãæžãå§ããŸããã
ããã¯ãå°ããªããšã§ãè¯ãããšã ããæããã¹ããã¬ãŒãã³ã°ææã§ãããšæåŸ
ããŠãå¯èœãªéããã¹ãŠã®ã³ãŒããã§ããéããããã«èšè¿°ããããšããŸããã
ã²ãŒã ã®ãªããžã§ã¯ããäœæãããŸããïŒ
var TicTacToe = { gameId: null,
次ã«ãåé¢æ°ãé çªã«æ€èšããå¯èœãªéãã³ã¡ã³ããä»ããŠãInitïŒïŒïŒ
$(function() {
ããã§ã¯ãã²ãŒã ã®éå§æ¹æ³ã詳ããèŠãŠã¿ãŸãããã
startGame: function (gameId, turn, x, y) {
ãã¹ã¯ã®æ©èœã«ã€ããŠã¯èª¬æããŸãããããã¹ãŠãå¹³å¡ã§ãã
ããã«ããã¬ãŒã€ãŒã®åããååŸããæ©èœïŒ
move: function (id, turn, win) {
ã²ãŒã ã®å®äºïŒ
endGame: function (turn, win) {
ããã ãã§ãïŒ äœæããããã¹ãŠã®ãã¡ã€ã«ã¯ãpublicãšããæ°ãããã©ã«ããŒã«å
¥ããããŸãã
ã¯ã©ã€ã¢ã³ãéšåã¯ç°¡åãããŸãããïŒ ãµãŒããŒåŽã¯ããå°ãè€éã§ãïŒ
å¿
èŠãªã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããŸãã
npm install express npm install socket.io
éå§ãã¡ã€ã«index.jsãäœæããŸããããããŸã§ã®ãšããç°¡åã§ããç解ããŠã¿ãŸãããã
ããã§åãããšãæžããŸãããã³ã¡ã³ããªãã§ãç°¡ç¥åããã圢åŒã§èšè¿°ããŸãã
var express = require('express'), app = express.createServer(), io = require('socket.io').listen(app), TicTacToe = require('./models/tictactoe'); app.use(express.static(__dirname + '/public')); app.listen(1337); io.set('log level', 1); io.set('resource', '/api');
ããã«æ°ã¥ããããã¢ãã«ãè¿œå ããŸãã
TicTacToe = require('./models/tictactoe');
ããããŸãã«ç§ãã¡ãä»æžããŠããããšã§ããååã®ã¢ãã«ã§index.jsã®é£ã«ãã©ã«ããäœæãããã®äžã«tictactoe.jsãã¡ã€ã«ãäœæããŸã
ããã¯nodejsã®éåžžã®ã¢ãžã¥ãŒã«ã§ããããšã¯ã¹ããŒãæ©èœã§äœ¿çšãããã²ãŒã ã®äžå¿ã§ããããã¹ãŠã®ããžãã¯ã«ãªããŸãã
ãªã³ã©ã€ã³ã²ãŒã ãæžããŠããã®ã§ãæåã¯ãŠãŒã¶ãŒãã²ãŒã ãããã³ãããã®ã³ã¬ã¯ã·ã§ã³ãªããžã§ã¯ãã®åœ¢ã§ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ããããŸããã
ã¡ã€ã³ãªããžã§ã¯ããäœæããŸãã
ãããã£ãŠããµãŒããŒãèµ·åãããšãTicTacToeã²ãŒã ãäœæããããŠãŒã¶ãŒãæ¥ç¶ãããšãTicTacToeã³ã¬ã¯ã·ã§ã³å
ã«ããŒãœãã©ã€ãºãããGameItemã²ãŒã ãäœæããã誰ã誰ãšã©ã®ãã©ã¡ãŒã¿ãŒã§ãã¬ã€ãããã衚瀺ãããŸãã
次ã«ãã³ã¬ã¯ã·ã§ã³ã§ãããã®ãŸãã«ã²ãŒã ãäœæããæ©èœãèããŠã¿ãŸãããã
TicTacToe.prototype.start = function(user, cb) {
ã芧ã®ãšããããããã¿ã€ãã䜿çšããŠå€æŽã䜿çšããŠãããããå¿
èŠãªæ©èœãåããã¢ãžã¥ãŒã«ãæ§ç¯ããŠããŸãã
ãŸããã²ãŒã å
šäœã§æžã蟌ã¿ã¡ãœããã³ãŒã«ããã¯é¢æ°ïŒã³ãŒã«ããã¯ïŒã䜿çšããŸããããã«ãããéåæã³ãŒããèšè¿°ããæ©äŒãäžããããŸãã
éåæã«é¢ããå€ãã®èšäºã®ããããããŸã èªãã§ããªã人ãããå Žåã¯ãç°¡åãªäŸã§ãªããããå¿
èŠãªã®ããããã«ããäžåºŠèª¬æããŸã:)
ãããã£ãŠããŠãŒã¶ãŒããµãŒããŒã«ã¢ã¯ã»ã¹ããã²ãŒã ãéå§ããããšããŸãã ãµãŒããŒã¯åãã§ããã«çããŸããç§ã¯ããªãã®ã²ãŒã ãèµ·åãå§ãã次ã®ããã«ããŸãïŒ
1. --> 2. TicTacToe.start(); 3. <--
ãããã£ãŠããã®å Žåãã¹ããã1ã®åŸãã¹ããã2ãš3ã¯åæããŠåäœããŸããã€ãŸãããŠãŒã¶ãŒã¯ã²ãŒã ãå®éã«äœæãããåã«çããåãåããŸãã ãããã£ãŠãã³ãŒã«ããã¯é¢æ°ã䜿çšããŠãããžãã¯ã次ã®ããã«å€æŽããŸãã
1. --> 2. TicTacToe.start(function(){ 3. <-- });
ããã§ãã¹ããã1ã®åŸãã¹ããã2ã§ã®ã¿é¢æ°ãéå§ããã³ãŒã«ããã¯ãå¿åé¢æ°ãå®è¡ããŠããã¹ããã3ã«é²ã¿ãçµæããŠãŒã¶ãŒã«å¿çããŸãã
ã²ãŒã ã«æ»ããŸãã ãã¬ã€ããå Žæã®ãã¥ãŒã決å®ããã²ãŒã ã®ãŠãŒã¶ãŒã®ãã¢ãæ¥ç¶ããããšã圌女ã«æããŸããã
ããã§ã¯ãã²ãŒã ãã©ã®ããã«çµäºããããèŠãŠã¿ãŸãããã
TicTacToe.prototype.end = function(user, cb) {
次ã«ãæãèå³æ·±ããããã¯ã¿ãã¯ããŒãã©ã®ããã«æ©èœããããèŠãŠãããŸãããã
ä»åã¯ãã³ã¬ã¯ã·ã§ã³ã ãã§ãªããã²ãŒã èªäœã®ãªããžã§ã¯ãã«ãæ©èœãè¿œå ãããã¬ã€ã€ãŒã移åãããŸãã
TicTacToe.prototype.step = function(gameId, x, y, user, cb) {
åæ¢ããŠããã®é¢æ°ãããã«è©³ããæ€èšããŠã¿ãŸãããã this.getTurnïŒïŒãšãã2ã€ã®ä»ã®é¢æ°ãžã®åŒã³åºããããã移åãããŠãŒã¶ãŒã®æ»ãå€ãè¿ãããŠãŒã¶ãŒIDãæž¡ããŸããããã¯ãã²ãŒã ãªããžã§ã¯ãã«è¿œå ãããé¢æ°èªäœã§ãã
GameItem.prototype.getTurn = function(user) { return (user == this.user ? 'X' : 'O'); }
ãããã²ãŒã ãäœæãããŠãŒã¶ãŒã§ããå ŽåãXãæ©ãã察æŠçžæãOã§ããå Žåã¯æããã§ãã
ã³ãŒã«ããã¯ã§åŒã³åºããã2çªç®ã®é¢æ°ã¯åè
ãã§ãã¯ã§ãã
GameItem.prototype.checkWinner = function(x, y, turn) {
ã²ãŒã ãªããžã§ã¯ãã«æ©èœãå床远å ããŸããã ãã®é¢æ°ã§ã¯ã移åã®åº§æšãšç§»åãããã®ãåã³ååŸããŸãã ããã«ããã§ç§»åã®æ°ã確èªããå©çšå¯èœãªç§»åã®æ°ã確èªãããã£ãŒã«ãã®æ¬¡å
ãäºãã«ä¹ç®ããŠãããã«ãŠã³ãããŸãã
ãŸã ç¡æã®ã»ã«ãããå Žåãã²ãŒã ã¯ãŸã çµãã£ãŠããŸãããããããåè
ãããã§ãããã åè
ã確èªããããšã¯ãã²ãŒã å
šäœã§æãé£ããæ©èœã§ãã以äžã§å°ãæ€èšããŸãã åè
ãããªãå Žåã¯ãfalseãè¿ããŸãã
åè
ã確èªããæ©èœã«ã€ããŠã¯ã4ã€ã®ãã©ã¡ãŒã¿ãŒããããŸãã
1-æ€çŽ¢ã¢ã«ãŽãªãºã ãå€ãæã€ããšãã§ããŸã-ã|ã/ãããã³\ïŒã¯ãã1ã€ã®ããã¯ã¹ã©ãã·ã¥ãåŒçšç¬Šã¯ã³ãŒãå
ã§ãšã¹ã±ãŒããããŠããããïŒãªãã¢ã€ã³ã³ãå°ããã®ã§ããããã¹ãŠãéåžžã«ç°¡åã§ãããããã¯ããªãããã§ãã¯ããŠããã¬ã€ãã§ããããã
2,3-座æšã移åãã
4-è¡ã£ãããš
ä»ã§ã¯ããã¯åŒ·åã§ãŠããŒã¯ãªæ©èœã§ãããŸãããããèŠãŠãåã±ãŒã¹ãã»ãŒå®åçãªå€èŠ³ã§ããããšã«æ³šæããã³ãŒãåŸã®éãã確èªããããšããå§ãããŸãã
GameItem.prototype.checkWinnerDynamic = function(a, x, y, turn) {
ã¢ã«ãŽãªãºã å
åã±ãŒã¹ã¯ç°ãªãã¢ã«ãŽãªãºã ã«ããåå¥ã®ãã§ãã¯ã§ããããããã¯ãã¹ãŠ1ã€ã«çµ±åãããŠããŸããããã¯ãçŸåšã®äœçœ®ãã競æå Žã®éåžžã®ã·ããã§ããããããã®ãã£ãŒã«ãã®å€ããã§ãã¯ããŸãã
ç§ã¯æåã«ã¿ã¹ã¯ãè€éã«ããã²ãŒã ã¯ä»»æã®ãã£ãŒã«ããµã€ãºãšåã€ããã®ä»»æã®æ°ã®åããæã€ããšãã§ããããã次ã®ãã§ãã¯ã§æ§æããããŠãããŒãµã«ã¢ã«ãŽãªãºã ããããŸãã
æ°Žå¹³æ€çŽ¢
æåã«ããµã€ã¯ã«ã®å·Šå³ã®å€æ°å¢çãšãX軞ã«æ²¿ã£ãæå°ãµã€ãºãšæ倧ãµã€ãºã宣èšããŸãã
ã€ãŸããçŸåšã®ç§»åã®ãã®å€+åã€ããã®ç§»åã®æ°ã®å€ã
次ã«ãæå°å€ã1æªæºã®å Žåãæ倧å€ãšæå°å€ãå®æ°ã«ãã1ãèšå®ããŸãã
æ倧å€ãX軞ã®ãã£ãŒã«ããã倧ããå Žåã¯ããã£ãŒã«ãé·ã®å€ãèšå®ããŸãã
ããã«ãµã€ã¯ã«ã§ã¯ã極端ããå§ããŠãã¹ãŠã®é£æ¥ãããã£ãŒã«ããééããåå©ã«å¿
èŠãªæ°ã«ããã«é²ã¿ãŸãã
ã«ãŒãã®åå埩ã§ãåã€ããã«åãåãã§å¿
èŠãªæ°ã®ã»ã«ãèç©ãããŠãããã©ããããã§ãã¯ããŸããããã§ããã°ãé¢æ°ãçµäºããŠtrueãæž¡ããŸã-åè
ãããŸãã
ãŸããå·Šããå³ãå³ãžã®ã·ãããäžå¯èœãã©ããããã§ãã¯ãããµã€ã¯ã«ãåæ¢ããŠé¢æ°ãçµäºããŸããããã§ã«falseã§-åè
ã¯ããŸããã
次ã«ãå·ŠåŽã®ã»ã«ããã§ãã¯ã§ãããã©ããããããŠãã®å€ãæå°å€ããã倧ãããã©ããããŸããã®ã»ã«ã«çŸåšã®ç§»åã®å€ããââããã©ããããå·ŠåŽã®å
é ãã確èªããŸãã ãã¹ãŠã®æ¡ä»¶ãäžèŽããå Žåãå€æ°winã®å€ãå¢å ããããšã§äžèŽããããšãããŒã¯ããŸãã ã©ã®æ¡ä»¶ãäžèŽããªãã£ãå Žåã¯ãå·ŠåŽãèŠãªãããã«ããŒã¯ããŸãã çµå±ãå€ãé£ç¶ãããšãã«æ¡ä»¶ãåã£ãŠããŸãã
å³åŽã®ãã§ãã¯ã«ãåãã¢ã«ãŽãªãºã ã䜿çšããŸãããå³åŽãžã®ã·ããã®æ倧å€ããã§ãã¯ããããã®æ¡ä»¶ã®ã¿ãå€æŽãããŸããåçŽæ€çŽ¢
æåã«ãåæ§ã«ãå¢çå€æ°ãšå¢çã宣èšããŸãã
ä»åã ããY軞ãšãã®å€ã䜿çšããŸãã å€äœãY軞ã«æ²¿ã£ãŠééããŸãã
ä»ã®ãã¹ãŠã¯åãã§ããäžããäžãžã®å¯Ÿè§ç·ïŒéåžžã¯å·Šããå³ãžã®ã¯ãã§ãããããã£ãŠãç§ã¯ããã«ã€ããŠæžããŠããŸãã:)
æåã«ãåæ§ã«ãå¢çå€æ°ãšå¢çã宣èšããŸãããå¢çãç°ãªãããã«ãªã£ãã®ã§ãäž¡æ¹ã®è»žã調ã¹ãŸãã
ãªãã»ããã§äž¡æ¹ã®è»žã䜿çšããŸãã äžãšå·Šã®å Žåããªãã»ããã®XYãæžãããæå°Xå€ãšæå°Yå€ã確èªããŸãã ãããŠãæ倧ãã€ã¢ã¹å€ã®é©åãªãã§ãã¯ãè¡ãããšã«ãããXYãå¢å ãããæš©å©ãšæš©å©ã«ã€ããŠãæãäžããäž
ããã§ã¯ããã€ã¢ã¹ãšæ€èšŒãåãã1ã€ã®ãã©ã€ãã«ãé€ããã»ãšãã©ãã¹ãŠãåãã§ãã
å·Šäžãžã®ã·ããã¯ãX軞ã«æ²¿ã£ãŠæžå°ããY軞ã«æ²¿ã£ãŠå¢å ããŸããã€ãŸããæå°Xå€ãšæ倧Yããã§ãã¯ããŸãã
ãããŠãå³äžã«ã·ãããããšãããã¯X軞ã«æ²¿ã£ãŠå¢å ããY軞ã«æ²¿ã£ãŠæžå°ããæ倧Xãšæå°Yããã§ãã¯ããŸãã
ã²ãŒã ã¢ãžã¥ãŒã«ã®èª¬æãçµäºããŸããã ãã¹ãŠã®æ©èœãæºåã§ããŸããïŒ æ¬¡ã«ãã¯ã©ã€ã¢ã³ããã³ãã©ãŒãšããåãããããã«ãµãŒããŒåŽã®ãã³ãã©ãŒãåæãããã®ãã¹ãŠã®åäœã確èªããŸãã
ãã¡ã€ã«ãä¿åããŠã¡ã€ã³ã®index.jsã«æ»ããsocket.ioã䜿çšããŠäœæ¥ãè¿œå ããå¿
èŠãªã€ãã³ããšã²ãŒã ã®äžè¬çãªå€æ°ãè¿œå ããŸãã
! NodeJS, , socket.io, express .
, , « »:
ivan.zhuravlev.name/game â 66 4
ivan.zhuravlev.name/game3 â 33 3
:
github.com/intech/TicTacToe-, proxy nginx , 1337
, , 8 1 , :)
-ãã¹ãŠã®éçºãšãããã°ã«ããã£ãæéïŒ12æé22åãåèšæéãçµéããŸããïŒ3æ¥ãèšäºã¯4çªç®ã«æžãããŸããçµ±èš
CPU
èšæ¶
Googleã¢ããªãã£ã¯ã¹ãèŠãŠãå¥ã®ã¢ãã¿ãŒã§ãµãŒããŒäžã®ãã¹ãŠã®ããŒã¿ãéããŠããŸããçŸåšãå¹³åããŠ30ã50人ããªã³ã©ã€ã³ã§ãããµãŒããŒã®è² è·ã¯ã»ãšãã©ç®ç«ãããéåžžã«å°ããªãžã£ã³ãããããŸãããè² è·ãšåŒã¶ã«ã¯æ¬åœã«å°ããããŸãã