ページ 11

カスタマイザブルな15パズル

Posted: 2014年5月31日(土) 20:26
by elle
※修正しました(2014/5/31 20:59)
(致命的なバグを見落としていました。if文内のboolが逆でした)
※修正しました(2014/6/1 14:31)
※修正しました(2014/6/1 14:44)
※修正しました(2014/6/1 17:20)

Re: カスタマイザブルな15パズル

Posted: 2014年5月31日(土) 20:30
by elle
文章が投稿できてなかったので…(内容が長いと投稿できない?)

15パズルを作ってみました。
主なFeatureは次の通りです。
・画像(bmp|jpeg|jpg|png|dds|argb|tga)をドラッグアンドドロップするとその画像でゲームができます。
・フォルダをドラッグアンドドロップすると、フォルダ内からのランダムになります(奥の階層も含めます)。

・音声ファイル(wav|mp3|ogg)をドラッグアンドドロップすると移動音がその音になります。
・これもファルダをドラッグアンドドロップすると、そのフォルダ内からランダムで移動音として再生されます。
・Rキーを押すと同じ配置で、Nキーを押すと別の配置でやり直すことができます。
・これらの設定をデフォルトに戻したいときは0キーを押します。
・クリア後にSキーを押すと配置と移動回数・経過時間が記録された.txtファイルが出力、
 そのファイルをドラッグアンドドロップすることで同じ配置を再現してプレーできます。
(追加)・矢印キーでも操作できます。
(追加)・Iキーを押すと各画像の上に位置番号が表示されます。押すたびに、黒→白→なしとループします。

感じたこと
・stringstream便利。「std::string(ss.str()).c_str()」でchar*として渡せるのに気付いたのが最大の収穫。
・練習のためにfilesystemを使ったが、毎回basic_pathに直すのが面倒。しかしoperator/のオーバーロードはなるほどと思った。
・バイナリでint型を格納するのに毎回reinterpret_castが必要なのが面倒。しかもこれバイトオーダー違う環境だと上手く動かないような…。

Re: カスタマイザブルな15パズル

Posted: 2014年5月31日(土) 20:33
by elle
ソースコードを埋め込もうと思ったらやはり投稿できないようなので添付にしました。
(追記)一番上のトピックにまとめました。不慣れですみません。

しかし200行くらいの予定がどんどん追加されていってGodClassになってしまった…。
少なくともkeyとmouseくらいは分けた方が良かったかもしれないですね。

Re: カスタマイザブルな15パズル

Posted: 2014年6月01日(日) 00:21
by h2so5
  • Puzzle15クラスはNoncopyableというよりSingletonでは?
  • sealed はC++/CLIのキーワードなので、C++11なら final を使うべき
  • 正規表現よりはbasic_path::extensionをつかって比較したほうが良いような気がする
  • セーブデータはテキストにしたほうが普通のエディタでもそのまま閲覧できて便利
  • NaturalPow関数に再帰を使う理由がよくわからない、負の指数を入れると無限ループになる

Re: カスタマイザブルな15パズル

Posted: 2014年6月01日(日) 09:41
by みけCAT
移動音を指定していない状態だと、移動するたびに「move soundの再生に失敗しました」というダイアログが出ました。
わざわざ移動音を用意しなくても、無音で普通にプレイできるようになるとさらにいいと思います。
あと、矢印キーでも移動操作ができると嬉しいです。

さらに、終了してもう一度プレイしようとしたところ、OS標準の「動作を停止しました」という表示が出て強制終了になりました。
画像ファイルをexeファイルにドロップした場合は
「clear soundが見つかりません」「shuffle soundが見つかりません」と出たあと、強制終了します。
一度解凍した15puzzleフォルダを消して再解凍しても、強制終了を回避できませんでした。

DLしたzipファイルのMD5は8C8BC3459FAABBB08C6FA8BABD6EA41Dです。

Windows Vista Home Premium SP2 32ビット
Intel(R) Core(TM)2Duo T8100 @2.10GHz 2.10GHz
RAM 4.00GB

Re: カスタマイザブルな15パズル

Posted: 2014年6月01日(日) 14:45
by elle
>h2so5さん
ご指摘ありがとうございます。1点を除いていずれも修正しました。
h2so5 さんが書きました:
  • 正規表現よりはbasic_path::extensionをつかって比較したほうが良いような気がする
これについてなのですが、string_typeが返るようなので

コード:

// 疑似コード
string ext = extension();
if(ext == ".jpg" || ext == ".png" || ...)
のような形になってしまうように思うのですが、やはり正規表現よりbasic_pathを使った方がいいのでしょうか…

>みけCATさん
プレーありがとうございます。
みけCAT さんが書きました:移動音を指定していない状態だと、移動するたびに「move soundの再生に失敗しました」というダイアログが出ました。
わざわざ移動音を用意しなくても、無音で普通にプレイできるようになるとさらにいいと思います。
あと、矢印キーでも移動操作ができると嬉しいです。
こちらの機能を追加しました。矢印移動便利ですね、自分でも気が付きませんでした。
みけCAT さんが書きました: さらに、終了してもう一度プレイしようとしたところ、OS標準の「動作を停止しました」という表示が出て強制終了になりました。
画像ファイルをexeファイルにドロップした場合は
「clear soundが見つかりません」「shuffle soundが見つかりません」と出たあと、強制終了します。
一度解凍した15puzzleフォルダを消して再解凍しても、強制終了を回避できませんでした。
こちらですが、プログラム内でgamesystem.datが空である場合の対処がなされていなかったためかと思われます。
修正しましたので良ければご確認ください。

Re: カスタマイザブルな15パズル

Posted: 2014年6月01日(日) 15:55
by h2so5
elle さんが書きました:>h2so5さん
ご指摘ありがとうございます。1点を除いていずれも修正しました。
h2so5 さんが書きました:
  • 正規表現よりはbasic_path::extensionをつかって比較したほうが良いような気がする
これについてなのですが、string_typeが返るようなので

コード:

// 疑似コード
string ext = extension();
if(ext == ".jpg" || ext == ".png" || ...)
のような形になってしまうように思うのですが、やはり正規表現よりbasic_pathを使った方がいいのでしょうか…

コード:

	static const char* extensions[] = { ".bmp", ".jpeg", ".jpg", ".png", ".dds", ".argb", ".tga" };
	string ext = extension();
	transform(ext.begin(), ext.end(), ext.begin(), tolower);
	if (find(begin(extensions), end(extensions), ext) != end(extensions)) {
		cout << "found";
	}

Re: カスタマイザブルな15パズル

Posted: 2014年6月01日(日) 17:27
by elle
>h2so5さん
なるほど…そのやり方は思いつきませんでした。
確かにこの方が拡張子が直感的にテーブル化できますね。
そのやり方で実装してみました。