主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

pythonでぷよぷよの・・・

                
tags:

GYRR
RYYGYG
GYGYRR
RYGYRG
YGYRYG
GYRYRG
YGYRYR
YGYRYR
YRRGRG
RYGYGG
GRYGYR
GRYGYR

 ↑ぷよがこんなテキストで渡された時、連鎖を再現せよという問題を見たのでpythonで書いた。初めてリストが参照渡しであることに気づいたりやらなんやら。
 またリストを関数に渡すとき参照渡しをしてるゆえに、return文でリストの加工結果をもどしていない。return文でリストを返すほうが、リストを加工したことが明示的分かりやすいと思うけど、どうなのかなこれ。
 とりあえず使ったテクは画像処理で学んだ「ラべリング」と、プログラミングの基本の再帰。
 まずラベリングをするように、一番左上のぷよから右方向と下方向に走査を実行する。走査では再帰を使って隣接しているぷよが同じ色かをチェックしていく。無論再帰を使っているので、再帰を無限に繰り返さないようにアルゴリズムを組む。走査は一番右下のぷよで完了したら終わり。走査で作った「同じ色で隣接しているぷよリスト」の要素が4つ以上ならリストアップされたぷよをすべて消去。そしてぷよが消えて空いたところにはぷよを落とす。これの繰り返し。

コード

import copy

F=""" GYRR
RYYGYG
GYGYRR
RYGYRG
YGYRYG
GYRYRG
YGYRYR
YGYRYR
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR"""


def search(col, row, mat, chained, chara):

if row+1<6:
ar_chara = mat[col][row+1]
if chara == ar_chara:
chained.append([col, row+1])
chained = search(col, row+1, mat, chained, chara)
else:
pass
if col+1<13:
ar_chara = mat[col+1][row]
if chara == ar_chara:
chained.append([col+1, row])
chained = search(col+1, row, mat, chained, chara)
else:
pass
if row-1>-1:
ar_chara = mat[col][row-1]
if chara == ar_chara:
if [col, row-1] in chained:
return chained
chained.append([col, row-1])
chained = search(col, row-1, mat, chained, chara)
else:
pass
if col-1>-1:
ar_chara = mat[col-1][row]
if chara == ar_chara:
if [col-1, row] in chained:
return chained
chained.append([col-1, row])
chained = search(col-1, row, mat, chained, chara)
else:
pass

return chained


def listjoin(mat):
string=''
for hoge in mat:
string += ''.join(hoge) + '\n'
return string

def doub(li):
newli=[]
for m in li:
if not m in newli:
newli.append(m)
return newli

def drop(mat):
premat = 'hoge'
while mat != premat:
premat = copy.deepcopy(mat)
for col in range(12, 0, -1):
for row in range(6):
chara2 = mat[col][row]
if chara2 == ' ':
mat[col][row] = mat[col-1][row]
mat[col-1][row] = ' '
return mat

def delete(delpuyo, mat):
for k in delpuyo:
mat[k[0]][k[1]] = ' '

def main():
string = F.split('\n')
mat=[list(st) for st in string]
mat0='hoge'
rensa=0

while mat != mat0:

print listjoin(mat),'++++++++++++++++++++++++++'
mat0=copy.deepcopy(mat)

chaineddel=[]
for col in range(13):
for row in range(6):
chara=mat[col][row]
chained=[[col,row]]

if chara != ' ':
chained = search(col, row, mat ,chained, chara)
chained = doub(chained)

if len(chained)>3:
for dell in chained:
if not dell in chaineddel:
chaineddel.append(dell)

if chaineddel:
rensa += 1
print rensa
delete(chaineddel, mat)

drop(mat)

if __name__ == '__main__':
main()



結果

>>>
GYRR
RYYGYG
GYGYRR
RYGYRG
YGYRYG
GYRYRG
YGYRYR
YGYRYR
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
1
YRR
R GGYG
G GYRR
R GYRG
YGYRYG
GYRYRG
YGYRYR
YGYRYR
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
2
RR
R YYG
G YRR
R YRG
YGYRYG
GYRYRG
YGYRYR
YGYRYR
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
3
R
R RG
G RR
R RG
YGYRYG
GYRYRG
YGYRYR
YGYRYR
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
4

R R
G G
R G
YGYRYG
GYRYRG
YGYRYR
YGYRYR
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
5

R
G
R
YGYRY
GYRYRR
YGYRYR
YGYRYR
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
6

R
G
R
YGYR
GYRYY
YGYRY
YGYRY
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
7

R
G
R
YGY
GYRR
YGYR
YGYR
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
8

R
G
R
YG
GYY
YGY
YGY
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
9

R
G
R
Y
GG
YG
YG
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
10


R
G
R
Y
Y
Y
YRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
11






R
G
RRRGRG
RYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
12








R GRG
GYGYGG
GRYGYR
GRYGYR
GRYGYR
++++++++++++++++++++++++++
13








GRG
YGYGG
RYGYR
RYGYR
RRYGYR
++++++++++++++++++++++++++
14








GRG
GYGG
YGYR
YGYR
YYGYR
++++++++++++++++++++++++++
15








GRG
YGG
GYR
GYR
GGYR
++++++++++++++++++++++++++
16








RG
GG
YR
GYR
YYR
++++++++++++++++++++++++++
17








G
G
R
RR
GGR
++++++++++++++++++++++++++
18











G
GGG
++++++++++++++++++++++++++
19













++++++++++++++++++++++++++



追記
汎用性のためにクラス化した。
puyo.py
https://github.com/hMatoba/puyopuyo/blob/master/puyo.py
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。