パーソナルブログメモリ

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

未知のゲームの解法ルーチン実装の手順例

2021-01-06 | プログラムをマスター計画2020

CodinGameにぬりかべというゲームが申請されていたのでその初期実装の手順を公開してみます。

日本人が考案したものをフランスのサイトで知るというパターン最近多いです。

 

ゲームは数独とかマインスイーパーのようなマップを解く形式のもので

数字の書いてある数字マスだけ連結させて残った部分を塗るというもののようです。

連結は他の連結とくっついてはいけない

塗った部分は全て連結していなければならない

2x2マスの大きさの塗りは禁止というしばりがあるようです。

 

数時間ボーッと考えて設計の手順をメモってみたのがこちら

 

1) ボードを一元化 
  外を# 塗りキャラを@にする

2) 十字塗り関数
  指定位置から十字に数字がなければ塗る

3) 斜め塗り関数
  斜めに数字がならんでいるところはその対面を塗る

4) 1の周りに十字塗り

ここで実装開始

5) 指定位置を置き換える汎用関数

6) 3)の仕様変更 斜めの数字が異なる時追加

7) 盤の表示

いったん動作確認

8) 狭間塗り
  2つの異なる数字の間を塗る
  
9) 到達数字塗り
  指定位置まで到達できる数字が1つでそのルート1つのみなら塗る
  (高難易度なので保留)
   
10) 押上数字塗り
  周りに空きが1つしかなく、数字がまだ塗りきっていない時
  
11) 未達塗り
  到達できる数字がない時塗る
  
12) リンク
  指定文字のリンクをリスト化して返す
  
13) 空き
  指定リンクの周りの空き位置をリスト化して返す

 

9)と11)を除き、あと数点コーディング中に思いついたものをいくつか実装したのがコチラ

 

簡易評価関数

 

評価関数

 

メインルーチン

この問題very hard設定で作者の解答例C++で700stepぐらいあるので

あと1つ、2つアイデアが浮かんでPython3で200 stepぐらいまでつくれれば、

解答できるかもしれません。

 

 


最新の画像もっと見る

コメントを投稿

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