enchant.jsでハースストーンの「チェスの親善試合」を再現しましたが、2人対戦しかできなかったので、
1人プレイの相手をしてくれるAIをJavaScriptで作ってみました。
将棋AIのゲーム木を評価関数で数値化する方式を真似して、AI側の行動のゲーム木を評価関数で数値化します。
ソースはこんな感じです。→ソース
AIと対戦してみる(モード選択で「SinglePlay」を選ぶとAIが対戦相手になってくれます。)
2017/06/18
2017/06/05
enchant.jsのゲーム画面の中央表示
enchant.jsで作成したゲームをブラウザの中央に表示する方法です。
enchant.jsでゲーム画面を表示すると、(特に指定をしない場合)ブラウザの左上に表示されます。
これを下のように、中央に表示し余白には背景画像を表示します。
以下のような関数を作成し、この関数をenchant.coreのインスタンスを引数に呼び出すとゲーム画面が中央表示となります。
実際に中央表示を行っているサンプルソースをGithubに作成しました。
ソースコード(Github)
enchant.jsでゲーム画面を表示すると、(特に指定をしない場合)ブラウザの左上に表示されます。
これを下のように、中央に表示し余白には背景画像を表示します。
以下のような関数を作成し、この関数をenchant.coreのインスタンスを引数に呼び出すとゲーム画面が中央表示となります。
// enchant.jsの表示をセンタリング
var moveStageToCenter = function(core) {
var stagePos = {
top: (window.innerHeight - (core.height * core.scale)) / 2,
left: (window.innerWidth - (core.width * core.scale)) / 2,
};
var stage = document.getElementById('enchant-stage');
stage.style.position = 'absolute';
stage.style.top = stagePos.top + 'px';
stage.style.left = stagePos.left + 'px';
core._pageX = stagePos.left;
core._pageY = stagePos.top;
};
また、センタリングした結果できた余白には、cssでbody要素に背景画像を設定します。body {
background-image: url(./img/hexabump.png);
background-repeat: repeat;
}
実際に中央表示を行っているサンプルソースをGithubに作成しました。
ソースコード(Github)
2017/06/04
【ハースストーン】チェスの親善試合
ハースストーンの酒場の喧嘩で結構前にあった「チェスの親善試合」が面白かったので、JavaScriptで再現してみました。
下のURLを開いた人同士で対戦できます。
https://arahkesh.kysaeed.com
TODO:
下のURLを開いた人同士で対戦できます。
https://arahkesh.kysaeed.com
TODO:
- 制限時間を作る
- 切断の扱いを決める
- もっと軽快にカードを出せるようにしたほうがいいかも
- 友だちと対戦機能
2017/03/25
SVNManager日本語版
WebブラウザでSubversionサーバのリポジトリを管理するためのツール「SVNManager」の日本語版です。
ダウンロードページ:https://github.com/kysaeed/SVNManagerJP/releases/tag/ver1.10JP
(svnmanager.tar.gzまたはsvnmanager.zipをダウンロードしてください。)
インストール方法、使い方はベースの英語版と同じなので、
英語版の使用方法を解説しているサイト等を参考にしてください。
下記のページが分かりやすかったです。
Subversionサーバをブラウザで管理できるSVNManagerを使おう
ダウンロードページ:https://github.com/kysaeed/SVNManagerJP/releases/tag/ver1.10JP
(svnmanager.tar.gzまたはsvnmanager.zipをダウンロードしてください。)
インストール方法、使い方はベースの英語版と同じなので、
英語版の使用方法を解説しているサイト等を参考にしてください。
下記のページが分かりやすかったです。
Subversionサーバをブラウザで管理できるSVNManagerを使おう
- 導入編 http://park1.wakwak.com/~ima/centos_svnmanager0001.html
- 運用編 http://park1.wakwak.com/~ima/centos_svnmanager0002.html
2017/03/10
C# : 配列要素のNULLチェック
C#で配列の要素にnullが存在するかをチェックする方法です。
ArrayのIndexOfメソッドでnullを検索するだけで判定できます。
テストコード:
2次元以上の多次元配列(foo[1,2]やbar[1,2,3]のような配列)の配列のnullチェックには使えません。
多次元配列のnullチェックもしたい場合は、多次元配列に対してforeachループを使うと、配列の全要素に対してアクセスできることを利用して、
foreachループ内で配列の要素に対してnullチェックをするようにすれば、配列にnullが含まれているかチェック可能です。
テストコード:
配列の要素が配列(ジャグ配列)の場合にも対応したい場合は、配列の要素が配列か(ArrayのArray)をチェックする必要があります。
変数が配列かどうかをチェックするには、Type.IsArrayプロパティを使います。
そして、配列だった場合には、その配列に対して配列のnullチェックをします。
配列要素のnullチェック中に、また配列要素のnullチェックが必要となるとややこしく感じますが、チェック処理を関数化しておいて再帰するだけで、以下のように簡単にできます。
テストコード:
配列をnullチェックしたい場面によって、以上のようなパターンを使分けると便利です。
1次元配列にnullが含まれているかチェック
チェック対象が1次元の配列に限定されるなら以下のように、ArrayのIndexOfメソッドでnullを検索するだけで判定できます。
テストコード:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NullCheck1D
{
class Program
{
static void Main(string[] args)
{
// チェック対象の配列
Object[] testArray1D = { new object(), new object(), null, new object() };
// nullの存在をチェック
if (Array.IndexOf(testArray1D, null) > -1)
{
Console.WriteLine("nulあり");
}
else
{
Console.WriteLine("nulなし");
}
}
}
}
多次元配列に対応
しかし、ArrayのIndexOfメソッドで検索できるのは1次元配列限定なので、2次元以上の多次元配列(foo[1,2]やbar[1,2,3]のような配列)の配列のnullチェックには使えません。
多次元配列のnullチェックもしたい場合は、多次元配列に対してforeachループを使うと、配列の全要素に対してアクセスできることを利用して、
foreachループ内で配列の要素に対してnullチェックをするようにすれば、配列にnullが含まれているかチェック可能です。
テストコード:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// 多次元配列のnullチェック
/// </summary>
namespace NullCheck2D
{
class Program
{
static void Main(string[] args)
{
// チェック対象の配列配列(2次元配列)
// ([,]は[2,2]を省略した書き方です)
Object[,] testArray2D = new Object[,]
{
{ new Object(), new Object() },
{ null, new Object() }
};
// nullの存在をチェック
if (hasNull(testArray2D))
{
Console.WriteLine("nulあり");
}
else
{
Console.WriteLine("nulなし");
}
}
/// <summary>
/// 配列のnullチェック
/// </summary>
/// <param name="target">チェック対象の配列</param>
/// <returns>true=nullあり / false=nullなし</returns>
static bool hasNull(Array target)
{
foreach (Object element in target)
{
if (element == null)
{
return true;
}
}
return false;
}
}
}
ジャグ配列にも対応
1次元配列、多次元配列には対応できましたが、配列の要素が配列(ジャグ配列)の場合にも対応したい場合は、配列の要素が配列か(ArrayのArray)をチェックする必要があります。
変数が配列かどうかをチェックするには、Type.IsArrayプロパティを使います。
そして、配列だった場合には、その配列に対して配列のnullチェックをします。
配列要素のnullチェック中に、また配列要素のnullチェックが必要となるとややこしく感じますが、チェック処理を関数化しておいて再帰するだけで、以下のように簡単にできます。
テストコード:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// 配列のnullチェック(1次元配列、多次元配列、ジャグ配列)
/// </summary>
namespace NullCheck
{
class Program
{
static void Main(string[] args)
{
// チェック対象の配列(2次元+ジャグ)
Object[,] testArray = new Object[,]
{
{ new Object(), new Object() },
{ new Object[] { new Object(), null }, new Object() }
};
// nullの存在をチェック
if (hasNull(testArray))
{
Console.WriteLine("nulあり");
}
else
{
Console.WriteLine("nulなし");
}
}
/// <summary>
/// 配列のnullチェック
/// </summary>
/// <param name="target">チェック対象の配列</param>
/// <returns>true=nullあり / false=nullなし</returns>
static bool hasNull(Array target)
{
foreach (Object element in target)
{
if (element == null)
{
return true;
}
if (element.GetType().IsArray)
{
//要素が配列の場合は、この配列チェック関数に再帰
if (hasNull((Array)element))
{
return true;
}
}
}
return false;
}
}
}
配列をnullチェックしたい場面によって、以上のようなパターンを使分けると便利です。
登録:
投稿 (Atom)