どうもどうも! EIEIです!
…えー、唐突に始まったこのシリーズなのですが、「Unity」というゲームを作るソフトを、
僕がいじくりまわす日記となっております。
僕がたま~に土日を使って、簡単なゲームを作っていたりするので、それをブログに書けたらな~、と思いまして!
いつもマイクラの記事ばかりですし、たまにはいいでしょ、ということで!
文章が拙いかもしれないけど、気軽に見て行ってね(笑)
ということで! まずは誰もが1回は遊んだことがあるであろう、オセロを作っていきます!
プログラミングを全く知らない方でも、読みやすいように書くつもりでございます…
オセロをプログラマー目線で考える
皆さんオセロの遊び方は知っていると思いますが…
オセロは、白と黒に分かれて、相手の色を自分の色で挟んで、石の数が多い方が勝ち、というシンプルなルールですね!
「石」って呼び方が正確かどうかは知らないけど、
この記事ではコマのことを石って呼んでいますよ~
まず、オセロの盤のマスは8×8です。すなわち64個。
これに加えて、「盤の外」という判定を作るために、プログラムでは盤の大きさを10×10とします!
10×10のうち、中の8×8が実際に石を置く場所だね。
そして、1つのマスにもいくつかの状態があります。
- 白の石が置かれている
- 黒の石が置かれている
- 何も置かれていない(けど、石を置くことができる)
- 盤の外(何も置かれていなくて、石を置くことができない)
オセロって白と黒しかないのに、状態を4つに分けるんだね…
10×10のマスの中に、4つの状態があります。
これをプログラムでいじくることができたら、オセロを作れそうですね!
下の青枠の中には、ちょっと踏み込んだ内容を書くから、
難しいなって思ったら飛ばしちゃって大丈夫ですよ~
1010のデータをどうやってプログラムに記憶、変更させるかというと、
「二次元配列」という、表のようなデータ入れ場? を利用します!
表のような形なので、オセロを作るときと相性抜群!(のはず)
そして、オセロはグラフィックが超簡単!
白の石、黒の石、そして雰囲気を出すために盤のグラフィックをとりあえず用意します。
あと、どこに石を置くか指定するために、枠も作ります。
グラフィックは手を抜くのが僕のスタイルです(どや)
オセロを作っていく!
ここから本格的にプログラミングに入っていきます!
まず、最大64個の石をどう表示するかを考えます。
64個も石を表示しないといけないのか…
1個1個作るのはとても大変だね。
1個1個作ると僕の土日が消えちゃうから、
今回は1つのものをコピーして作ります!
実は、Unityは設計図(プレハブと言います)を作っておけば、これをコピーし放題!
試しに黒の石と白の石をコピーしてみた様子がこちら。
黒のほうが手前に来てしまっていて、白は見えていませんが(苦笑)
ほとんど僕たちは作っていないのに、一気に石を作れたね♪
コピー機という表現を使いましたが、「BlackGenerator」や「WhiteGenerator」のプログラムは、
「ゲームが開始された時、プレハブ(設計図)を64回コピーする」みたいな感じになっています!
だから、コピー機っていう表現が割と分かりやすいと思います… どうでしょう?
そして、コピーされた石にもプログラムを与えます。
その内容は、10×10の情報に応じて、画面の手前に来る、奥に行く、という動作をしろ、というものです!
もし「白の石がある」という情報ならば、
白の石は手前に来て、黒の石は奥へ行きます。
盤より奥にいったら、遊ぶ人からは見えなくなるからね~
そして、10×10の情報に、「ゲームが始まったら、白を2つ、黒を2つ、決まった位置に置いてね」と命令すれば…?
よくみるオセロの光景が完成しました!
ここまで少しごちゃごちゃしてきたので、まとめると
- 盤の情報を10×10の範囲でコンピューターに記録させる
- 石は設計図をもとにコピーして、64個設置する
- 1つ1つの石が、自分のいる場所と、盤の情報を比べて動く(見える、見えなくなる)
といった感じでしょうか?
これでようやく、石を表示することができるようになりました…!
次はいよいよ、石を挟んで色を変えるというシステムをプログラムしていきます!
…すなわち、10×10の盤の情報を、プログラムで変更する、ということですね。
オセロの醍醐味! 石をひっくり返すプログラムを作るために…
さて、オセロをひっくり返す時ですが、かなりいろいろなパターンが考えられます。
なぜかと言うと、「白の石」「黒の石」「何も置かれていない」の3つがあるからですね!
プログラムで、この3つがどう出てきても対応できるようにしないといけないってことだね。
石をひっくり返せるときは、次の状況だけ!
「手前に敵の石、そして進んでいくと自分の石がある状況」
「何も置かれていない」に邪魔されなければ、石をひっくり返せますね♪
そして、「手前が自分の石や、何もない」だったり、「進んでいくと何もない」といった場合には、
挟むことができないので、石をひっくり返せませんよね。
文章だけだと分かりづらいので、図にすると下の画像のような感じ!
ということで、試行錯誤しながらもプログラムに次のように書きました。
「まずは挟めるかどうかを確認して、もし挟めるなら、挟める回数を覚えなさい。
そして、挟める回数分だけ、10×10の盤の情報を書き換えなさい。
これを、上、下、右、左、そして斜め4つ分、計8回やりなさい。」
こうして文章に書くとなんか変な感じだけど、
僕たちがオセロを遊んでいるときに、無意識に考えていることだよ。
無意識に考えているから、こんな論理的に考えるのは余計難しいよね
プログラム書くのに結構手こずりました。
もう少しプログラマー的な解説は下の青枠のなかで… 慣れていない人には難しいかも。
日本語でプログラムの仕組みを書くと、下のような感じです…
①調べるマスが相手の石なら、挟める回数を+1。自分の石なら、成功とする。何も置かれていないなら、挟める回数に関わらず失敗とする。
② ①を成功、もしくは失敗が出るまで、奥へと進んで繰り返す
③成功した場合、記録した挟める回数を元に10×10の盤の情報を書き換える
④ ①~③を、計8方向に行う
⑤いずれかの方向で成功が出たら、相手の番へ。全部失敗なら、そのマスには石を置けないので、何も起きない。
そして、枠もボタン操作で動かせるようにしました!
これで、ついにオセロが遊べるようになりました(笑)
ただオセロを作るまでに、ここまで考えないといけないんだね!
…まあ実は、まだ少し足りていないものがあるのですが…。
プログラミングに強い方は、もしかしたら気づいてしまったかも?
クリア判定と、ガイドの作成!
次に、クリア判定を作っていきます!
ゲームが終わったら、どちらが勝ったかを画面に表示したいですよね。
クリア判定は、次のような状況になったらすればいいですね!
- 64個石が置かれた(盤が埋まった)時
- どちらかの石の数が0個になった時
- どちらも石を置くことができなくなった時
このうち、上の2つはそれぞれの石の数を数えるだけなので簡単です!
それならすぐに作れちゃいます!
ただ、一番下の条件は、石の数を数えても意味がないので、ここでやり方に行き詰りました…。
…とここで、twitterで教えて下さった方が!
頭が上がらないです…(笑)
これには、「ここのマスにはコマを置くことができるか」をすべてのマス… すなわち8×8の範囲で調べる必要があります。
ということで、赤丸を、白や黒の石と似たような感じで作りました♪
赤丸は下のようなプログラムになっていますよ。
①石と同じように、64個コピーを生み出す
②コピー1つ1つが、「もし自分の位置に石が置かれたら、成功するか?」を調べる
(先ほどの石をひっくり返す時で言う、「8方向のいずれかに成功する」かどうか)
③もし成功するならば、今いる場所が「何もないけど、石を置くことができるマス」かどうかを確認する
④もしOKならば手前に、失敗するなら奥に行く
これもオセロをするときは、無意識に考えていることだね。
だからこそ、難しいかもしれない…
僕の説明がかなり下手なので、分かりづらいかもしれませんが、要は
「ここに置けるよ!」というガイドを作ったってことですね(笑)
もし、このガイドが1つも表示されない場合は、自動でパス扱いとします。
オセロのルールで、置く場所が無い場合は、パスしないといけないんだよ~
そして、連続でパスが起きた場合は、どちらも石を置くことができない、ということなので、
連続でパスが起きたら、その時点で石の数を比べるようにします!
これで、オセロのゲームが完璧に作れました!
あとは、勝敗の判定を画面に文字で表示するようにしました。
ぜひ、下にゲームが動く様子の動画がありますので、そちらをご覧ください♪
これでオセロができました!
実はここまで5時間くらいかかった。
さて、今回はUnityでのゲーム制作日記を書いてみましたが、どうでしょうか?
僕としては、プログラミングの内容をできる限り分かりやすく日本語にできたかが怖いのですが…(笑)
日本語にすることなんて日頃無いから、難しかった…!
もし読みづらい所があったらごめんね!
プログラミングの知識はかなり少ないですが一応、筆者は高専の情報系の学科に通っているので、
もし少しでもプログラミングに興味を持ってくださったり、楽しく読んでくださったならば幸いです…!
#2がいつか、そもそも投稿されるかは未定ですが、感想を教えて下さると嬉しいです♪
それでは皆さん、バイバ~イ!
コメント
ジェットさんへ返信
こんにちは〜
オセロは、石をひっくり返す処理を作るのがめんどくさいのですよね〜(笑)
この記事では参考にならないかもしれませんが、頭を柔らかくすると思いつくこともありますので、
ぜひ頑張ってみてください♪
どうもこんにちわ!ジェットです。
Unityを使ったプログラミングは自分もやったことがあるのですが、私にはこんなに複雑なプログラムを書くことができないので、すごいと思いました!!
私にもこんなゲームをUnityやC#で作ってみたいです(*’ω’*)
M41 bulldogさんへ返信
一応情報系の学科の高専生なので!(笑)
でも、僕もまだまだ実力不足ですよ~
僕はPythonを書いたことが無いので分からないのですが、
どうやらC言語とだいぶ違うらしいですよね…
ネットで調べたら分かりやすい記事がたくさんあるので、頑張ってください!
Unityでプログラミングですか!いいですね!
私はまだ練習中で、入門の域を出ないものです…
オセロのプログラム、だいたい何書けばいいかはわかるのですが、そこからが問題で、C#、C++どっちも構文の書き方がよくわからないのです…
Pythonなら書いたことあるんですけどね…
ぐりんごさんへ返信
作り終えた勢いで記事まで書きあげました(笑)
僕のゲーム作りの最低ラインが「とりあえず動く」なので、
今回のオセロは大成功でした(笑)
最近は様々なゲームがUnityで作られていますよね~
Unityは無料で利用できますし、調べたらプログラムの方法まで細かく出てくるので、
ぜひお時間のある時にインストールして触ってみてください♪
記事もアップされたんですね!
お疲れさまでした。
見た目がきちんとオセロになっているだけでもすごいですが、当たり前ですが、ちゃんと遊べるというのがすごいです。
最近、switchでもUnity使ってるの多いから気になってました。
気になって、サイトで調べてお気に入り登録、Amazonで調べてお気に入りリストに入れてそこまででした。
こんな簡単に(簡単そうに見えてしまう・・・)できるなんてすごいですね!
いつか自分もやってみたいです!(が、やらないで満足して終わるでしょう・・・)