Dobbleというカードゲームのアルゴリズムってどんなんだ~?

f:id:ts0818:20200111202139j:plain

www.astroarts.co.jp

巨大楕円銀河M87の中心に存在する超大質量ブラックホールから噴出するジェットがX線で観測され、噴出する粒子の運動速度が光速の99%以上であることが確かめられた。ジェットの見かけ上の速度は、最大で光速を約6倍も超えている。

光速の99%以上、M87のブラックホールからのジェット - アストロアーツ

⇧ 光陰矢の如し、銀河M87に所属のブラックホールのジェットの粒子の運動速度が光速の99%以上って言われてもね...どうもボクです。

なんでも「超高速運動」って呼ばれる現象だそうな。

天文学において、超光速運動または超光速現象とは、 電波銀河BL型天体クェーサーの一部にみられる、みかけ上光速を超えた速度の運動をいう。近年ではマイクロクェーサーと呼ばれる銀河系内電波源でもみつかっている。これら全ての電波源はブラックホールを内包すると考えられており、これが原因で高速の質量噴出が起こっているものと考えられている。

超光速運動 - Wikipedia

⇧  ブラックホールさん、エネルギー強過ぎっす...

ブラックホールと言えば、全てを飲み込んでしまう強力な重力をお持ちですが、

www.itmedia.co.jp

 しかし研究チームは、巨大ブラックホールの周りに太陽10万個分を形成できる莫大な量のちりがあることに着目。恒星の周りで惑星が形成される理論を巨大ブラックホールに適用するとどうなるか理論計算を行ったところ、巨大ブラックホール周囲にも岩石と氷でできた「惑星」が形成されることが分かったという。

常識を覆す「惑星」、巨大ブラックホールの周りに存在か 鹿児島大と国立天文台 - ITmedia NEWS

⇧ 巨大ブラックホールの周囲に「惑星」が存在しているかもしれないって話が、Oh, my gosh...

 

そういえば、ウルトラマンで有名な「M78星雲」ですが、

「M78星雲」という言葉がウルトラシリーズに登場したのは、『ウルトラマン』第1話でウルトラマンが自らをM78星雲の出身と自己紹介する場面である。企画時点ではM87星雲という名称だったが、脚本印刷時にM78星雲と誤記されてそれがそのまま放映され、定着したものであり、元々は『ウルトラマン』の企画にも関わった関沢新一が脚本と監督を務めた映画『空飛ぶ円盤恐怖の襲撃』(1956年)に登場する「M87星雲」に由来するという説がある。また、『ウルトラマン』の前作『ウルトラQ』の未発表脚本に、中性子怪獣ミクラーの出身地として「M87星雲」が登場する「M87星雲より!」という作品が存在する

なお、実在するM78オリオン座にある反射星雲星間分子雲)で、地球からの距離は1600光年である。一方、M87おとめ座にある楕円銀河で、銀河系アンドロメダ銀河などを含むおとめ座超銀河団の中心を構成しており、地球からの距離は6000万光年という距離にある。

M78星雲 - Wikipedia

⇧ 「M78」ってのが実在するそうな。

巨大ブラックホールの周囲に「惑星」が存在するかもしれないのと同じ様に、ウルトラマンの世界みたいに、怪獣とか存在する可能性がありますかね、宇宙は謎だらけですね。

 

むちゃくちゃ脱線してしまいましたが、本題に。

実家に帰省してる時に、兄に教えてもらって、その存在を知ったのですが、


ドブル (Dobble) 日本語版 カードゲーム

⇧  ってカードゲームのアルゴリズムが気になったので、プログラミングできないか調査してみました。 

そんでは、レッツトライ~。

 

Dobbleって?

カードゲームなのですが、

www.asmodee.co.uk

Dobble is the award-winning visual perception card game for 2-8 players aged 6 and above that can be played by anyone, regardless of age and interests.

Dobble - Asmodee United Kingdom

⇧  対象年齢は6歳以上で、2~8人で遊べるものらしいです。

 

www.dobblegame.co.uk

⇧  詳しい遊び方とかの紹介ページも用意されてるみたいです。

 

www.asmodee.co.uk

Asmodee UK is an established distributor of gaming product and collectibles to the UK and Europe.
Asmodee UK is the trading name of Esdevium Games Ltd.

Board games, collectibles & toys distribution - Asmodee UK

⇧ 「Asmodee UKは、英国およびヨーロッパ向けのゲーム製品および収集品の定評ある販売代理店です。」ってあるんで、「Dobble」を製造してるというわけではないようです。

 

hobbyjapanさんで紹介されていたのですが、 

hobbyjapan.co.jp

「ドブル」は、2009年にフランスで発売された、リアルタイム・パーティーゲームで、アメリカでは「Spot It!」という商品名で、すでにシリーズ合わせて30万個以上を販売している大ヒット・タイトルです。

ドブル日本語版

⇧  フランス発祥らしいですと。

2009年っていうと、日本だと、「忌野清志郎」「志村正彦フジファブリック)」「アベフトシthee michelle gun elephant)」といったミュージシャンが亡くなった年ですかね、みんな好きだったな~。

はい、すみません、、脱線しました。

なんか、

www.smithsonianmag.com

The story of Spot It!, first and still published as “Dobble” in Europe, starts in 1850 Britain. At the time, Britain was in the midst of a kind of mathematical renaissance. After a period of relative stagnation during the Georgian era, the reign of Queen Victoria seemed to produce a flowering of mathematical rock-stars, people like Charles Babbage, George Boole, John Venn and Arthur Cayley. This was an era of abstract mathematical philosophy and enquiry, of laying down the mathematical principles that undergird modern-day digital technology—without these guys, modern computing couldn’t exist.

The Math of Spot It! | Science | Smithsonian Magazine

⇧ イギリス発祥ともあるけども...しかも1850年代って...

 

で、Dobbleですが、

ドブルは、それぞれに50種類以上のマークの内から8つが描かれた55枚のカードで遊ぶゲームです。全てのカードは他のカードとたった1つだけ共通するマークが描かれており、それを探すことがゲームの目的です。
このゲームでは、先に2枚のカードの間に共通するマークを見つけて宣言し、そのカードを遊んでいるミニゲームのルールで決められた通りに獲得したり、捨てたり、別の場所に置いたりします。

ドブル日本語版

⇧ というように、2枚のカードを見比べて、1つだけ共通するマーク(絵柄)を見つけた時に宣言していくって感じのゲームなんですが、55枚のカードで、必ず共通するマーク(絵柄)は1つだけになってるという。

55枚のカードの中で、どの2枚を比べたとしても、共通するマーク(絵柄)は1つだけになるって凄くないですか?

自分は衝撃を受けましたけど。

どういうアルゴリズムなのかっていうことのほうが気になってゲームに集中できないというね(笑)

 

どんなアルゴリズムで成り立っているのか?

プログラミングで実現できないかな~、その前にどんなアルゴリズムで成り立っているのかな~って思っていたところ、世の中には同じことを考える人がいるもので、 

amori.hatenablog.com

math.stackexchange.com

www.101computing.net

radiganengineering.com

⇧  上記サイト様で、プログラミングでDobbleのアルゴリズムを探求してました。

 

んで、

amori.hatenablog.com

napier.hatenablog.jp

⇧  上記サイト様によりますと、「有限射影平面」っていう数学の概念が反映されているんだそうな。

 

有限射影平面って?

んで、調べていると、

amori.hatenablog.com

www.is.kochi-u.ac.jp

⇧  どうも、「16 人麻雀総当り問題(4人×4卓)」の拡張版である、7人×7卓=49人の場合の解を考える際に、「有限射影幾何学」で考えると解が得られやすいらしく、その考えの中で「有限射影平面」ってのが出てくるんだと。(英語圏だと、「finite projection geometry」って言うみたいらしいですと。)

ちなみに、

www.ne.jp

著者はあとがきで、「16 人麻雀総当り問題がガロア体を用いることによってすぐ解けることに気付いたと思う」と書いている。

高橋 磐郎:組合せ理論とその応用

⇧  上記サイト様によりますと、「16人麻雀総当り問題」は「ガロア体」で解けると。

ガロア体」ってのがよく分からんけど、 

有限幾何は有限体上の構造と関連したベクトル空間として、線型代数を通じて定義できる。それはガロア幾何とも呼ばれる。または有限幾何は、純粋に組合せ論的に定義することもできる。

多くの場合には(しかしすべてではない)有限幾何はガロア幾何と同じものである。例えば3次元またはそれ以上の次元における任意の有限射影空間は、ある有限体上の射影空間と同型である(有限体上のベクトル空間の射影化)。

有限幾何学 - Wikipedia

⇧ 多くのケースで「有機幾何」は「ガロア幾何」と同様と言って差し支えないと。

だけど、

そこでこの場合は両者の違いはない。

しかし2次元においては、組合せ論的に定義された射影平面で、有限体上の射影空間と同型にならないようなもの、いわゆる非デザルグ平面が存在する。そこでこの場合は両者は異なるものである。

有限幾何学 - Wikipedia

⇧ 2次元だと、異なることがあるんですと。

まぁ、脱線したのですが、「有限射影平面」っていうのは、「有限幾何学」の中で、ある条件を満たすもののことらしい。

んで、その条件っていうのが、

有限射影平面は、空でない集合(その要素は「点」と呼ばれる)、および、次の条件を満たすようなの部分集合の空でない族(その要素は「直線」と呼ばれる)から構成される。

  1. 2つの異なる任意の点が与えられたとき、それらを含むような直線がただ一つだけ存在する。
  2. 2つの異なる任意の直線の交わり(集合の意味での交わりである)はただ一つの点を含む。
  3. どの3点も同一直線にないような4点集合が存在する。

有限幾何学 - Wikipedia

⇧  ってな具合であると...サッパリなんですけど。

有限射影平面のもっとも簡単な例は、7点と7直線を持ち、各点が3直線の上にあり、各直線が3点を含むようなものである。この特殊な有限射影平面は、ファノ平面とも呼ばれる。 

f:id:ts0818:20200106220535p:plain

一般的に位数n射影平面の点および直線を持ち、各直線は個の点を含み、各点は本の直線に含まれる。

有限幾何学 - Wikipedia

⇧ で、この図が出てくるんだけども、この時の「位相」がいくつになるのか説明が無いんだが...

まぁ、それはさておき、Dobbleの場合に、位相が7のケースになるんじゃないか(なぜ、位相が「7」になるのか、いまいち分からんです)って感じで、

7 × 7 + 7 + 1 = 57

っていう意見が多いんですと。ただし、Dobbleのカード枚数は55枚なので、何故2枚少なくなったのかの謎は残るわけですと。

 

実際にどうプログラミングする?

「有限射影平面」でDobbleが実現できるっていうんだけども、肝心のプログラミングはどうなるんですかいな?

とりあえず、合っているか分からないですけど、

www.101computing.net

We will base our algorithm based on the following key findings:
If a game of Dobble needs (n+1) symbols on each card, n being a primary number then we will need:

  • A collection of n2 + n + 1 symbols
  • We will be able to generate n2 + n + 1 unique cards

The Dobble Algorithm | 101 Computing

⇧  上記サイト様が、「有限射影平面」を盛り込んでそうな気配だったので、実装できるんか確かめてみました。

まず、Pythonで。

ちなみに、Python仮想環境の作成は、

docs.python.org

仮想環境 を作成するには venv コマンドを実行します:

バージョン 3.6 で非推奨: Python 3.3 と 3.4 では、仮想環境の作成に推奨していたツールは pyvenv でしたが、Python 3.6では非推奨です

バージョン 3.5 で変更: 仮想環境の作成には、 venv の使用をお勧めします。

venv --- 仮想環境の作成 — Python 3.8.1 ドキュメント

⇧ ってな具合ですと。

いま、どのバージョンのPython を使ってるんだっけ?ってな情弱な私は、途方に暮れるのであった...

ググっていたら、Pythonランチャー(Windowsだと、py.exe のこと)ってのを使うと、PCに複数Pythonをインストールしてる場合に、どんだけPythonをインストールしてたんだっけ?ってのが確認できるみたいですが、

 py.exe ランチャーは、インストールされている中で最も新しいバージョンの Python を自動的に選択します。 py -3.7 などのコマンドを使用して特定のバージョンを選択したり、使用できるバージョンを py --list を使用して確認したりすることもできます。 ただし、py.exe ランチャーが正しく動作するのは、python.org からインストールしたバージョンの Python を使用している場合だけです。Microsoft Store から Python をインストールする場合、py コマンドは含まれません LinuxmacOS、WSL、および Microsoft Store バージョンの Python の場合、python3 (または python3.7) コマンドを使用する必要があります。

Windows での Python の使用についてよく寄せられる質問 | Microsoft Docs

⇧  ってな具合に、WindowsPythonランチャーを正確に動作せるためには、インストール元をちゃんとしないといけないそうです。

 

gammasoft.jp

⇧  上記サイト様によりますと、

py --list-paths    

⇧ 上記のコマンドで、PCにインストールしてるPythonの一覧が確認できるらしいのですが、

f:id:ts0818:20200111151830p:plain

⇧  駄目でした... 

自分は、Chocolateyを使ってPythonをインストールしてる影響なのか、上手くいかず...

ただ、「py.exe」コマンド自体は実行できる模様...謎過ぎる

f:id:ts0818:20200111152258p:plain

 

ちなみ、Python ランチャーでPythonを起動した際に、Pythonの終了の仕方がちょっと独特で戸惑いました。

www.python.jp

⇧  Python ランチャーを実行すると、シェル(自分の場合は、コマンドプロンプトのこと)がPythonが実行できる環境に切り替わるみたいです。

そも、Python ランチャーがよく分かってないのですが、

バージョン 3.3 で追加.

WindowsPython ランチャは、異なる Python のバージョンの位置の特定と実行を助けるユーティリティです。スクリプト (またはコマンドライン) で特定の Python のバージョンの設定を与えられると、位置を特定し、そのバージョンを実行します。

環境変数 PATH による方法と違って、このランチャは Python の一番適切なバージョンを、正しく選択します。このランチャはシステムワイドなものよりもユーザごとのインストレーションの方を優先し、また、新しくインストールされた順よりも言語のバージョンを優先します。

ランチャのオリジナルの仕様は PEP 397 にあります。

3. Windows で Python を使う — Python 3.8.1 ドキュメント

WindowsPython ランチャーの説明(Python 2系だと使えないんですね...)で、WindowsPython ランチャーの仕様は「PEP 397」を見てくんろ、ってあるんで、

This PEP describes a Python launcher for the Windows platform. A Python launcher is a single executable which uses a number of heuristics to locate a Python executable and launch it with a specified command line.

PEP 397 -- Python launcher for Windows | Python.org

⇧ そこの説明で、「Python ランチャー」は、コマンドラインPythonの実行ファイルを実行できるようにする実行ファイルであると。 

要は、CLIPythonのプログラミングを動かせるんですと。

 

まぁ、脱線しまくりましたが、とりあえず、自分は「Python 3.7」の「venv」コマンドでPython仮想環境を構築することにしました。

Python用のプロジェクトディレクトリを適当な場所に作成します。(自分は「C:\Users\[ユーザ名]\Desktop\soft_work\python_work\Dobble」ってな感じで作成しました。)

ここから先は、Visual Studio Code を使っていきます。(もちろん、「コマンドプロンプト」と「テキストエディター」とかでも実現できます。)

そしたら、Visual Studio Code を起動して、作成したディレクトリを開き、

f:id:ts0818:20200111154620p:plain

そしたら、「表示(V)」>「ターミナル」を選択で。

f:id:ts0818:20200111154914p:plain

「ターミナル」で、さきほど作成したPython用のプロジェクトディレクトリにいることが確認できたら、「venv」モジュールを実行で、「Python仮想環境」を作成します。

docs.python.org

-m モジュール名 として Python モジュールパスにあるモジュールを指定された場合、そのモジュールをスクリプトとして実行します。

1. コマンドラインと環境 — Python 3.8.1 ドキュメント

仮想環境 を作成するには venv コマンドを実行します:

python3 -m venv /path/to/new/virtual/environment

このコマンドを実行すると、ターゲットディレクトリ (および必要なだけの親ディレクトリ) が作成され、その中に pyvenv.cfg ファイルが置かれます。 そのファイルの home キーはこのコマンドを呼び出した Python のインストール場所を指します (よく使われるターゲットディレクトリの名前は .venv です)。

venv --- 仮想環境の作成 — Python 3.8.1 ドキュメント

⇧ 上記サイト様を参考に、「Python仮想環境」を作成するコマンドを実行する前に、「Python仮想環境」用のディレクトリを作った方が良さ気なので、「.venv」ってディレクトリを作成で。

blog.shibata.tech

⇧  上記サイト様によりますと、PowerShellで、「ディレクトリ作成」「作成したディレクトリへ移動」をパイプラインで繋ぐことでワンライナーでコマンド実行して「ディレクトリ作成、そのディレクトリに移動」ができるとのこと。

ちなみに、Visual Studio Code の「ターミナル」はデフォルトで「PowerShell」になっています、たぶん。

f:id:ts0818:20200111161718p:plain

というわけで、「Python仮想環境」用のディレクトリ作成、移動で。

mkdir .\[Python仮想環境を作成したいディレクトリ名] | cvpa | cd

f:id:ts0818:20200111162227p:plain

⇧  「.venv」ディレクトリができて、「ターミナル」でも、「C:\Users\[ユーザ名]\Desktop\soft_work\python_work\Dobble\.venv」に移動で来ているので、「Python仮想環境」を作成で。

[実行したいpython.exeまでのパス]\python.exe -m venv [Python仮想環境を作成したいディレクトリ]

f:id:ts0818:20200111162752p:plain

⇧  「Python仮想環境」が作成できたようです。


Python仮想環境」にログインするには、 

 仮想環境の作成が完了すれば、その仮想環境のバイナリディレクトリにあるスクリプトで "有効化" できます。 スクリプトの呼び出し方はプラットフォーム固有です (<venv> の部分は、仮想環境があるディレクトリのパスに置き換える必要があります):

プラットフォーム

シェル

仮想環境を有効化するためのコマンド

POSIX

bash/zsh

$ source <venv>/bin/activate

 

fish

$ . <venv>/bin/activate.fish

 

csh/tcsh

$ source <venv>/bin/activate.csh

 

PowerShell Core

$ <venv>/bin/Activate.ps1

Windows

cmd.exe

C:\> <venv>\Scripts\activate.bat

 

PowerShell

PS C:\> <venv>\Scripts\Activate.ps1

venv --- 仮想環境の作成 — Python 3.8.1 ドキュメント

⇧  「Python仮想環境」にインストールされたスクリプトファイルを実行すれば良さ気です。

一応、「エクスプローラー」のほうでもちゃんとインストールされてることが確認できました。

f:id:ts0818:20200111163449p:plain

そういえば、「Python仮想環境」を何で使うかってのは、

注釈

仮想環境とは、その中にインストールされた Python インタープリタ、ライブラリ、そしてスクリプトが、他の仮想環境にインストールされたものから隔離されている Python 環境です。そして (デフォルトでは) 仮想環境は "システム" の Python、すなわち OS の一部としてインストールされた Python にインストールされている全てのライブラリからも隔離されています。

venv --- 仮想環境の作成 — Python 3.8.1 ドキュメント

注釈

仮想環境は、 Python 実行ファイルと、それが仮想環境であることを示す幾つかのファイルを含んだディレクトリツリーです。

venv --- 仮想環境の作成 — Python 3.8.1 ドキュメント

注釈

setuptools や pip などの一般的なインストールツールは期待通りに仮想環境と連係します。 言い換えると、仮想環境が有効なときには、 Python パッケージを仮想環境へインストールするのに、インストールツールへの明示的な指示は必要ありません。

venv --- 仮想環境の作成 — Python 3.8.1 ドキュメント

注釈 仮想環境が有効な場合 (すなわち、仮想環境の Python インタープリタを実行しているとき)、 sys.prefix と sys.exec_prefix は仮想環境のベースディレクトリを示します。 代わりに sys.base_prefix と sys.base_exec_prefix が仮想環境を作るときに使った、仮想環境ではない環境の Python がインストールされている場所を示します。 仮想環境が無効の時は、 sys.prefix は sys.base_prefix と、 sys.exec_prefix は sys.base_exec_prefix と同じになります (全て仮想環境ではない環境の Python のインストール場所を示します)。

venv --- 仮想環境の作成 — Python 3.8.1 ドキュメント

⇧ 複数のPythonプロジェクトがあった場合に、それぞれのプロジェクトで使ってるPythonのバージョンや、Pythonのライブラリのバージョンなどがお互いに干渉しないように、つまり、環境汚染を避けるために「Python仮想環境」は存在しているのであると。

 

気を付けたいのは、Visual Studio Code を使っている場合は、Visual Studio CodePythonを使えるようにする設定も必要ってことですかね。

www.atmarkit.co.jp

⇧  上記サイト様が詳しいです。

手前味噌になりますが、 

ts0818.hatenablog.com

⇧  自分の記事でも、Visual Studio Code の「workspace」まわりをまとめてますので、宜しければご参照ください。

 

そんじゃ、Visual Studio Code の「拡張機能」のインストールについてはインストール済という前提で進めさせていただきまして、Visual Studio Code の「workspace」を作成しますか。

「ファイル(F)」>「基本設定」>「設定」を選択。

f:id:ts0818:20200111171625p:plain

ワークスペース」タブが選択された状態で、右上のf:id:ts0818:20200111171915p:plain のアイコンをクリックします。(既にVisual Studio CodePythonのプロジェクトを作成していて、そのプロジェクトの設定と同じで良い場合は、「ユーザー」のほうを選択した状態で右上のf:id:ts0818:20200111171915p:plain のアイコンをクリックすると、既存のPyhonプロジェクトで作成されてた「settings.json」が利用できるようですが、「.vscodeディレクトリはできません。)

f:id:ts0818:20200111172325p:plain

ワークスペース」タブが選択された状態で、右上のf:id:ts0818:20200111171915p:plain のアイコンをクリックすると以下の画像のように、「.vscodeディレクトリが作成され、設定ファイル「settings.json」ファイルも作成されるので、ここにVisual Studio Code で使うpython.exe の指定とか、様々な設定をしておきます。

qiita.com

⇧  上記サイト様を参考にさせていただきました。

{
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 1000,
    // ファイルの終了時に行末のスペース削除
    "files.trimTrailingWhitespace": true,
    "files.insertFinalNewline": true,
    "python.linting.lintOnSave": true,

    // Tabをスペースキーとして変換
    "[python]": {
        "editor.insertSpaces": true,
        "editor.detectIndentation": true,
        "editor.tabSize": 4
    },
    "python.pythonPath": "C:\\Users\\Toshinobu\\Desktop\\soft_work\\python_work\\Dobble\\.venv\\Scripts\\python.exe", // python.exeの実行パス(Python仮想環境のpython.exeを指定してます)
    "python.venvPath": ".venv", // Python仮想環境を作成したディレクトリ
    "python.pipenvPath": "/usr/local/bin/pipenv",
    "python.linting.pylintEnabled": true,
    "python.linting.pep8Enabled": false,
    "python.linting.mypyEnabled": true,
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Args": [
        "--max-line-length=120",
        "--max-complexity","20"
    ],
    "python.formatting.provider": "autopep8",
    "python.formatting.autopep8Args": [
        "--aggressive",
        "--aggressive",
    ],
    "python.testing.unittestArgs": [
        "-v",
        "-s",
        ".",
        "-p",
        "*test.py"
    ],
    "python.testing.pytestEnabled": false,
    "python.testing.nosetestsEnabled": false,
    "python.testing.unittestEnabled": true
}    

⇧ こんな感じで。(「python.pipenvPath」は、有効になってるのか分からんです...)

 

そしたら、Visual Studio Code でのPython環境の準備が整ったので、pythonのファイルを作成し、コーディングしてきますが、「src」ディレクトリを作成して、そこにpyhtonファイルを配置するようにしようと思います。

「.venv」ディレクトリの直下に「src」ディレクトリを作成するので、「.venv」ディレクトリを選択した状態で、f:id:ts0818:20200111180103p:plain のアイコンをクリック。

f:id:ts0818:20200111180033p:plain

ディレクトリ名を「src」で。Enterキーとかで決定。

f:id:ts0818:20200111180159p:plain

そしたら、「src」ディレクトリを選択した状態で、f:id:ts0818:20200111180533p:plain のアイコンをクリックで、ファイルを追加します。

f:id:ts0818:20200111180500p:plain

ファイルの「拡張子」は「.py」で。名前は適当で。

f:id:ts0818:20200111180648p:plain

そしたらば、「dobble.py」にコーディングですが、

www.101computing.net

⇧  上記サイト様のソースをそのまま使わせていただきました。

ただ、Visual Studio Code で「settings.json」の設定で追加した、「flake8」っていうライブラリが、Pythonのコーディングのフォーマットのチェックとかしてくれるようで、いろいろ微調整した結果、ソースコードはこんな感じ。

# The Dobble Algorithm - www.101computing.net/the-dobble-algorithm/
from random import shuffle

# List of symbols used in the game Dobble (Spot It! in the US)
symbols = ["Anchor", "Apple", "Bomb", "Cactus", "Candle", "Carrot",
           "Cheese", "Chess knight", "Clock", "Clown", "Diasy flower", "Dinosaur",
           "Dolphin", "Dragon", "Exclamation mark", "Eye", "Fire", "Four leaf clover",
           "Ghost", "Green splats", "Hammer", "Heart", "Ice cube", "Igloo", "Key",
           "Ladybird", "Light bulb", "Lightning bolt", "Lock", "Maple leaf", "Milk bottle",
           "Moon", "No Entry sign", "Orange scarecrow man", "Pencil", "Purple bird",
           "Purple cat", "Purple dobble sign", "Question Mark", "Red lips", "Scissors",
           "Skull and crossbones", "Snowflake", "Snowman", "Spider", "Spider’s web",
           "Sun", "Sunglasses", "Target", "Taxi", "Tortoise", "Treble clef", "Tree",
           "Water drop", "Dog", "Yin and Yang", "Zebra"
           ]

# The number of symbols on a card has to be a prime number + 1
numberOfSymbolsOnCard = 8   # (7 + 1)
shuffleSymbolsOnCard = False

cards = []

# Work out the prime number
n = numberOfSymbolsOnCard - 1

# Total number of cards that can be generated following the Dobble rules
numberOfCards = (n ** 2) + n + 1  # e.g. 7^2 + 7 + 1 = 57


# Add first set of n+1 cards (e.g. 8 cards)
for i in range(n+1):
    # Add new card with first symbol
    cards.append([1])
    # Add n+1 symbols on the card (e.g. 8 symbols)
    for j in range(n):
        cards[i].append((j+1)+(i*n)+1)

# Add n sets of n cards
for k in range(2, n+2):
    for i in range(n):
        # Append a new card with 1 symbol
        cards.append([k])
        # Add n symbols on the card (e.g. 7 symbols)
        for j in range(0, n):
            val = n + 2 + i + (k+1)*j
            while val >= n + 2 + (j+1)*n:
                val = val - n
            cards[len(cards)-1].append(val)

# Shuffle symbols on each card
if shuffleSymbolsOnCard:
    for card in cards:
        shuffle(card)

# Output all cards
i = 0
for card in cards:
    i += 1
    line = str(i) + " - ["
    for number in card:
        line = line + symbols[number-1] + ", "
    line = line[:-2] + "]"
    print(line)

⇧ 警告とかが分かりにくかったですが...インデントが結構厳しく注意されました。

qiita.com

⇧ 上記サイト様が、「エラー」とかまとめてくださっています。

そんじゃ、dobble.py を実行で。赤枠内で右クリックすると、

f:id:ts0818:20200111184109p:plain

「ターミナルで Python ファイルを実行」が選択できるので選択。

選択肢に出てこない場合は、

www.atmarkit.co.jp

qiita.com

それでは先ほど作成したファイルを実行していきましょう.
まずはCtrl+Shift+P(同時押し)で"コマンドパレット"というものが開くのでpython select interpreterを検索します.

VS codeでpython3の実行(windows10) - Qiita

⇧ 上記サイト様を参考ください。(すみません、自分は、Visual Studio Code で何回かPythonのプロジェクトを試していたので、その時に設定されてたんだと思います。)

んで、実行。

f:id:ts0818:20200111182931p:plain

「ターミナル」に結果が表示されました!

f:id:ts0818:20200111190515p:plain

本当に、Dobble のようにそれぞれで1つのシンボルだけ共通となっているのかのチェックのプログラムを、時間のある時に別途実装していきたいですね。

今回はこのへんで。