パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

Python ぷよぷよのAIを4年ぶりに作ってみる

2023-11-07 | 新規1000万人ぐらいにプログラムをマスターしてもらいたい

CodinGameのSMASH THE CODE 4年前のプログラムをみてみる

2760人の参加者の中で629位 まあそんなに悪くもない

その前にもぷよぷよ風のアルゴリズムを日本のコンテストで

C++で書いた記憶があって、そこそこ連鎖させていたはず

 

4年前のPythonのコードはクラスまで使っていて350ステップほど

しかしその対戦をみて愕然とする パット見弱い

連鎖すらコーディングできていない感じ

 

ということで作り直してみました

あいかわらずシルバーボスに苦戦します

1日半ぐらい経過してシルバーリーグの54位全体の444位

 

その設計のようなメモ書きから説明してみます

 

メモ書きーーーーーーーーーーーーーーーーー

#4年前 629


#右に90度倒してラインの"."を詰めて右に"."を新たに足す
#そのままと回転で横に2つ並んでいる点を連鎖の起点にする
#連鎖初回は置いた位置2点からのみ
#消える際その周りに0があれば消す
#消えた列の消えた点から上からしか次の連鎖は起きない


#3つなぎまでをポイント 608
#連鎖計算あり
#ピンチで早打ち 506
#ニア3ポイント 506
#2023 11/7 5:10 ニア3の拠点にエアがあること 510
#first attack2回の0削り40point 12:00 484
#ゲームの配点を取り入れる 14:49 488
#line_score導入 19:34 444

メモ書きーーーーーーーーーーーーーーーーー

 

今回工夫したのは版を右90度回転させたことによって板の生成の高速化

各列を行に変換した感じ

各色が1から5 0がおじゃまぷよ ”.”が空欄の文字列ボード

 

消すアルゴリズムの高速化が鍵なんだけど

最初に消えるのは最後においたぷよ2点からだけでいい

次に起点になる消えた点の上から落ちてきたぷよ

 

90度回転させて消した場所を空白スペースにする

行ごとに空白スペースを消して行の長さを合わせるように”.”を足せばいい

これでかなり計算は速くなったはず

 

連鎖は再帰にして戻りは連鎖数だけだったのが

おじゃまぷよの消せる数と実際のゲームにそったスコアを追加で返す

 

シルバー100位ぐらいからはいつも苦労する

2つぐらい新しいアルゴリズム思いつかないとダメみたいな感覚がある

とはいってもバグを念入りに調査して精度が上がってゴールドに上がれたり

2位ぐらいでピタッと止まって数年後にひょっこり上がったこともある

 

今回最後に導入したのはもともとの盤の1,2,6列の空欄1個につき加点するというもの

 

ほんの10行ぐらいなのだけどシルバー54位まであがった

 

難しいプログラムを50行ぐらい書いて下がることもあれば

指定位置の空欄を加点するシンプルがプログラムが効果あったり

不思議なものです

 

目標は300位

ぷよぷよの連鎖の積み方勉強しないと


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。