seigot/tetris

テトリスプリンターアルゴリズムをなんとかして手の内に実装したい

Opened this issue · 7 comments

テトリスプリンターアルゴリズムをなんとかして手の内に実装したい

https://meatfighter.com/tetrisprinteralgorithm/
The algorithm can also generate multiple squares with a single structure as shown below.

必要に応じて以下も合わせて検討

  • 盤面を大きくする(10×22 ---> 65×65)
  • ブロックの色を途中から変える(今は6色 --->N色を増やす)
seigot commented

masatoさんの実装(2dot printerアルゴリズム)

seigot commented

今のはこちら
def fill_most_isolated(rnd,testboard,adj_zero, adj):
・boardのうち一番奥まったマスを探す
・そのマスにブロックを置く
・ブロックが置かれたのでadj_zero(空白マスの状況)を更新する、adj(次手の候補手)を更新する

def fill_isolated_from_adj(rnd,testboard,adj_zero, adj):
・次手の候補手のうち一番奥まったマスを探す
・そのマスにブロックを置く
・ブロックが置かれたので(以下同文)

def fill_adj_and_adj_zero(isolated, adj_zero, adj):
・これが上記の「更新する」です
・ブロックが置かれたらその四方のマスにとっては隣接する空白マスが1つ減ります。また、四方のマスが次の候補手になります。ただし置かれたマスがboardの辺上にある場合は"四方"ではなく3つか2つを更新するので、ifで辺上にあるかをチェックしています

[22:11]
制約を求める
def find_constraint(board):
自分より先に落ちるべきミノ(=一部分でも自分より下にあるミノ)を列挙しています

求めた制約を元にorderを決める
def find_shapeorder(board,constraint):
自分より先に落ちるべきミノが無いものから順に選んでいきます。
選択されたミノは、他のミノにとっての「自分より先に落ちるべきミノ」から削除されます

seigot commented

image

seigot commented

コメント書いて頂いてありがとうございます!
それぞれやりたいことはこんな感じです

def fill_most_isolated(rnd,testboard,adj_zero, adj):
・boardのうち一番奥まったマスを探す
・そのマスにブロックを置く
・ブロックが置かれたのでadj_zero(空白マスの状況)を更新する、adj(次手の候補手)を更新する

def fill_isolated_from_adj(rnd,testboard,adj_zero, adj):
・次手の候補手のうち一番奥まったマスを探す
・そのマスにブロックを置く
・ブロックが置かれたので(以下同文)

def fill_adj_and_adj_zero(isolated, adj_zero, adj):
・これが上記の「更新する」です
・ブロックが置かれたらその四方のマスにとっては隣接する空白マスが1つ減ります。また、四方のマスが次の候補手になります。ただし置かれたマスがboardの辺上にある場合は"四方"ではなく3つか2つを更新するので、ifで辺上にあるかをチェックしています

奥まったマスから埋めていくのはその方が詰まなさそうだからです

seigot commented

以下の2つは、下に来るミノから順に落とさないといけないので積み重なり具合で順番を決めています。

def find_constraint(board):
自分より先に落ちるべきミノ(=一部分でも自分より下にあるミノ)を列挙しています

def find_shapeorder(board,constraint):
自分より先に落ちるべきミノが無いものから順に選んでいきます。
選択されたミノは、他のミノにとっての「自分より先に落ちるべきミノ」から削除されます

@seigot Pull request completed! Check it out here #182 🚀

Note: I automatically create a pull request for an unassigned and open issue in order from oldest to newest once a day at 00:00 UTC, as long as you have remaining automation usage. Should you have any questions or wish to change settings or limits, please feel free to contact info@gitauto.ai or invite us to Slack Connect.