LoginSignup
3
0

More than 3 years have passed since last update.

6ボールパズルをpythonで実装

Last updated at Posted at 2021-01-13

はじめに

6ボールパズルをpython上で実装しようと思ってやってたら,くそコードが出来上がりました.
飽きたのでネットの海に放流して終了しよう・・・

操作方法
a:右60deg回転
b:左60deg回転
j:左移動
l:右移動
k:落下開始

参考動画
https://www.youtube.com/watch?v=Q6As1gRT6fE&t=660s

運動シミュレーションを行っている感じがしますが,ちょっと難しいので,まったく同じものは作れそうにないです.

アルゴリズム

1.png
ボールに4方向a,b,c,dを定義します.

条件

  1. ボールは$b,c$にしか動かない
  2. $b$に動くには,$a,b$にボールがない
  3. $c$に動くには,$c,d$にボールがない
  4. $b,c$どちらにも動ける場合,$a,d$にあっても問題ない,動く方向は$b,c$ランダム

2.png
このような状態がちょっと難しいです.

探索方向
下の層から動けるかを確認し,動けなくなるまで動かしていく
3.png

データ構造

列の場所が,行の場所で0.5個分ずれるので,少々扱いにくい
いろいろ悩まないように次のように,番号をつける

4.png

赤,青,黄,紫,緑,空
の6種
空を0とする

19列,12行にする

落下-テストプログラム

fall1.gif
(この結果は,下のプログラムでは,opencvで描画していないので,ちょっと違いますが,落下処理は同じです.ネクストの表示が2個分しかないですが,単純なミスでした)

別パターン1
fall2.gif

別パターン2
fall3.gif

結構いい感じの結果が得られて満足です.

ちょっと問題かもしれないパターン1
1.jpg

これは固定されて動かない.左端の青を落としてやるか悩む.
現状,壁は左右,右下,左下に球があるという認識でやっているため,こうなる.

fall4.gif

fall5.gif
これは,ランダムでどちらかのパターンが選ばれる

プログラムはgithubに上げました.

入力系

ボールセット(3個)をキーボード等で動かし,落下させた際
ボールセットがどこに落下されるか計算したいです.
キーボードで入力した左右移動量でボールセットを動かし,ボールセット落下ボタンが入ったら,直線的に落下させ,3個のボールの内どれかが,すでにあるボールに衝突し,直線的に動けなくなるとボールセットが崩れて,そこからは先ほどの落下方式で処理させようと思います.

5.png
6.png
7.png

直線的落下時の判定ー逆三角

8.png
9.png

直線的落下時の判定ー三角

ちょっと,調べるべき場所が多いためめんどくさいが頑張ろう
10.png

結果1-床への衝突

fall6.gif

fall7.gif

悪くはない,しかし,スタート地点が悪いと
fall8.gif
こんな感じで,0.5ずらす必要が出てくる.
ずらす方向は,右寄りなら左へ,左寄りなら右へとした

結果2-逆三角-真下にある

fall9.gif

ちゃんと,ずらして,落下させています.

結果2-逆三角-左下にある

fall10.gif

ちょっと不自然,黄色の横の水色は黄色の下ではなく,できれば,右下に落ちてほしい...
ただし,ランダムで
fall11.gif

この場合もある
現状の処理では,右下・左下どちらにも行ける場合はランダムで選択にしているためである.

追記:

条件

  1. ボールは$b,c$にしか動かない
  2. $b$に動くには,$a,b$にボールがない
  3. $c$に動くには,$c,d$にボールがない
  4. $b,c$どちらにも動ける場合,$a,d$にあっても問題ない,動く方向は$b,c$ランダム

条件4を書き換える
4. $b,c$どちらにも動ける場合,$a$に球があるときは$c$,$d$に球があるときは$b$,どちらにもないときは$b,c$ランダム

に変更する.
ランダムではなくなり,自然になった・・・

ヘキサゴン・ピラミッドの検出

最後に検出方法を考える
原始的な方法しか思いつかなかったが

11.png

こんな感じで,開始点を走査して検出してみる
ピラミッドも同様にする.

7個以上つながると削除

これをするための検出方法
12.png

最終結果

コードがすごい長くなってしまったので,ちょっとここには載せられない.
githubとかいうやつに初めて載せてみます.
ball6_puzzle_exe.pyがゲーム実行プログラムです.

操作方法
a:右60deg回転
b:左60deg回転
j:左移動
l:右移動
k:落下開始

q:ゲーム終了

3
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0