トランプ
ソリティアの下段にカードを重ねるときは、マークの色が互い違いになるようにするので、「[3]カードを読み取る」で示した方法でカードを読み取った結果を使って、移動先となり得るカードと移動元となり得るカードの情報を新たに作成します。
移動元となり得るカードは、表になっているカードが1枚の場合は「[3]カードを読み取る」で読み取ったカード、表になっているカードが2枚以上重なっている場合は表になっているカードの一番下のカードとします。(これは今回実装するにあたって決めた操作の仕様です。)
【図1】
下段のカード認識0
下に示すコードでは、移動先となり得るカード情報をリスト変数Ldrop、移動元となり得るカード情報をリスト変数Ldragに作成します。
【図1】に示すカードの例では、Ldropには黒の6, 赤の5赤の6赤の7, 黒の9、Ldragには赤の7赤の5赤の8赤の7, 黒の9、となるようにデータを作成します。 
リスト定義
SetLdrag
SetLdrop
下段の中で移動可能なカードを探す処理は、移動先となり得るカードをLdropの中から1枚ずつ処理対象にして、移動元となり得るカードをLdragの中から1枚ずつ探します(色違いで数が1小さいカードなら適合)。
【図2】
下段のカード認識1
【図2】に示すカードの例では、リスト変数Ldropの1つ目の要素「黒の6」に対して、リスト変数Ldragの2つ目の要素「赤の5」が移動元として適合します。適合するカードが見つかったら、移動元から移動先へドラッグ&ドロップします。

下に示すコードLowerCard()では、これまでに説明した処理を呼び出しています。164行~177行で、移動先となり得るカード情報をリスト変数Ldrop、移動元となり得るカード情報をリスト変数Ldragに作成します。180行~192行で、移動可能なカードを探してドラッグ&ドロップします。どこかの列でカードの移動を行ったら、移動元・移動先ともに状況が変化するので、処理を終了します。
LowerCard-1
SetLdrag()の引数に渡しているmaisuは、表になっているカードの2枚目以降の枚数を関数CountCard()で求めています。97行目で引数に指定している画像は、カードの右上角周辺の重なっている部分で、【図3】の緑色の枠で囲んだ部分の画像です。【図3】の例では、CountCard()の戻り値は1(枚)になります。
CountCard
【図3】
枚数
【注意】findAllList()はSikuliX1.1.4から追加になったので、SikuliX1.1.3以前のバージョンで実装する場合は、findAll()が使えます。findAll()は戻り値がリストではないので、件数のカウントにlen()が使えないでしょうが、ここのサンプルコードが役に立つと思います。

LowerCard()には続きがあります。カードを並べていない列にキングのカードを移動する処理です。
LowerCard-2

[3]カードを読み取る< >[5]下段から上段への移動