8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Node.jsとsocket.ioでネットワーク多人数対戦リバーシを制作中

Last updated at Posted at 2017-11-28

#はじめに
この記事はNode.jsとsocket.ioで、ネットワーク多人数対戦リバーシを制作していたときに気づいた事などを書いていきます。

#socket.io
コマを置いたことやチャット書き込みなどは io.sockets.emit() を使い全員に知らせる。
ゲーム中、順番がきたことを個別に知らせるために io.sockets.connected[socketID].emit() を使う

#クライアント側の外部ファイル
クライアント側はsocket.ioを使うと他のjsファイルを外部から読み込めなくなるのでindex.htmlに直接書かないといけなくなり、index.htmlが大きくなりがち。と、思っていたら expressを使って外部ファイルを読み込めました。
例えば index.html から test2.js を読み込む場合、server.js などから

var express = require('express');
var app = express();
app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});
app.get('/test2.js', function(req, res){
  res.sendFile(__dirname + '/test2.js');
});

という感じに書いておくとクライアント側でも外部ファイルを読み込めます。
これをやってないとクライアント側が syntax error などになり外部ファイルを読み込めなくなります。

#setInterval()とthis
setInterval() → this でひっかかった - Web系がおもしろい。

var hoge={};
hoge={
	prop:123,
	foo:function() {
		this.id = setInterval(this.bar, 2000);
	},
	bar:function() {
		alert(this.prop); // ←コレ
	}
};
hoge.foo();

このプログラムを動かすと2秒毎に123と表示されて欲しいのですが、undefinedになります。
この問題でドハマリしました。
esperiaさんが解決してくれていました。

var hoge={};
hoge={
	prop:123,
	foo:function() {
		var self=this;
		this.id = setInterval(function(){self.bar()}, 2000);
	},
	bar:function() {
		alert(this.prop); // ←コレ
	}
};
hoge.foo();

これで2秒毎に123と表示されるようになります。
そして、この解決のコードを書かれていたesperiaさんは、友人です。世間は狭いですね^_^;

#意外だったこと1
ゲーム開始までにクライアントとサーバでやり取りする回数が結構多い。
ゲーム開始までに遊ぶテーブル決めたり、人数決めたりするところでクライアントとサーバのやりとりが多い。

#意外だったこと2
今はサーバ側でsetInterval使って敵AI(ランダムに置くだけ)を1秒ごとに更新しているのだが、VPSのレンタルサーバから怒られて止られるかビビっていた。動かしてみると止められなかったのでOKっぽい。1秒毎の更新は許容範囲なのかも。

#今後やりたいこと
AIを強くするために評価の重みを作ってそれを優先してコマを置くようにする。
評価はランダムに置くコンピューター同士を対戦させて、勝った方の棋譜を評価に加えていく。
1,000回〜10,000回ぐらいの対戦結果があればいいらしい。

#おわりに
Qiitaに初めて投稿しました。
この記事を書いていた同じ時期に東京Node学園祭2017が開催されて、コミュニティではNode.jsへのコントリビューターになる道がサポートされていたりして、参加してなかったけど刺激を受けました。
Node.jsのgithubにプルリク出してみたいなと思って色々ドキュメントやガイドラインを読みましたがプルリク出すまでには至りませんでした。その代わりにgithubのラベルの使い方や、プルリクは海外ではPRと書く場合が多いことや、「good first issue」のラベルを目印にissueを探すことなど、githubの勉強になった気がします。今のところ独りでgithubを使っている状態ですが、自分のプロジェクトにコントリビューターを招いたり、自分がどこかのコントリビューターになったりすることを目標にしていこうと思います。
まず自分のコードを読んでもらいやすいように書き直して早くpushしようと思います。
まだ稚拙な状態ですがネットワーク多人数対戦リバーシのプロジェクトです。
https://github.com/minmin0530/networkMultiReversi

こっちが新しくて、トップページとか他のページもあるやつ。
https://github.com/minmin0530/ai6

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?