合計 昨日 今日

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

自分で作ったゲームや動画、面白いネタをみんなに宣伝しましょう!
また、気軽に作品の感想をコメントで残してあげて下さい。
Name: elle
[URL]
中級者(13,531 ポイント)
Date: 2014年5月31日(土) 20:26
No: 1
(OFFLINE)

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

※修正しました(2014/5/31 20:59)
(致命的なバグを見落としていました。if文内のboolが逆でした)
※修正しました(2014/6/1 14:31)
※修正しました(2014/6/1 14:44)
※修正しました(2014/6/1 17:20)
添付ファイル
main.cpp
Revision 4
(22.88 KiB) ダウンロード数: 117 回
15puzzle.zip
Revision 4
(4.26 MiB) ダウンロード数: 115 回
最後に編集したユーザー elle [ 2014年6月01日(日) 17:23 ], 累計 4 回

Name: elle
[URL]
中級者(13,531 ポイント)
Date: 2014年5月31日(土) 20:30
No: 2
(OFFLINE)

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

文章が投稿できてなかったので…(内容が長いと投稿できない?)

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が必要なのが面倒。しかもこれバイトオーダー違う環境だと上手く動かないような…。
最後に編集したユーザー elle [ 2014年6月01日(日) 17:26 ], 累計 1 回

Name: elle
[URL]
中級者(13,531 ポイント)
Date: 2014年5月31日(土) 20:33
No: 3
(OFFLINE)

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

ソースコードを埋め込もうと思ったらやはり投稿できないようなので添付にしました。
(追記)一番上のトピックにまとめました。不慣れですみません。

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

Name: h2so5
(副管理人)
[URL]
比類なきプログラマー(99,549 ポイント)
Date: 2014年6月01日(日) 00:21
No: 4
(OFFLINE)

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

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

Name: みけCAT
[URL]
伝説なるハッカー(683,427 ポイント)
Date: 2014年6月01日(日) 09:41
No: 5
(OFFLINE)

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

移動音を指定していない状態だと、移動するたびに「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
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: elle
[URL]
中級者(13,531 ポイント)
Date: 2014年6月01日(日) 14:45
No: 6
(OFFLINE)

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

>h2so5さん
ご指摘ありがとうございます。1点を除いていずれも修正しました。
h2so5 さんが書きました:
  • 正規表現よりはbasic_path::extensionをつかって比較したほうが良いような気がする

これについてなのですが、string_typeが返るようなので
コード[C++]: 全て選択
1
2
3
// 疑似コード
string ext = extension();
if(ext == ".jpg" || ext == ".png" || ...)

のような形になってしまうように思うのですが、やはり正規表現よりbasic_pathを使った方がいいのでしょうか…

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

こちらの機能を追加しました。矢印移動便利ですね、自分でも気が付きませんでした。
みけCAT さんが書きました:さらに、終了してもう一度プレイしようとしたところ、OS標準の「動作を停止しました」という表示が出て強制終了になりました。
画像ファイルをexeファイルにドロップした場合は
「clear soundが見つかりません」「shuffle soundが見つかりません」と出たあと、強制終了します。
一度解凍した15puzzleフォルダを消して再解凍しても、強制終了を回避できませんでした。

こちらですが、プログラム内でgamesystem.datが空である場合の対処がなされていなかったためかと思われます。
修正しましたので良ければご確認ください。

Name: h2so5
(副管理人)
[URL]
比類なきプログラマー(99,549 ポイント)
Date: 2014年6月01日(日) 15:55
No: 7
(OFFLINE)

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

elle さんが書きました:>h2so5さん
ご指摘ありがとうございます。1点を除いていずれも修正しました。
h2so5 さんが書きました:
  • 正規表現よりはbasic_path::extensionをつかって比較したほうが良いような気がする

これについてなのですが、string_typeが返るようなので
コード[C++]: 全て選択
1
2
3
// 疑似コード
string ext = extension();
if(ext == ".jpg" || ext == ".png" || ...)

のような形になってしまうように思うのですが、やはり正規表現よりbasic_pathを使った方がいいのでしょうか…


コード[C++]: 全て選択
1
2
3
4
5
6
    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";
    }

Name: elle
[URL]
中級者(13,531 ポイント)
Date: 2014年6月01日(日) 17:27
No: 8
(OFFLINE)

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

>h2so5さん
なるほど…そのやり方は思いつきませんでした。
確かにこの方が拡張子が直感的にテーブル化できますね。
そのやり方で実装してみました。


Return to 作品お披露目掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]