SlideShare a Scribd company logo
ソリティア カップル アルゴリズム解説
2020年8月19日
嘉村 しょう 
ソリティア カップル アルゴリズム解説
Commentary on Solitaire ‘Couple’ algorithm
■ Abstract
This paper aims at building knowledge, designing and coding skills in Java.
I make a commentary on the algorithm implemented in Solitaire ‘Couple’.
Although player has multiple strategies, win rate depends on initial status,
which 52 cards are randomly placed in 13 rows and 4 columns. I exclude player
strategies and simplify the rule. Based on the simplified rule, I drew a flowchart,
hand simulation and Java codes.
Keywords:​Algorithm Design, Game, Solitaire, Couple, Java, Coding
■ サマリー
アルゴリズム理解、設計、コーディング・スキル強化を目的に、トランプ・ゲーム
カップルを解説する。本稿では、プレイヤーの選択を考慮せず、ルールを単純化
し、フロー・チャート、ハンド・シュミレーション、Javaコードを作成した。
■ ソリティアとは
ソリティアは、一人で遊べるカード・ゲームの総称である。スパイダーや四つ葉の
クローバーが有名で、カップルもソリティアに分類される。ソリティアは、初期状
態、選択余地、クリア可能性の3つで分類される。[1]
初期状態 (Initial Statues)
ゲーム開始時の状態を指す。ゲーム毎に異なる。
選択 (Strategy)
プレーヤーによる選択有無を指す。
クリア可能性 (Win Rate)
ゲームのクリア可能性を指す。クリア出来ないゲームも存在する。
■ カップルのルールと変更点
ジョーカーを取り除いた52枚のカードを13行4列に並べ、上下・左右・左右斜め上
下を見渡し、同じ数のペアを探し、場から取り除く。取り除いた後は、カードを詰
める。全てのカードがなくなればクリア、カードが残っていてもペアが見つからな
ければ、終了(クリア不能)となる。[2] [3] 本稿では、以下2点を、現行ルールから変
更した。
● 1行1列目から探索
実際のゲームでは、プレイヤーは、どのカードからでもペアを探せるが、本稿
では1行1列目から探索を開始する仕様とした。
● 上下・左右・斜め順での探索
複数方向でペアが成立する場合、プレイヤーは方向を選択できるが、本稿では
上下・左右・斜め順で探索する仕様とした。
1
 
ソリティア カップル アルゴリズム解説
2020年8月19日
嘉村 しょう 
1. ジョーカーを取り除く。
2. 全カードをシャッフルする。
3. 13行4列に並べる。
4. 上下のカードが同じ数であれば、場から取り除き、カードを詰める。
違ければ、5.に進む。
5. 左右のカードが同じ数であれば、場から取り除き、カードを詰める。
違ければ、6.に進む。
6. 左右斜め上下のカードが同じ数であれば、場から取り除き、カードを詰める。
違ければ、7.に進む。
7. 2番目のカードに移動し、上下・左右・左右斜め上下の数を確認する。
8. 場から全カードが無くなる、もしくは同じ数のカードが見つからなくなったら
ゲーム終了。
下記の場合、薄青にハッチングしたエリアのカードから、スペードのエースと、ペ
アを探す。
尚、カードの位置によって、上下・左右・左右斜め上下の八方向を探索できない。
1行1列目の場合、下・右・右斜め下の三方向しか探索できない。
2
 
ソリティア カップル アルゴリズム解説
2020年8月19日
嘉村 しょう 
● カップルの特徴
カップルは、必ずしもクリア出来るゲームではない。クリア可能性は、初期状
態に依存する。プレイヤーの選択の巧拙に関わらず、カードの配置によって、
クリア可能性が変わる。
初期状態
52枚のカードが、シャッフルされ、13行4列に並ぶ状態
選択
プレイヤーは、13行4列の何処からでも、ペアを探索できる。
又、複数方向でペア成立時は、方向を選択できる。
クリア可能性
場から全カードが、無くなればクリアである。
カードが残り、ペアが作れない状態は、クリア不能となる。
■ カップルのアルゴリズム
アルゴリズム化すると、以下になる。
1. 文字列型で、リストを定義・初期化する。
2. 1.で定義したリストに、52の要素を代入する。
3. 代入した要素を無作為にシャッフルする。
4. リスト内の要素の一番右の文字を残す。
5. ポインターiを整数型で、定義・初期化する。
6. リストの1と- 4番目の要素が同じであれば、取り除く。
異なれば、7.に進む。
7. リストの1と5(+4)番目の要素が同じであれば、取り除く。
異なれば、8.に進む。
8. リストの1と- 1番目の要素が同じであれば、取り除く。
異なれば、9.に進む。
9. リストの1と2(+1)番目の要素が同じであれば、取り除く。
異なれば、10.に進む。
10. リストの1と- 5番目の要素が同じであれば、取り除く。
異なれば、11.に進む。
11. リストの1と- 3番目の要素が同じであれば、取り除く。
異なれば、12.に進む。
12. リストの1と4(+3)番目の要素が同じであれば、取り除く。
異なれば、13.に進む。
13. リストの1と6(+5)番目の要素が同じであれば、取り除く。
異なれば、14.に進む。
14. 全要素が無くなる、もしくは同じ要素が見つから無くなったらゲーム終了。
そうでなければ、ポインターiを、次の要素に移動する。
3
 
ソリティア カップル アルゴリズム解説
2020年8月19日
嘉村 しょう 
■ フローチャート
4
 
ソリティア カップル アルゴリズム解説
2020年8月19日
嘉村 しょう 
■ ハンド・シュミレーション
1. If i == i - 4 // 上カードとの比較
delete i, i - 4
Else If i != i - 4
go to 7.
Else i - 4 NOT EXISTS
go to 7.
2. If i == i + 4 // 下カードとの比較
delete i, i + 4
Else If i != i + 4
go to 8.
Else i + 4 NOT EXISTS
go to 8.
3. If i == i - 1 // 左カードとの比較
delete i, i - 1
Else If i != i - 1
go to 9.
Else i - 1 NOT EXISTS
go to 9.
4. If i == i + 1 // 右カードとの比較
delete i, i + 1
Else If i != i + 1
go to 10.
Else i + 1 NOT EXISTS
go to 10.
5. If i == i - 5 // 左上カードとの比較
delete i, i = 5
Else If i != i - 5
go to 11.
Else i - 5 NOT EXISTS
go to 11.
6. If i == i - 3 // 右上カードとの比較
delete i, i = 3
Else If i != i - 3
go to 12.
Else i - 3 NOT EXISTS
go to 12.
7. If i == i + 3 // 左下カードとの比較
delete i, i + 3
Else If i != i + 3
go to 13.
Else i + 3 NOT EXISTS
go to 13.
5
 
ソリティア カップル アルゴリズム解説
2020年8月19日
嘉村 しょう 
8. If i == i + 5 // 右下カードとの比較
delete i, i + 5
Else If i != i + 5
go to 15.
Else i + 5 NOT EXISTS
go to 15.
15. If array isEmpty || NO PAIR
stop iteration
Else
i = i + 1
■ Javaコード
フロー・チャート、ハンド・シュミレーションを元に、Javaコード化した。
● リストの採用
当初、多次元配列を定義し、行・列で要素を格納したが、ペア成立後、定義し
た領域を削除する必要がある為、要素の増減操作が楽なリストを採用した。[4]
● If 〜 Else If文の採用
当初、Switch文での実装を考えたが、上下・左右・斜めの複数方向でペア成立
する可能性を考慮し、If 〜 Else If文を採用した。
● カード略記
各スートの頭文字を略記とした。つまり、SpadeはS、HeartはH、ClubはC、
DiamondはDとし、10はX、JackはJ、QueenはQ、KingはKとした。
● 要素番号の反映
Javaのインデックスを反映し、要素は0開始とした。
// //はコメントを表す
import java.util.List; // util.Listパッケージをインポート
import java.util.ArrayList; // util.ArrayListパッケージをインポート
// 文字型リストcardsを定義する
List<String> cards = Arrays.asList
(
S1, S2, S3, S4, S5, S6, S7, S8, S9, SX, SJ, SQ, SK,
H1, H2, H3, H4, H5, H6, H7, H8, H9, HX, HJ, HQ, HK,
C1, C2, C3, C4, C5, C6, C7, C8, C9, CX, CJ, CQ, CK,
D1, D2, D3, D4, D5, D6, D7, D8, D9, DX, DJ, DQ, DK
);
Collections.shuffle(cards); // cardsの要素をシャッフルする [5]
cards = cards.substring(0, 2); // 最右の文字のみ抽出する [6]
int i = 0; // 整数型ポインターiを定義する
for(int i : cards) // リストに対して、以下を繰り返す
6
 
ソリティア カップル アルゴリズム解説
2020年8月19日
嘉村 しょう 
{
if (i == (i - 4)) // 上の要素と同じ場合
{
cards.sublist(i, (i - 4)).clear(); // 2つの要素を取り除く [7]
}
else if(i ==(i + 3)) // 下の要素と同じ場合
{
cards.sublist(i, (i + 3)).clear();// 2つの要素を取り除く
}
else if(i ==(i - 1)) // 左の要素と同じ場合
{
cards.sublist(i, (i - 1)).clear(); // 2つの要素を取り除く
}
else if(i ==(i + 0)) // 右の要素と同じ場合
{
cards.sublist(i, (i + 0)).clear();// 2つの要素を取り除く
}
else if(i == (i - 5)) // 左上の要素と同じ場合
{
cards.sublist(i, (i - 5)).clear(); // 2つの要素を取り除く
}
else if(i ==(i - 3)) // 右上の要素と同じ場合
{
cards.sublist(i, (i - 3)).clear(); // 2つの要素を取り除く
}
else if(i ==(i + 2)) // 左下の要素と同じ場合
{
cards.sublist(i, (i + 2)).clear();// 2つの要素を取り除く
}
else if(i ==(i + 4)) // 右下の要素と同じ場合
{
cards.sublist(i, (i + 4)).clear();// 2つの要素を取り除く
}
else if cards.isEmpty(); // リストに要素が残っていない場合
{
System.out.println("ゲームを終了します。");
System.exit; // プログラムを終了
}
else // 残っている場合
{
i = i++; // ポインターを移動し、次の要素へ
}
}
■ 省察
一見​単純なルールでも、アルゴリズムを読み解き、フロー・チャート化・実装する
には、多くの試行錯誤を伴った。当初の目的は達成出来たが、プレイヤーの選択、
計算量は、今後の課題としたい。
7
 
ソリティア カップル アルゴリズム解説
2020年8月19日
嘉村 しょう 
■ 参考文献
[1] ウィキペディア, 「ソリティア - Wikipedia」, 閲覧日 2020-8-10
  ​https://ja.wikipedia.org/wiki/ソリティア
[2] ウィキペディア, 「カップル (トランプゲーム) - Wikipedia」, 閲覧日 2020-8-10
  ​https://ja.wikipedia.org/wiki/カップル_(トランプゲーム)
[3] 株式会社マスナカソフト, トランプスタジアム, カップル, 閲覧日 2020-8-10
  ​https://playingcards.jp/solitaire/couple/
[4] 株式会社シンクスバンク(2019), KENスクールブログ,どう違うの?Javaにおける
  Listと配列の違いと使い分け, 2019-10-1, 閲覧日 2020-8-18
​https://www.kenschool.jp/blog/?p=5308
[5] キラメックス株式会社(2018), TECHACADEMY magazine, Javaで文字を切り
  出し抽出する方法について現役エンジニアが解説【初心者向け】, 2018-4-16,
  閲覧日 2020-8-17
​https://techacademy.jp/magazine/34111
[6] キラメックス株式会社(2018), TECHACADEMY magazine, Javaで重複しない値
  をランダムに表示する方法を現役エンジニアが解説【初心者向け】, 2018-12-31,
  閲覧日 2020-8-17
  ​https://techacademy.jp/magazine/26474
[7] 株式会社侍(2019), Samurai Blog,【Java入門】Listの要素をremove removeAllで
  削除する方法, 2019-3-30, 閲覧日 2020-8-17
  ​https://www.sejuku.net/blog/14802
トランプ素材を使った作図、フローチャート作成は、以下を参照した。
  silvia(2004), フリー素材の来夢来人 素材のデータベース, 閲覧日 2020-8-17
  ​https://www.civillink.net/sozai/tramp.html
  diagrams.net(2020), Draw.io, 閲覧日 2020-8-16
  ​https://app.diagrams.net/
以上
8
 

More Related Content

What's hot

DMM GAMES 内製チーム PlayCanvas 上でのアーキテクチャ、デザインパターン
DMM GAMES 内製チーム PlayCanvas 上でのアーキテクチャ、デザインパターンDMM GAMES 内製チーム PlayCanvas 上でのアーキテクチャ、デザインパターン
DMM GAMES 内製チーム PlayCanvas 上でのアーキテクチャ、デザインパターン
Seungil Nam
 
某S社のddd(メイリオ)
某S社のddd(メイリオ)某S社のddd(メイリオ)
某S社のddd(メイリオ)
kumake
 
ドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinxドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinx
Takayuki Shimizukawa
 
アプリケーションコードにおける技術的負債について考える
アプリケーションコードにおける技術的負債について考えるアプリケーションコードにおける技術的負債について考える
アプリケーションコードにおける技術的負債について考える
pospome
 
良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツ
Shunji Konishi
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
sairoutine
 
Anti aliasing
Anti aliasingAnti aliasing
Anti aliasing
Jin Woo Lee
 
GUILTY GEAR Xrd開発スタッフが送るアクションのためのボーン配置TIPS
GUILTY GEAR Xrd開発スタッフが送るアクションのためのボーン配置TIPSGUILTY GEAR Xrd開発スタッフが送るアクションのためのボーン配置TIPS
GUILTY GEAR Xrd開発スタッフが送るアクションのためのボーン配置TIPS
ARC SYSTEM WORKS
 
MLOps入門
MLOps入門MLOps入門
MLOps入門
Hiro Mura
 
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersAbout GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginners
Shota TAMURA
 
仕様書作成のポイント_180814
仕様書作成のポイント_180814仕様書作成のポイント_180814
仕様書作成のポイント_180814
Sugimoto Chizuru
 
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
de:code 2017
 
Ops meets NoOps
Ops meets NoOpsOps meets NoOps
Ops meets NoOps
Toru Makabe
 
ブラウザのUIテストをしてみた話
ブラウザのUIテストをしてみた話ブラウザのUIテストをしてみた話
ブラウザのUIテストをしてみた話
Mitsushige Ishiguro
 
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
Yoshitaka Kawashima
 
ゲームの仕様書を書こう3 仕様書に記載するデータと画面
ゲームの仕様書を書こう3 仕様書に記載するデータと画面ゲームの仕様書を書こう3 仕様書に記載するデータと画面
ゲームの仕様書を書こう3 仕様書に記載するデータと画面
Sugimoto Chizuru
 
C++11とゲーム製作
C++11とゲーム製作C++11とゲーム製作
C++11とゲーム製作
uchan_nos
 
現実世界コンピューティング RealSense とロボットと HoloLens (2019/04/24 Intel RealSense Japan Mee...
現実世界コンピューティング RealSense とロボットと HoloLens (2019/04/24 Intel RealSense Japan Mee...現実世界コンピューティング RealSense とロボットと HoloLens (2019/04/24 Intel RealSense Japan Mee...
現実世界コンピューティング RealSense とロボットと HoloLens (2019/04/24 Intel RealSense Japan Mee...
Yusuke Furuta
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
A AOKI
 
Virtual Tsukuba Challenge on Unity について
Virtual Tsukuba Challenge on Unity についてVirtual Tsukuba Challenge on Unity について
Virtual Tsukuba Challenge on Unity について
UnityTechnologiesJapan002
 

What's hot (20)

DMM GAMES 内製チーム PlayCanvas 上でのアーキテクチャ、デザインパターン
DMM GAMES 内製チーム PlayCanvas 上でのアーキテクチャ、デザインパターンDMM GAMES 内製チーム PlayCanvas 上でのアーキテクチャ、デザインパターン
DMM GAMES 内製チーム PlayCanvas 上でのアーキテクチャ、デザインパターン
 
某S社のddd(メイリオ)
某S社のddd(メイリオ)某S社のddd(メイリオ)
某S社のddd(メイリオ)
 
ドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinxドキュメントを作りたくなってしまう魔法のツールSphinx
ドキュメントを作りたくなってしまう魔法のツールSphinx
 
アプリケーションコードにおける技術的負債について考える
アプリケーションコードにおける技術的負債について考えるアプリケーションコードにおける技術的負債について考える
アプリケーションコードにおける技術的負債について考える
 
良質なコードを高速に書くコツ
良質なコードを高速に書くコツ良質なコードを高速に書くコツ
良質なコードを高速に書くコツ
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
 
Anti aliasing
Anti aliasingAnti aliasing
Anti aliasing
 
GUILTY GEAR Xrd開発スタッフが送るアクションのためのボーン配置TIPS
GUILTY GEAR Xrd開発スタッフが送るアクションのためのボーン配置TIPSGUILTY GEAR Xrd開発スタッフが送るアクションのためのボーン配置TIPS
GUILTY GEAR Xrd開発スタッフが送るアクションのためのボーン配置TIPS
 
MLOps入門
MLOps入門MLOps入門
MLOps入門
 
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersAbout GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginners
 
仕様書作成のポイント_180814
仕様書作成のポイント_180814仕様書作成のポイント_180814
仕様書作成のポイント_180814
 
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
 
Ops meets NoOps
Ops meets NoOpsOps meets NoOps
Ops meets NoOps
 
ブラウザのUIテストをしてみた話
ブラウザのUIテストをしてみた話ブラウザのUIテストをしてみた話
ブラウザのUIテストをしてみた話
 
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
 
ゲームの仕様書を書こう3 仕様書に記載するデータと画面
ゲームの仕様書を書こう3 仕様書に記載するデータと画面ゲームの仕様書を書こう3 仕様書に記載するデータと画面
ゲームの仕様書を書こう3 仕様書に記載するデータと画面
 
C++11とゲーム製作
C++11とゲーム製作C++11とゲーム製作
C++11とゲーム製作
 
現実世界コンピューティング RealSense とロボットと HoloLens (2019/04/24 Intel RealSense Japan Mee...
現実世界コンピューティング RealSense とロボットと HoloLens (2019/04/24 Intel RealSense Japan Mee...現実世界コンピューティング RealSense とロボットと HoloLens (2019/04/24 Intel RealSense Japan Mee...
現実世界コンピューティング RealSense とロボットと HoloLens (2019/04/24 Intel RealSense Japan Mee...
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
 
Virtual Tsukuba Challenge on Unity について
Virtual Tsukuba Challenge on Unity についてVirtual Tsukuba Challenge on Unity について
Virtual Tsukuba Challenge on Unity について
 

More from Sho Kamura

アパレル販売店に於ける売上低下問題の解決支援
アパレル販売店に於ける売上低下問題の解決支援アパレル販売店に於ける売上低下問題の解決支援
アパレル販売店に於ける売上低下問題の解決支援
Sho Kamura
 
深さ・幅優先探索の仕組み・特徴・応用
深さ・幅優先探索の仕組み・特徴・応用深さ・幅優先探索の仕組み・特徴・応用
深さ・幅優先探索の仕組み・特徴・応用
Sho Kamura
 
畳み込みニューラルネットワークの仕組み・特徴・応用
畳み込みニューラルネットワークの仕組み・特徴・応用畳み込みニューラルネットワークの仕組み・特徴・応用
畳み込みニューラルネットワークの仕組み・特徴・応用
Sho Kamura
 
北米 大統領選挙に於けるデジタル・メディアの影響
北米 大統領選挙に於けるデジタル・メディアの影響北米 大統領選挙に於けるデジタル・メディアの影響
北米 大統領選挙に於けるデジタル・メディアの影響
Sho Kamura
 
DVDレンタル店の売上拡大の為の分析  
DVDレンタル店の売上拡大の為の分析  DVDレンタル店の売上拡大の為の分析  
DVDレンタル店の売上拡大の為の分析  
Sho Kamura
 
重大製品事故の実態分析
重大製品事故の実態分析重大製品事故の実態分析
重大製品事故の実態分析
Sho Kamura
 
犯罪統計と経済指標の関係分析
犯罪統計と経済指標の関係分析犯罪統計と経済指標の関係分析
犯罪統計と経済指標の関係分析
Sho Kamura
 

More from Sho Kamura (7)

アパレル販売店に於ける売上低下問題の解決支援
アパレル販売店に於ける売上低下問題の解決支援アパレル販売店に於ける売上低下問題の解決支援
アパレル販売店に於ける売上低下問題の解決支援
 
深さ・幅優先探索の仕組み・特徴・応用
深さ・幅優先探索の仕組み・特徴・応用深さ・幅優先探索の仕組み・特徴・応用
深さ・幅優先探索の仕組み・特徴・応用
 
畳み込みニューラルネットワークの仕組み・特徴・応用
畳み込みニューラルネットワークの仕組み・特徴・応用畳み込みニューラルネットワークの仕組み・特徴・応用
畳み込みニューラルネットワークの仕組み・特徴・応用
 
北米 大統領選挙に於けるデジタル・メディアの影響
北米 大統領選挙に於けるデジタル・メディアの影響北米 大統領選挙に於けるデジタル・メディアの影響
北米 大統領選挙に於けるデジタル・メディアの影響
 
DVDレンタル店の売上拡大の為の分析  
DVDレンタル店の売上拡大の為の分析  DVDレンタル店の売上拡大の為の分析  
DVDレンタル店の売上拡大の為の分析  
 
重大製品事故の実態分析
重大製品事故の実態分析重大製品事故の実態分析
重大製品事故の実態分析
 
犯罪統計と経済指標の関係分析
犯罪統計と経済指標の関係分析犯罪統計と経済指標の関係分析
犯罪統計と経済指標の関係分析
 

ソリティア カップル アルゴリズム解説

  • 1. ソリティア カップル アルゴリズム解説 2020年8月19日 嘉村 しょう  ソリティア カップル アルゴリズム解説 Commentary on Solitaire ‘Couple’ algorithm ■ Abstract This paper aims at building knowledge, designing and coding skills in Java. I make a commentary on the algorithm implemented in Solitaire ‘Couple’. Although player has multiple strategies, win rate depends on initial status, which 52 cards are randomly placed in 13 rows and 4 columns. I exclude player strategies and simplify the rule. Based on the simplified rule, I drew a flowchart, hand simulation and Java codes. Keywords:​Algorithm Design, Game, Solitaire, Couple, Java, Coding ■ サマリー アルゴリズム理解、設計、コーディング・スキル強化を目的に、トランプ・ゲーム カップルを解説する。本稿では、プレイヤーの選択を考慮せず、ルールを単純化 し、フロー・チャート、ハンド・シュミレーション、Javaコードを作成した。 ■ ソリティアとは ソリティアは、一人で遊べるカード・ゲームの総称である。スパイダーや四つ葉の クローバーが有名で、カップルもソリティアに分類される。ソリティアは、初期状 態、選択余地、クリア可能性の3つで分類される。[1] 初期状態 (Initial Statues) ゲーム開始時の状態を指す。ゲーム毎に異なる。 選択 (Strategy) プレーヤーによる選択有無を指す。 クリア可能性 (Win Rate) ゲームのクリア可能性を指す。クリア出来ないゲームも存在する。 ■ カップルのルールと変更点 ジョーカーを取り除いた52枚のカードを13行4列に並べ、上下・左右・左右斜め上 下を見渡し、同じ数のペアを探し、場から取り除く。取り除いた後は、カードを詰 める。全てのカードがなくなればクリア、カードが残っていてもペアが見つからな ければ、終了(クリア不能)となる。[2] [3] 本稿では、以下2点を、現行ルールから変 更した。 ● 1行1列目から探索 実際のゲームでは、プレイヤーは、どのカードからでもペアを探せるが、本稿 では1行1列目から探索を開始する仕様とした。 ● 上下・左右・斜め順での探索 複数方向でペアが成立する場合、プレイヤーは方向を選択できるが、本稿では 上下・左右・斜め順で探索する仕様とした。 1  
  • 2. ソリティア カップル アルゴリズム解説 2020年8月19日 嘉村 しょう  1. ジョーカーを取り除く。 2. 全カードをシャッフルする。 3. 13行4列に並べる。 4. 上下のカードが同じ数であれば、場から取り除き、カードを詰める。 違ければ、5.に進む。 5. 左右のカードが同じ数であれば、場から取り除き、カードを詰める。 違ければ、6.に進む。 6. 左右斜め上下のカードが同じ数であれば、場から取り除き、カードを詰める。 違ければ、7.に進む。 7. 2番目のカードに移動し、上下・左右・左右斜め上下の数を確認する。 8. 場から全カードが無くなる、もしくは同じ数のカードが見つからなくなったら ゲーム終了。 下記の場合、薄青にハッチングしたエリアのカードから、スペードのエースと、ペ アを探す。 尚、カードの位置によって、上下・左右・左右斜め上下の八方向を探索できない。 1行1列目の場合、下・右・右斜め下の三方向しか探索できない。 2  
  • 3. ソリティア カップル アルゴリズム解説 2020年8月19日 嘉村 しょう  ● カップルの特徴 カップルは、必ずしもクリア出来るゲームではない。クリア可能性は、初期状 態に依存する。プレイヤーの選択の巧拙に関わらず、カードの配置によって、 クリア可能性が変わる。 初期状態 52枚のカードが、シャッフルされ、13行4列に並ぶ状態 選択 プレイヤーは、13行4列の何処からでも、ペアを探索できる。 又、複数方向でペア成立時は、方向を選択できる。 クリア可能性 場から全カードが、無くなればクリアである。 カードが残り、ペアが作れない状態は、クリア不能となる。 ■ カップルのアルゴリズム アルゴリズム化すると、以下になる。 1. 文字列型で、リストを定義・初期化する。 2. 1.で定義したリストに、52の要素を代入する。 3. 代入した要素を無作為にシャッフルする。 4. リスト内の要素の一番右の文字を残す。 5. ポインターiを整数型で、定義・初期化する。 6. リストの1と- 4番目の要素が同じであれば、取り除く。 異なれば、7.に進む。 7. リストの1と5(+4)番目の要素が同じであれば、取り除く。 異なれば、8.に進む。 8. リストの1と- 1番目の要素が同じであれば、取り除く。 異なれば、9.に進む。 9. リストの1と2(+1)番目の要素が同じであれば、取り除く。 異なれば、10.に進む。 10. リストの1と- 5番目の要素が同じであれば、取り除く。 異なれば、11.に進む。 11. リストの1と- 3番目の要素が同じであれば、取り除く。 異なれば、12.に進む。 12. リストの1と4(+3)番目の要素が同じであれば、取り除く。 異なれば、13.に進む。 13. リストの1と6(+5)番目の要素が同じであれば、取り除く。 異なれば、14.に進む。 14. 全要素が無くなる、もしくは同じ要素が見つから無くなったらゲーム終了。 そうでなければ、ポインターiを、次の要素に移動する。 3  
  • 5. ソリティア カップル アルゴリズム解説 2020年8月19日 嘉村 しょう  ■ ハンド・シュミレーション 1. If i == i - 4 // 上カードとの比較 delete i, i - 4 Else If i != i - 4 go to 7. Else i - 4 NOT EXISTS go to 7. 2. If i == i + 4 // 下カードとの比較 delete i, i + 4 Else If i != i + 4 go to 8. Else i + 4 NOT EXISTS go to 8. 3. If i == i - 1 // 左カードとの比較 delete i, i - 1 Else If i != i - 1 go to 9. Else i - 1 NOT EXISTS go to 9. 4. If i == i + 1 // 右カードとの比較 delete i, i + 1 Else If i != i + 1 go to 10. Else i + 1 NOT EXISTS go to 10. 5. If i == i - 5 // 左上カードとの比較 delete i, i = 5 Else If i != i - 5 go to 11. Else i - 5 NOT EXISTS go to 11. 6. If i == i - 3 // 右上カードとの比較 delete i, i = 3 Else If i != i - 3 go to 12. Else i - 3 NOT EXISTS go to 12. 7. If i == i + 3 // 左下カードとの比較 delete i, i + 3 Else If i != i + 3 go to 13. Else i + 3 NOT EXISTS go to 13. 5  
  • 6. ソリティア カップル アルゴリズム解説 2020年8月19日 嘉村 しょう  8. If i == i + 5 // 右下カードとの比較 delete i, i + 5 Else If i != i + 5 go to 15. Else i + 5 NOT EXISTS go to 15. 15. If array isEmpty || NO PAIR stop iteration Else i = i + 1 ■ Javaコード フロー・チャート、ハンド・シュミレーションを元に、Javaコード化した。 ● リストの採用 当初、多次元配列を定義し、行・列で要素を格納したが、ペア成立後、定義し た領域を削除する必要がある為、要素の増減操作が楽なリストを採用した。[4] ● If 〜 Else If文の採用 当初、Switch文での実装を考えたが、上下・左右・斜めの複数方向でペア成立 する可能性を考慮し、If 〜 Else If文を採用した。 ● カード略記 各スートの頭文字を略記とした。つまり、SpadeはS、HeartはH、ClubはC、 DiamondはDとし、10はX、JackはJ、QueenはQ、KingはKとした。 ● 要素番号の反映 Javaのインデックスを反映し、要素は0開始とした。 // //はコメントを表す import java.util.List; // util.Listパッケージをインポート import java.util.ArrayList; // util.ArrayListパッケージをインポート // 文字型リストcardsを定義する List<String> cards = Arrays.asList ( S1, S2, S3, S4, S5, S6, S7, S8, S9, SX, SJ, SQ, SK, H1, H2, H3, H4, H5, H6, H7, H8, H9, HX, HJ, HQ, HK, C1, C2, C3, C4, C5, C6, C7, C8, C9, CX, CJ, CQ, CK, D1, D2, D3, D4, D5, D6, D7, D8, D9, DX, DJ, DQ, DK ); Collections.shuffle(cards); // cardsの要素をシャッフルする [5] cards = cards.substring(0, 2); // 最右の文字のみ抽出する [6] int i = 0; // 整数型ポインターiを定義する for(int i : cards) // リストに対して、以下を繰り返す 6  
  • 7. ソリティア カップル アルゴリズム解説 2020年8月19日 嘉村 しょう  { if (i == (i - 4)) // 上の要素と同じ場合 { cards.sublist(i, (i - 4)).clear(); // 2つの要素を取り除く [7] } else if(i ==(i + 3)) // 下の要素と同じ場合 { cards.sublist(i, (i + 3)).clear();// 2つの要素を取り除く } else if(i ==(i - 1)) // 左の要素と同じ場合 { cards.sublist(i, (i - 1)).clear(); // 2つの要素を取り除く } else if(i ==(i + 0)) // 右の要素と同じ場合 { cards.sublist(i, (i + 0)).clear();// 2つの要素を取り除く } else if(i == (i - 5)) // 左上の要素と同じ場合 { cards.sublist(i, (i - 5)).clear(); // 2つの要素を取り除く } else if(i ==(i - 3)) // 右上の要素と同じ場合 { cards.sublist(i, (i - 3)).clear(); // 2つの要素を取り除く } else if(i ==(i + 2)) // 左下の要素と同じ場合 { cards.sublist(i, (i + 2)).clear();// 2つの要素を取り除く } else if(i ==(i + 4)) // 右下の要素と同じ場合 { cards.sublist(i, (i + 4)).clear();// 2つの要素を取り除く } else if cards.isEmpty(); // リストに要素が残っていない場合 { System.out.println("ゲームを終了します。"); System.exit; // プログラムを終了 } else // 残っている場合 { i = i++; // ポインターを移動し、次の要素へ } } ■ 省察 一見​単純なルールでも、アルゴリズムを読み解き、フロー・チャート化・実装する には、多くの試行錯誤を伴った。当初の目的は達成出来たが、プレイヤーの選択、 計算量は、今後の課題としたい。 7  
  • 8. ソリティア カップル アルゴリズム解説 2020年8月19日 嘉村 しょう  ■ 参考文献 [1] ウィキペディア, 「ソリティア - Wikipedia」, 閲覧日 2020-8-10   ​https://ja.wikipedia.org/wiki/ソリティア [2] ウィキペディア, 「カップル (トランプゲーム) - Wikipedia」, 閲覧日 2020-8-10   ​https://ja.wikipedia.org/wiki/カップル_(トランプゲーム) [3] 株式会社マスナカソフト, トランプスタジアム, カップル, 閲覧日 2020-8-10   ​https://playingcards.jp/solitaire/couple/ [4] 株式会社シンクスバンク(2019), KENスクールブログ,どう違うの?Javaにおける   Listと配列の違いと使い分け, 2019-10-1, 閲覧日 2020-8-18 ​https://www.kenschool.jp/blog/?p=5308 [5] キラメックス株式会社(2018), TECHACADEMY magazine, Javaで文字を切り   出し抽出する方法について現役エンジニアが解説【初心者向け】, 2018-4-16,   閲覧日 2020-8-17 ​https://techacademy.jp/magazine/34111 [6] キラメックス株式会社(2018), TECHACADEMY magazine, Javaで重複しない値   をランダムに表示する方法を現役エンジニアが解説【初心者向け】, 2018-12-31,   閲覧日 2020-8-17   ​https://techacademy.jp/magazine/26474 [7] 株式会社侍(2019), Samurai Blog,【Java入門】Listの要素をremove removeAllで   削除する方法, 2019-3-30, 閲覧日 2020-8-17   ​https://www.sejuku.net/blog/14802 トランプ素材を使った作図、フローチャート作成は、以下を参照した。   silvia(2004), フリー素材の来夢来人 素材のデータベース, 閲覧日 2020-8-17   ​https://www.civillink.net/sozai/tramp.html   diagrams.net(2020), Draw.io, 閲覧日 2020-8-16   ​https://app.diagrams.net/ 以上 8