2020 ソフトウェア設計及び演習用の班Wiki

20::gr09::モジュール化

モジュール化

9班wiki > モジュール化

優先して作るもの

  • フィールド
  • 操作ミノ(その他の人も書くのに参加)

役割分け

  • フィールド → 村上斗真
  • 操作ミノ → 相馬大知・小林拓海
  • その他(画面、BGM、ネクスト、ホールドなど)→ 小林拓海
  • AI、main→鈴木直揮

仕様

  • ネクスト
    • フィールドの隣にネクストを5個表示する
    • 7個のミノを一まとまりとして、その中でランダムに順番を変える
    • 7個のミノをランダムな順番にしたプールを用意しておく
    • push
      • ネクストが空いた時、もしプールにミノがあったらプールからミノを一つ取り出す、プールにミノが無ければ、プールを作ってからプールから一つ取り出す
    • pop
      • ミノが置かれる、または、ホールドされた時、ネクストの一番上から取り出して、空いた分一個ずつ上にずらす
  • フィールド
    • お邪魔ブロックのせり上がり方
      • (暫定的な仕様)今まで積んであったブロックをせり上がる分上にずらした後に、横1ラインの中で1箇所空くブロックを選んで、上にずらした分1ブロック空いたラインで下まで埋める

フィールド(前の仕様)

ミノの表示

・makeField
 フィールドの枠を9何もないところを0としてフィールドの初期状態を作成

ミノのラインけし

・lineClear関数
 上から下まで探索していって1が埋まっている行を見つけ次第、すべて0に書き換えて、それより上の行をすべて1個下の行に上書きする

お邪魔ブロックを受けた時の処理

・jamBetweenLine関数
 上から順に一段上の行にミノを上書きして空いた一番下の行にお邪魔みのを設置(お邪魔はランダムでどこかの列が空いている)

操作ミノ

操作ミノ表示

現在操作できるミノを表示する。
設置したらフィールドのモジュールにミノを関数として渡し、ネクストミノを操作ミノとして表示。

横移動 moveRight(), moveLeft()

moveAndRot()で横に1マス移動できるか判定する。
移動できたらlockdown()で設置判定。

回転 rotateRight(), rotateLeft()

その場で回転させてみる。
できなければ数マスずらして回転させてみる(ミノの状態でずれ方は異なる)。
それもできなければ回転せずに終了。

下に移動(ソフトドロップ) softDrop()

moveAndRot()で下に1マス移動できるか判定する。
移動出来たらlockdown()で設置判定。

一気に下に移動(ハードドロップ) hardDrop()

キーを押したら設置されるまで下に一気に移動させる。
ハードドロップ中は回転や移動の操作を受け付けない。

ミノ設置 lockDown()

操作ミノが0.5秒間床に接触したらミノを設置して次のミノを出現させる。
ハードドロップでは接触時間を考慮しない。

自動落下

1秒ごとに自動でソフトドロップを行う。

ホールド Hold()

キーを押したら操作ミノとホールドミノを入れ替える。
ホールドミノが無い場合は操作ミノをホールドミノとし、ネクストミノを操作ミノにする。
ホールドをしたらミノを設置するまで再度ホールドすることはできない。

フィールド

  • jamBetweenLine(num): numは送るライン数
    • 相手のフィールドにお邪魔を送る
    • 成功した場合trueを返す

AI

  • 置ける場所全探索
    • 関数: fullSearch(argMino) argMinoはMinoクラス、今の盤面などの状態を持っている
    • ネクストから1個ミノを取り出す
    • ミノを四方向回転させる(操作ミノ)
    • それぞれの方向で、左端から右端まで1マスずつ移動させながらハードドロップして盤面を作る(操作ミノ)
  • 盤面評価: evaluateBoard()
    • 全探索で作った盤面全てで、穴が空いていないか、平らになっているか、ラインを消すことが出来るかを点数にして表す
  • 操作の決定: decideOperation()
    • 盤面評価した結果を元にして、一番最適な操作を決定する。
  • 操作の順序を作る
    • 関数: makeSequence(argMino, x, addRotationRight) xはミノを置きたい座標(整数)、addRotationRightはいくつだけ右へ回転させたいか
    • 操作を一まとまりの順序にしてoperateが操作出来るようにする
  • 実際に操作: operate()
    • makeSequenceが作った操作の順序を元に実際に操作する
  • run(argMino) argMinoはfullSearchと同じ
    • 盤面や今のミノの状態を受け取って、どのようにミノを置けば良いか思考し、operateに操作を任せられる段階まで持っていく。
  • test(argMino) argMinoはfullSearchと同じ
    • 実際に操作した結果と探索した結果が一致しているかどうかテストする為の関数
  • AIのインターフェース?
    • ミノを置く前にrunを実行する
    • 操作をする時はoperateを実行する

その他

スタート画面

岩大テトリスのタイトル通り、背景にガンちゃんの画像を表示する。

リザルト画面

BGM

各画面でのBGM再生

モジュールのインターフェース

対戦形式になるという都合上、フィールドや操作ミノなどはクラス化をしていて、クラス内の変数を変化させれば良いので関数への引数が無い。

  • フィールド(field)
    • field: フィールドの配列
    • jamBetweenLine(): 相手のフィールドにお邪魔を送る
  • 操作ミノ(Mino)
    • Next(): ネクスト取り出し
    • Hold(): ホールド処理
    • moveRight(): 右へ移動
    • moveLeft(): 左へ移動
    • softDrop(): ソフトドロップ
    • hardDrop(): ハードドロップ
    • rotateRight(): 右回転
    • rotateLeft(): 左回転
  • AI
    • run(argMino): AIの思考を始める
    • operate(): 思考結果に基づいて操作する


最終更新日:2020/08/14 12:19:36