はじめに
こんにちは!前回までの記事では、PLCとタッチパネル(GOT)を使って、オセロゲームの盤面表示や操作方法を作ってきました。
そしていよいよ今回は、オセロの醍醐味である「石をひっくり返す処理」に挑戦します。
普段は産業用機械を自動制御するPLC。そんなPLCでオセロのようなゲームロジックを組むのは、なかなか新鮮な経験です。
しかも今回は、ただ置くだけでなく、「合法手のアシスト機能」もあわせて実装してみました。
「このマスに置けますよ」と教えてくれるアシストがあると、ゲームの体験もぐっと快適になりますよね。
今回の記事では、そんなゲーム性を高める仕組みについても、PLCのラダー制御でどうやって実現したのか、順を追って解説していきます。
※今回は、各命令の解説をすると長くなるので省略します。
もし、「ここをもう少し詳しく解説してほしい」などがありましたら、
お問い合わせフォームからご連絡ください。
お問い合わせフォーム
使用ソフトと開発環境
今回のオセロゲーム制作では、三菱電機の開発ソフトを使いました。どちらも無料の体験版が提供されており、手軽に始めることができます。
使用したソフトウェア
- GX Works3:ラダー回路の作成に使用
- GT Designer3:タッチパネル(GOT)画面の作成に使用
ダウンロード先
以下の三菱電機公式サイトから体験版をダウンロードできます。
もし開けない場合は、三菱電機公式サイトのダウンロードからアクセスしてください。
👉 [GX Works3 体験版ダウンロードページ(三菱電機公式)]
【三菱電機公式サイト】GX Works3 体験版
👉 [GT Designer3 体験版ダウンロードページ(三菱電機公式)]
【三菱電機公式サイト】GT Designer3 体験版
※いずれも三菱電機株式会社の登録商標です。本記事では紹介目的でリンクを掲載しています。
オセロのルール再確認
まずは、今回の処理に必要な「オセロの基本ルール」を簡単におさらいしておきましょう。
石をひっくり返す条件
- 自分の石を置いたとき、その石とすでにある自分の石で、相手の石をはさむ。
- はさまれた相手の石はすべて自分の色にひっくり返る。
- 挟めない場所には石を置くことができない。
対象となる方向
チェック対象は縦・横・斜めの8方向です。
- 上
- 下
- 左
- 右
- 左上
- 右上
- 左下
- 右下
各方向に連続して相手の石が並んでおり、その先に自分の石があれば、「はさんだ」と判定されます。
合法手(置ける場所)とは?
合法手とは、上記の条件を満たして石を置けるマスのことです。
逆に言えば、どの方向にもはさめないマスには置くことができません。
この合法手の判定が、次に解説する「ひっくり返す処理」や「アシスト機能」の土台になります。
処理全体の流れ
オセロで石をひっくり返すためには、プレイヤーの入力から始まり、複数のステップで処理を進める必要があります。
ここでは、ラダーで組んだ処理の全体的な流れを整理してみましょう。
演算補助の作成
毎スキャン処理する必要はないのでRUN後1スキャンのみ処理します。
ゲームスタート処理
ゲームスタートボタンを押したときに、
内部デバイスを初期化+中央に黒白の石を2つずつ配置します。
アシスト表示処理
1:黒と白モードスタート時の1スキャンのみ処理します。
2:前回のアシスト表示を削除します。
前回のアシストを削除しないと、白モードなのに、白アシストと黒アシスト同時出力することになります。
3:自分色がヒットしたときにサブルーチンを呼びます。
サブルーチン命令の詳細は「CALL P0 現在位置 相手色 モード」となっています。
現在位置=サブルーチンを呼び出すと同時に、現在位置を渡すことができます。
相手色+モード=相手色とモードを渡すことで、サブルーチンの共通化することが、回路を短くしています。
ひっくり返し処理
透明の押し釦(Mデバイス)が押されたときのPLS(Vデバイス)処理で開始しています。
また、処理する条件として、前文のアシスト処理で、アシスト表示している場所のみ処理条件となっています。
1:アシストと同じサブルーチンを使用します。
2:FF命令でモードの切り替えを行います。
3:ひっくり返し処理が終わればFor~Next処理をBreakします。
サブルーチン
1:サブルーチンの引数整理と演算補助用デバイスの初期化をします。
2:引数でモード判定を行います。
3:反転判定処理+アシスト表示を行います。
[For K8]//8方向
反転判定リセット
[For K7]//7回で必ずK99に到達する
反転判定処理
[Next]
アシスト表示処理
[Next]
※1
反転判定処理条件にK99がありますが、
ここの処理のために8×8ではなく10×10マスで設計しています。
外枠にK99を入れることで、判定終了位置が共通化することができます。
これをしないと8方向すべてのパターン回路を作ることになります。
※2
注意点:サブルーチンのインデックスは、サブルーチンを呼び出し回路で使用するインデックスを別にする必要があります。
4:ひっくり返し処理を行います。
[For K8]//8方向
[For K7]//7回で必ずK99に到達する
ひっくり返し処理
[Next]
[Next]
パス処理
アシストカウント数が0だったら、1秒後にモード反転します。
ゲーム終了
1:石の数をカウントします。
2:カウントした石の数でゲーム終了判定をします。
制作上の注意点・工夫したこと
ラダーでオセロのようなゲームロジックを組むのは、思った以上に工夫が必要でした。
ここでは、制作中に気づいた注意点や、動作を安定させるために行った工夫を紹介します。
演算処理用のデバイス
8方向判定処理にRUN後1スキャンのみ演算補助を作成しましたが、
今回初めて[MOV K-10 D100]のようにK-〇を使ってみました。
初めて使ってみましたが、今回のようなゲーム制作のみにした方がよいかと思いました。
1wordや2wordの符号有無をしっかり認識していないと不具合が発生しますので、、
SET/RST命令ではなくFF命令
モードの切り替えでSET/RST命令を使わずにFF命令で作成しました。
このおかげで回路が短くて済みました。
今後の展開(次回予告)
今回は、PLCのラダー回路を使って
「石をひっくり返す処理」
「置ける場所を表示するアシスト機能」
「ゲーム終了判定」
を実装しました。
産業用で使用されているPLCでも、工夫次第で複雑なロジックを構築できるということが実感できたと思います。
また、GOT画面との連携によって視覚的なアシスト表示も実現でき、ゲームとしての完成度も一歩前進しました。
次回はシミュレーションで動かしてみよう
次回作で実際にPLCとGOTのシミュレーション機能のやり方と合わせて
動かしてみます。
それでは、次回もどうぞお楽しみに!