色は4色、数値は0から12、同じ数値、色のものは2つずつ
場には色が同じで数字が並んでいるものと、同じ数字で色が違うものの2種類を出して
それにつなげたり、分割したり、取ったりして自分の持っているカードを先になくした方が勝ち
何もできないときはカードを一枚山札から取る
ラミーキューブというゲームが元になっている
今回は上のプログラムを10画面で簡易解説
アルゴリズムは出せるものを優先順位で出していき、出せない時に場から取って、つなぎで出せる時は1枚取る
場に置かれている並びはクラスで管理
PUSHは3枚並びか同じかを出す 関数名の0は数値並びで同じ色 1は同じ数値で色違い
cardsには手持ちのカードがリストで入っています
addは1枚追加
この記事では、なんとなく Pythonのプログラムってこんな形 というのを見ていただければいいという気持ちです
3枚の色から残り色を見つけるもの(同じ数値のものに1枚足せる色を見つける)
1色から残りの3色を見つけるもの
同じ色の3枚に残りの色が足せればadd1
take0は場の数値並びから取れるものを取って、それを使ってPUSHできるような実際に取ります
場から取得できるカードを辞書型でキーをカード、バリューを場のIDで返す
take1は場の同じ数値4枚から取れるものを取って、それを使ってPUSHできるような実際に取ります
split0は場の数値並びが6枚以上の時、分割してそれにつなげられるカードがあるなら分割します(現在うまく機能しないので作っただけ)
split0bは場の数値並びが7枚以上の時、一枚取って、分割してそれにつなげられるカードがあるなら分割します
reach_take1は渡されてきたカードと同じ数字で違う色のカードが場から2枚以上取れれば1枚取る
reach_take1_0はもう今となってはわかりません(バグってそう)
join_stackは場の並びでつなげられるものをつなぐのですがうまく動いてないのでダミー状態(環境側が製作中かも)
seqは数値の並びの先頭をキーにして残りをバリューに入れて3枚の数値続きに検出に利用しています
プレイヤーのindexごとにカードの情報を取得しています
場の情報を取得しています
数値並びが3枚あれば場に置く
同じ数値で違う色が3枚あれば場に置く
次につながる取りがあれば取る
場に1枚つなげられればつなげる
2枚とれればPUSHできるなら取る
場の並びを2つつなげられればつなぐ、手がなければ待つ
シンプルな1手読み+αぐらいでそこそこのプログラム量になりました