はじめに
6ボールパズルをpython上で実装しようと思ってやってたら,くそコードが出来上がりました.
飽きたのでネットの海に放流して終了しよう・・・
操作方法
a:右60deg回転
b:左60deg回転
j:左移動
l:右移動
k:落下開始
参考動画
https://www.youtube.com/watch?v=Q6As1gRT6fE&t=660s
運動シミュレーションを行っている感じがしますが,ちょっと難しいので,まったく同じものは作れそうにないです.
アルゴリズム
条件
- ボールは$b,c$にしか動かない
- $b$に動くには,$a,b$にボールがない
- $c$に動くには,$c,d$にボールがない
- $b,c$どちらにも動ける場合,$a,d$にあっても問題ない,動く方向は$b,c$ランダム
探索方向
下の層から動けるかを確認し,動けなくなるまで動かしていく
データ構造
列の場所が,行の場所で0.5個分ずれるので,少々扱いにくい
いろいろ悩まないように次のように,番号をつける
赤,青,黄,紫,緑,空
の6種
空を0とする
19列,12行にする
落下-テストプログラム
(この結果は,下のプログラムでは,opencvで描画していないので,ちょっと違いますが,落下処理は同じです.ネクストの表示が2個分しかないですが,単純なミスでした)
結構いい感じの結果が得られて満足です.
これは固定されて動かない.左端の青を落としてやるか悩む.
現状,壁は左右,右下,左下に球があるという認識でやっているため,こうなる.
プログラムはgithubに上げました.
入力系
ボールセット(3個)をキーボード等で動かし,落下させた際
ボールセットがどこに落下されるか計算したいです.
キーボードで入力した左右移動量でボールセットを動かし,ボールセット落下ボタンが入ったら,直線的に落下させ,3個のボールの内どれかが,すでにあるボールに衝突し,直線的に動けなくなるとボールセットが崩れて,そこからは先ほどの落下方式で処理させようと思います.
直線的落下時の判定ー逆三角
直線的落下時の判定ー三角
結果1-床への衝突
悪くはない,しかし,スタート地点が悪いと
こんな感じで,0.5ずらす必要が出てくる.
ずらす方向は,右寄りなら左へ,左寄りなら右へとした
結果2-逆三角-真下にある
ちゃんと,ずらして,落下させています.
結果2-逆三角-左下にある
ちょっと不自然,黄色の横の水色は黄色の下ではなく,できれば,右下に落ちてほしい...
ただし,ランダムで
この場合もある
現状の処理では,右下・左下どちらにも行ける場合はランダムで選択にしているためである.
追記:
条件
- ボールは$b,c$にしか動かない
- $b$に動くには,$a,b$にボールがない
- $c$に動くには,$c,d$にボールがない
- $b,c$どちらにも動ける場合,$a,d$にあっても問題ない,動く方向は$b,c$ランダム
条件4を書き換える
4. $b,c$どちらにも動ける場合,$a$に球があるときは$c$,$d$に球があるときは$b$,どちらにもないときは$b,c$ランダム
に変更する.
ランダムではなくなり,自然になった・・・
ヘキサゴン・ピラミッドの検出
最後に検出方法を考える
原始的な方法しか思いつかなかったが
こんな感じで,開始点を走査して検出してみる
ピラミッドも同様にする.
7個以上つながると削除
最終結果
コードがすごい長くなってしまったので,ちょっとここには載せられない.
githubとかいうやつに初めて載せてみます.
ball6_puzzle_exe.pyがゲーム実行プログラムです.
操作方法
a:右60deg回転
b:左60deg回転
j:左移動
l:右移動
k:落下開始
q:ゲーム終了