TOP > テキスト目次 > マインドルの対戦パート作成



◆◆ したこと: ◆◆

        マインドルの対戦パート作成
        
        学園モノと言えば口出しマインドル。
        
        
        
        AI同士の対戦に回数限定で口出しするモード。
        「先輩じゃ勝てません! 俺も口出しさせてもらいますからね!」みたいなシチュエーション。
        なお、「先輩」というのが右の人と左の人のどちらのことなのかは乞うご期待。
        
        着手の前に毎回「これでいいかな?」との確認があり、「ダメ」を選択するとプレイヤーが代わりに一手指します。
        口出し回数を使い切ると、あとはもう見守るだけになるというハラハラドキドキの手に汗握るモードです。
        
        ストーリーの都合上、こうならざるを得ないので、面白いのかどうかは問わずに、ともかくシステムを実装してみましたが、
        なかなか面白いですよこれは!
        特に、口出し回数を使い切って、見るだけになってしまってからがエキサイティングです。「頼むぞ〜」みたいな。
        見るだけになってしまうというのが、だから面白くないんじゃないのか、と心配していたのですが、
        見るだけになってしまうからこそエキサイティングというのが新発見。
        AIの思考処理が遅いときがあるのも、手に汗握って見守る分にはプラスです。
        高速で手の応酬が続くときもあり、スーパーサイヤ人のバトルを見てるみたいで、それもまたよいものです。
        
        バランス調整には気を遣うところですね。
        一回も口出ししなくても勝ててしまうようでは意味がないですし、どう口出ししても負けてしまうほどAIに差があるようではゲームになりません。
        多少、運まかせになるぐらいでちょうどいいのかな。
        なにしろ回数を使い切ったあとの「頼むぞ〜」が思いのほかドキドキなのでビックリです。ドキドキしたりビクビクしたり忙しい。
        
        
        > 見るだけになってしまうからこそエキサイティングというのが新発見。
        
        最初から最後までただ見るだけではなく、途中で何回か口出ししているからこそ、
        自分が口出しした側に肩入れして真剣に見守る感じになるのだろうなと思います。

        これはアレですね、だからつまり選挙のときは投票に行くのがエキサイティングだぜってことですね。え、そんな話になるんですか。
        
        
        
        そしてさらに、候補手からの選択モード。
        
        
        
        AIが考えた候補手の中から選択して進めていくモードです。
        わざわざ別のモードを実装しなくても、こっちも口出しモードってことにしてしまえばいいんじゃないの? と思いつつ、
        本文ではこうなっているので、誰が本文を書いたんだコノヤロ〜と言いながら実装してみたところ、
        上記の口出しモードとは感覚がかなり違うゲームになりますね。
        
        まず、バランス調整の目指しどころが違う。
        口出しモードの場合は、AIの強さ設定は「味方 < 敵キャラ」で、その差を回数限定の口出しでいかに埋めるか? ですが、
        選択肢モードの場合は、AIの強さ設定は「味方 > 敵キャラ」ということにしておく。
        強さについてはストーリー上では逆ということになっているのが気になるところではありますが、
        こうしておくことで、提案される候補手の中に「正解」が一つは含まれるハズ、ということになります。
        それをプレイヤーが的確に選び続けることができるかどうか? というゲームになります。
        
        つまり、一言でまとめると、なかなか面白いですよこれは! ということです。
        
        久々のプログラミングが楽しすぎて、鼻血が出すぎて死ぬかと思いましたが、頑張って実装した甲斐があったというものです。
        こんな面白いゲームをもうすぐプレイできるようになるなんて、良かったのう皆の衆。
        
        惜しむらくは、せっかく面白いモードなのに、ストーリーの都合上、上記のモードでプレイする機会があんまりないことです。
        オマケモードを用意してこのモードで遊べるようにしようかな。惜しむらくは、そんな元気がないかもしれないことです。
        
        選択モードの候補手として何を表示するかについては、現在検討中。
        とりあえず今はAIの「次の一手」を取得する関数の結果プラス、ランダムに2件、を表示しているのですが、これがベストかどうかはわかりません。
        たとえばAI評価の上位3件、とかの方がいいかもしれません。よくないかもしれません。
        「正解」が明確すぎるのも果たしてどうかと思う一方、上位3件にすると、どれを選んでも大差ない、みたいなことになってしまいそうです。
        そのへんは追々調整することとして、ともかく今は作業を進めますよ。
        
        あとはペアバトルを実装すれば、特殊モードはカバーできることになります。
        これというのも本文の人が後先考えずにシチュエーションを用意してくれたおかげ。
        そのおかげで、もうすぐ面白いゲームをプレイできるようになるのですから、あなた方は本当にラッキーですね。
        
        
        それから、マウスを乗せると半透明になる機能も実装しましたよ。どうやら少しだけ元気が余っていたようです。
        
        
        残念ながら服だけ半透明ではなく立ち絵丸ごと半透明です。
        これがベストなソリューションかどうかはさておき、こうしておけば最低限、駒台が隠れて見えなくなる事態は回避できますので、
        一応レイアウト上の問題は解消ということで、立ち絵のポーズ具合は気にせずに突っ走りますよ。
        しかし立ち絵丸ごと半透明になるというのも、あんまり見栄えがよくありませんね。一瞬バグかと思ってしまいそう。
        何かもっとスマートな解決方法があるといいのですけど。
        やはり服だけ半透明にするしかないのでしょうか。もはや駒台を見ている場合ではなくなる。究極のソリューション。
        
        
        さて、究極のソリューションを実装するには技術のみならず特殊な情熱が求められそうですが、
        単にマウスを乗せて半透明にするだけなら、SFMLの機能を駆使して割と簡単に実現できます。
        
        処理としては二段構え。
        
        ・マウスが乗っているかどうかを判定
        ・スプライトの色のアルファ値を変更
        
        
        >・マウスが乗っているかどうかを判定
        
        マウスの位置は、
        
Vector2i mousePos = sf::Mouse::getPosition(window);
で取得できます。 window は 描画中の sf::RenderWindow です。ちなみに省略するとデスクトップ全体でのマウスの位置になります。 マウスの位置がわかったら、その位置のピクセルを取得して、何らかの色があれば「乗っている」と判定することとします。 なお、そのピクセルとはウィンドウ自体のピクセルではなく、対象の立ち絵のスプライトの画像のピクセルです。 スプライトのピクセルを取得するには、
// sprite からテクスチャ(の参照)を取得して、 sf::Texture *texture = sprite.getTexture(); // 画像データを取得して、 sf::Image image = texture->copyToImage(); // 画像上の座標を指定。 sf::Color pixel = image.getPixel ( x, y );
ちなみに sprite は sf::Sprite です。 最後の getPixel に渡す x と y が何なのかと言えば、先に取得しておいたマウスの mousePos.x と mousePos.y …… と言いたいのはヤマヤマですが、これはウィンドウ全体でのマウスの位置なので、 これをスプライトの表示座標を考慮して足したり引いたりして調整した値を x および y とします。 そこは天才プログラマー的にゴニョゴニョと頑張るところですね。ファイト! で、頑張って取得した pixel というのはつまり色情報なので、r、g、b、aの各値を持っています。 この中の a つまりアルファ値が 0 より大きければ「色つきのピクセル」という判定で大体オッケーなんじゃないでしょうか。
if ( pixel.a > 0 ) { /* 色つきのピクセルにマウスが乗っている場合の処理を書く */ }
>・スプライトの色のアルファ値を変更 スプライトの色自体は、sf::Color の値を渡せば設定できます。
sprite.setColor ( color );
逆に現在の色値を取得するには getColor() です。実にわかりやすいですね。 で、元のRGB要素を変更せずにアルファ値だけを変更するならば、
sf::Color color = sprite.getColor (); color.a = color.a / 2; sprite.setColor ( color );
でな感じでイケます。 しかしこのままでは一度変更すると半透明になりっぱなしというか、マウスを乗せている限り透明っぷりが加速してしまいそうですので、 元の色値は別の変数に保存しておいて、描画した直後に元の色に戻しつつ、 毎フレーム、マウスオーバーの判定フラグに入れて管理するのが泥臭いながらも素直で楽な実装かなと思います。
/* 以下、ウィンドウの描画ループのつもり */ ........ ........ ........ このへんに上記のマウスの位置のピクセルを取得する処理を書いたつもり ........ ........ ........ bool isMouseOver = false; // 色つきのピクセルにマウスが乗っている場合 if ( pixel.a > 0 ) { isMouseOver = true; } sf::Color color1; // マウスが乗っているならば描画前に半透明にして if ( isMouseOver ) { color1 = sprite.getColor (); sf::Color color2 = color1; color2.a = color2.a / 2; sf::Color color1 = sprite.setColor ( color2 ); } window.draw ( sprite ); // 描画 // 色を戻す if ( isMouseOver ) { sprite.setColor(color1); }
今思ったのですが、上のサンプルはサンプルというわけで全部の処理をベタっと書いてますが、 これなら別に isMouseOver のようなフラグは使わなくても、 if ( pixel.a > 0 ) の時点で「マウスが乗っている場合」と「乗ってない場合」で分ければよさそうですね。 ただ、実際には更新処理と描画処理を別メソッドに分けている場合があろうかと思います。 その場合はマウスオーバーの判定は更新メソッド側に、描画関連の処理は描画メソッド側に書くことになると思われますので、 更新メソッド側での判定結果をクラス変数のフラグに入れておくのが素直でありましょう、というわけでこうなりました。 具体的な実装の加減については好みの世界ですね。 上記はあくまでも日本一SFMLに詳しい天才プログラマーである私による模範例ということで、ありがたく鵜呑みにしていただければと思います。 はい、そんなわけでいよいよ開発日誌っぽくなって参りました。 というか、こういうのはプログラミングのページに記事として書いたらいいのではないのか。 日本一SFMLに詳しい天才プログラマーとして、ありがたい情報をみなさんにお伝えするギムがありますからね。 元気が余ってたら頑張りますので、ご期待ください。 ところで話は変わりますが選挙ですね。 私の住んでいる地域でも先日、地方選がありました。 で、別に結果自体についてどうこう思うことは特にないのですが、相変わらずの低い投票率。 今回の具体的な数字はちょっと見当たらなかったのですが、投票数と有権者数から推定するに、大体40%ちょい上ぐらいだと思われます。 この調子で一桁台に突入するぐらいまで下がれば、それはそれで面白そうではありますが、 今のところ、そこまで極端なことになる機運というものもなく、相変わらず、一部の「関係者」のみで結果が左右されている状況のようです。 投票率が低いとは言え、投票をしている人自体は相変わらず一定数いらっしゃるわけですよ。 じゃあ、一体どんな人が投票場に足を運んでいるのか? 今回の私の住んでいる地域の投票結果を見ていて、一つ面白いことがありました。 得票数はほぼ全体的にバラけていて、どの候補者さんも大体5000~10000票ぐらい獲得しておりました。 そんな中、一人だけ180票ぐらいの人がいらっしゃる。 この差は一体何なのか? 大多数の人にとっては、政治も選挙も興味のないことだと思うのですよ。 当日、投票場に足を運ぶにしても、そんなに深く考えて投票するわけではないでしょう。 で、全体的に票がバラけるというのはわかります。が、特定の人だけ極端に少ないというのは一体どういうことなのか? 選挙の時期になると郵便受けに配布される新聞の号外みたいな公報があるじゃないですか。 あれを見る限りでは、その人だけ特に何か問題があるようには私には思えませんでした。 おそらく政治家としては無名の人なのだろうとは思います。が、そんなことは、大多数の住民にとってはどうでもいいことのはず。 大多数の住民にとっては、誰が無名で誰が有名なのかさえ区別がつかないはず。私だってつかない。 だから、普段は政治や政治家に無関心で、選挙のときだけ軽く情報をナナメ読みして投票にだけは一応行く、 という人にとっては、その特定の人が政治家として無名だからと言って、その理由で選択肢から除外する、ということ自体が起こり得ないことのはず。 ということはつまり、 投票を実行したのは、いわゆる地盤て言うんですか? 何らかの形で特定の候補者に直接あるいは間接的に関係のある人が大多数であり、 「普段は政治や政治家に無関心で、選挙のときだけ軽く情報をナナメ読みして投票にだけは一応行く」 という層の人はほとんどいなかった、投票自体に行かなかった、と思われます。 だって、そういう層の人たちは、特定の政治家に義理があるわけでもなんでもなく、そもそも誰が無名なのか有名なのかという先入観もないはずで、 その無名の人にだって票を入れる可能性があるってことです。 そういう人たちがもっと投票場に足を運んでいれば、 その無名の人にだって、もう少しぐらいは票が入っていたはず。ここまで極端な差は出なかったはず。 結局、選挙に興味のない人は投票自体に行かないし、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 選挙に興味のない人は、ますます選挙に興味をなくし、 既存の政治活動の世界の外から立候補しても票がもらえる可能性は閉ざされて、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 結局、選挙に興味のない人は投票自体に行かなくなり、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 選挙に興味のない人は、ますます選挙に興味をなくし、 既存の政治活動の世界の外から立候補しても票がもらえる可能性は閉ざされて、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 結局、選挙に興味のない人は投票自体に行かなくなり、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 選挙に興味のない人は、ますます選挙に興味をなくし、 既存の政治活動の世界の外から立候補しても票がもらえる可能性は閉ざされて、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 結局、選挙に興味のない人は投票自体に行かなくなり、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 選挙に興味のない人は、ますます選挙に興味をなくし、 既存の政治活動の世界の外から立候補しても票がもらえる可能性は閉ざされて、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 結局、選挙に興味のない人は投票自体に行かなくなり、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 選挙に興味のない人は、ますます選挙に興味をなくし、 既存の政治活動の世界の外から立候補しても票がもらえる可能性は閉ざされて、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 結局、選挙に興味のない人は投票自体に行かなくなり、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 選挙に興味のない人は、ますます選挙に興味をなくし、 既存の政治活動の世界の外から立候補しても票がもらえる可能性は閉ざされて、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 つまり天才プログラマー的に言うとこういうことですよ。
現状 = ドウショウモナイ; while ( 現状 == ドウショウモナイ ) { 結局、選挙に興味のない人は投票自体に行かなくなり、 既存の政治活動の世界の外から立候補しても票がもらえる可能性は閉ざされて、 だからこそ、いくら選挙を繰り返しても、既存の政治活動の範囲内でしか顔ぶれが回らず、 }
「既存の政治活動の世界の外から立候補しても票がもらえる可能性は閉ざされて、」 という処理が無限ループに含まれているというのが恐ろしいところです。 結局、どこを切っても現状はドウショウモナイまま変わらず、ループの外に出られない。 閉塞感、という言葉さえ、もはや使い古されております。本当にドウショウモナイ。 この手の話をすると「じゃあおまえが立候補しろよ」みたいなことを言う人がいたりもしますが、 これに対しては「じゃあ投票してくれるのか?」の一言です。 結局そんな気すらないから、つまり、ご覧の有様ってことです。本当にドウショウモナイ。 なお、私が立候補すると世界中からン百億人の私の大ファンのみなさんが応援に押し寄せて ご近所が大混乱に陥ってしまうことが火を見るより明らかですので、 みなさんの平穏な暮らしを守るために、立候補は差し控えている次第です。人気がありすぎるのも困りものですね。 それとも案外、みなさん現状に満足してらっしゃるということだったりするのでしょうか? それならそれでいいのですけど。 しかし、そんなことはないでしょう。決してないでしょう。 なぜそう言い切れるのかと言えば、得意のイマギナティオーンで明確に霊視したからです。この私の霊能力を見くびってもらっては困る。 満足しているわけではなく、鬱屈した不満を押し付け合っている。 表面的には穏やかでも、そのようなサイキック地獄絵図が今この瞬間も世間にて絶賛展開中です。 なぜ私にそんなことがわかるのかと言えば、得意の以下略です。見くびってもらっては困ると言ったハズ。 現状に不満があるのなら、無名の人にこそ投票してみると面白いんじゃないの? と思うのですが、そもそも投票に行く気自体がない人の脳を操って投票に行かせることもできず、ドウショウモありません。 矛盾しているというか、不可解ですらある。 誰が当選したってどうせ同じだとか、野党が頼りないだとか、選択肢がないだとか、いろいろ言いますが、 じゃあ無名の人にこそ投票するのかと言えば、そのようには行動しない。 自分一人が投票したってどうせ結果は変わらない、というのは、そのとおりかもしれません。 そして、そう思って投票に行かない人が多いからこそ、実際にそうなってしまう、ということもまた事実でありましょう。 悲観的な予測が、悲観的な現実を、実現させてしまっている。 まさに夢は叶うってやつです。 そういえばみなさんそういうの大好きなんでしたっけ。なるほど。やはりドウショウモナイですね。 なんでしょうね。 こういう「空気感」のようなものに対して、一体何をどうすればいいのか? たとえどんなに「正しい」ことを言ったとしても、 「でも、みんなはそうは思ってないよね」の一言で全否定です。 結局何を言ってもドウショウモナイ。 その「みんな」というのは誰のことなのか? 「みんな」はさておき、あなた自身はどう思うのか? と言いたいところではありますが、そういう対話自体が成立しないという事実にこそ問題の根源がある。底知れぬ闇がそこにある。 おっと、底知れないのにそこにあるとは今日も私の天才っぷりは誰にも止められないようですよ。 >「みんな」はさておき、あなた自身はどう思うのか? ここのところが、いわゆる民主主義が前提とするところであろうと思われます。 しかし、その前提自体が間違っているのではないかとさえ思えてきます。 外国のことはよく知りませんが、こういう傾向は別に日本が特に、というわけでは必ずしもなさそうです。 一人一人が自立した自己自身である、という人間観自体が、そもそもファンタジーなのではないのか? 民主主義という迷信。 他人に流されずに自分で判断しましょう、などとは言いますが、 そもそも、そこに何らかの思い違いがあったりするのではないのか? そのようではない人を批判して、そのようになりましょう、という。それ自体が、何かの勘違いではないのか? しかし、じゃあ一体何なのか? 物質世界という舞台で人体たちが踊っている。その舞台裏で人体たちを動かしている仕組みは一体どのようなものであるのか? 果てしなく不可解ながら、おそらく地球上に人間として生きている間には知りえないことなのでしょう。 > 民主主義という迷信。 迷信ではあるかもしれませんが、それでも、大体において納得感を得やすいシステムではあるはず。 「どうせオメーラは何にもわかんねーんだから」と言って誰かに独裁されるのではなく、 「一応みんなで決めたこと」になっている方が納得はしやすい。 しかし、だから結局「仕方ないじゃん」という諦め感にもなってしまうのでしょうか。 でも私は消費税10%に賛成した覚えはありませんよ? 今回も地方選ながら、消費税10%に反対を表明している候補者に投票しました。10%だなんてそんなことはこの私が認めません。このやろ〜。 別に選挙に限ったことではなくてですね。このドウショウモなさ。 政治じゃないですけど、私、今まで結構いろいろやってきたんですよ。やろうとしてきたというか。 しかし世間は相変わらずです。 別に世界を変えるだとか、そんな大それたスケールじゃないにしても、多少は賛同を得られてそれなりの動きを形成できる、 ぐらいのことは期待してもいいような気がしてたんですけど、しかし、何をしてもダメでしたね。 私の考えややり方自体にそんなに大きな間違いがあったとは、今でもあまり思っていません。 別に世界中の人が私の斬新なアイデアにコロっと入信してくれるなんて思ってたわけではないですけども、 現状の中で不満を抱えている人は確実にいて、そうした人たちの不満を解決しうる方策ではあったはず。 じゃあそうした人たちが積極的に賛同してくれたかと言えば、まったく全然ダメでしたね。 別にアイデアコンテストというわけではないので「同じようなことを考えてるのはおまえだけじゃない」なんて言われても困る。 私だけじゃないなら、じゃあ賛成してくれるってことなのかといえば、もちろんそうはならない。 私の考えややり方に間違ったところがあると思うなら、積極的に批判を受け付けるつもりでオープンにもしていたつもりですが、 正面から批判をする人というのはほぼゼロ。たまに冷笑的な反応があればマシな方。 結局、キミたち自身がそんな態度なのだったら、何をどうしたって、ドウショウモナイ。そうとしか言いようがない。 > 私の考えややり方自体にそんなに大きな間違いがあったとは、今でもあまり思っていません。 間違っていたところがあったとすれば、 「正しいことを言えば正しい結果になるはずだ」という幻想があった、ということです。 "人" が集まっている "この世" というものは、もっと何か、得体の知れない仕組みで動いている。 それを「人情」だとか「愛」だとか、綺麗な言葉で表現するのもよいでしょう。 そうしたことを理解できないことは、非常識なことであり、人の心の機微がわからない唐変木であるというわけです。 まさに「空気が読めない」ってやつです。 はい。だからその「空気感」ってやつが、まさに得体が知れないってことですよ。 何でキミはそう思うの? キミ自身は本当のところどう思ってるの? そんなこと言ったって……ゴニョゴニョ……じゃ、じゃあお前が立候補しろよ! どーせ誰も投票しないけどな! ヘンっ!! はい。ごめんね、気を悪くさせるようなこと言って。 ただ一つわかって欲しいのは、私はあなたを嫌な気分にさせるのが目的だったわけでは決してないってことです。 私は少なからず縁のあった人たちを嫌な気分にさせてしまっただけなのでしょうか。 それにしても得体が知れない。 "人" が大勢いる "この世" の中で、その "人" 自身は、何を願ってそこにいるのか? すべての人が幸せであってくれるといいのに。 何か得体の知れない呪いが舞台裏からこの世をドウショウモなく縛っているように思えてなりません。 本当のことを知りたい。