Domemo(python版) Lv1

##Domemo？
とあるボードゲーム。
社内勉強会で作成するプログラムの題材として選定。
[Domemoの詳細はこちらを参照](https://chimolog.co/domemo/)
![domemo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270579/9b4ab5d6-045f-dcdd-cdf2-3d7ab490e878.png)

なぜDomemoを作る事にしたかといえば、
作って遊べるものを題材にした方がモチベーションが続きやすいから。

Pythonで開発したい方々がいるので、Python版を平行して作成。

##準備
###まずはVisual Studio 2019をインストール！
https://docs.microsoft.com/ja-jp/visualstudio/releases/2019/release-notes

色んなバージョンがありますが「Community 2019　のダウンロード」でよいです。
![Community.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270579/95abcb91-63c1-6594-236c-1c65e2de326d.jpeg)

インストールの時にPythonを選びましょう。
どうやらPythonのランタイムも一緒に入れてくれるようです。便利ですね。
なお、2019.4.21時点では3.7.2がインストールされるようですが、3.7.3を後からインストールしても有効になりました。
VS2019賢い。
![VS2019 python.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270579/d17f8c81-a996-0b20-4d45-8b9a8a7c9f1f.jpeg)

Visual Studioを起動したら、メニューの「ファイル」から新しいプロジェクトを作成。
![py1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270579/563f95cd-5907-c75d-58dd-a1380c4606dd.jpeg)

Pythonを選びます。プロジェクト名はお好きなように。
![py2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270579/5dd3d9c6-dcfe-b926-b99a-a7c802170740.jpeg)

エディタにソースコードを書きます。
![py3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270579/570a55df-770c-e841-c9b8-242aff6cf604.jpeg)




###Pythonについてはここから！
以下で紹介する記事は全部読んだり、1回で理解する必要はないです。
必要に応じて参照してください。
ただし、Python3.X系の記事を選びましょう。
Python2.7系とPython3.X系は流儀が違うので、せっかくなら新しい3.X系を使いましょう。

[Pythonリファレンス](https://docs.python.org/3/)
左上の言語欄でJapaneseを選べば日本語で表示されます。
まずはTutorialをやってみると、Pythonについての理解が深まるでしょう。
Pythonでできる、一通りの機能が学べるのでおすすめです。

[Pythonビギナーズガイド](https://wiki.python.org/moin/BeginnersGuide)
![py4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270579/8393109b-1ab8-7a0a-aec6-940f93c462ec.jpeg)
中国語の翻訳もできますね。凄い。


##考え方
まずはゲームのルールを理解しましょう。
実際に遊んでみるのが一番！
実物を持ってると、実際に並べながら考えられるのでお勧めです。

###どうやったらゲームができるのか、手順を考える
1: 1～7までのカードを用意する
2: カードをシャッフルする
3: 場にカードを4枚表にする
4: 4枚のカードを、内容を伏せたままゲームから除外する
5: カードを5枚ずつ4人のプレイヤーに配る
6: 各プレイヤーは自分には見えないようにカードを表にする
7: 各プレイヤーは(他のプレイヤーのカードを見ながら)自分が持っているカードを予想して、宣言する
8: 予想があっていたら、手札からカードを場に移動して表にする
9: 最初に手札がなくなったプレイヤーが勝ち

[Domemoの詳しいルールについてはこちらを参照](https://chimolog.co/domemo/)

###シンプルにするための前提
1: プレイヤー人数を4人とする
2: Player1(自分)の手札は見えないようにする
3: とにかく動けばOK

##今後のロードマップ
**Lv1:まずは組んでみよう(now!)**
Lv2:CPUを強くしよう
※徐々にPGを育てていくVB編と対照的に、あえて、ある程度作りこんだプログラムを提供する。
　どちらの方が学習が進みやすいかをテストしたい。

##Lv1:まずは組んでみよう
まずは動けばOK!!
難しく考えずに、コードをがりがり書いてみましょう。
わからなければ、まずはコピペして、そこからコードを改良するとよいでしょう。

```python
import random
from time import sleep

# プレイヤーの処理をクラスにまとめる
class Player:
    # 初期化
    def __init__(self, name, cards):
        self.name = name
        self.cards = cards
    
    # 自分のカードを表示する
    def show(self):
        cards = ""
        for card in self.cards: 
            cards += str(card)
        print (self.name + "->" + cards)

    # 自分のカードを伏せて表示する
    def show_mask(self):
        cards = ""
        for card in self.cards:
            cards += "X"
        print (self.name + "->" + cards)
    
    # 宣言したカードがあっているか判定する
    def match_card(self, guess_card):
        try:
            self.cards.remove(guess_card)
            print("jackpot.")
            return guess_card
        except ValueError:
            print("miss.")
            return 0
    
    # 残りのカード枚数を判定する
    def check(self):
        return len(self.cards) == 0

# カードを表示する
def show_cards(cards):
    strs = ""
    for card in cards:
        strs += str(card)
    print(strs)

# プレイヤーのカードを表示する
def show_players(players):
    for i in range(0, len(players)):
        if i == 0:
            players[i].show_mask()
        else:
            players[i].show()

# ゲーム実行
def main():
    # 1: 1～7までのカードを用意する
    cards = [1]
    open_cards = []
    for i in range(2,8):
        cards += [i] * i
    
    # 2: カードをシャッフルする
    for idx in range(0, len(cards)):
        swap_idx = random.randint(1, len(cards)-1)
        swap = cards[swap_idx]
        cards[swap_idx] = cards[idx]
        cards[idx] = swap
    
    show_cards(cards)
    
    # 3: 場にカードを4枚表にする
    for i in range(0,4):
        open_cards.append(cards.pop())
    
    # 5: カードを5枚ずつ4人のプレイヤーに配る
    # ここでは、除外カードをあえて変数にせず、誰にも見せないままにしているので
    # 「4: 4枚のカードを、内容を伏せたままゲームから除外する」の要件を満たしている
    players = []
    for i in range(0, 4):
        players.append(Player("Player" + str(i+1), cards[5*i:5*(i+1)]))
        players[i].cards.sort()

    # 6: 各プレイヤーは自分には見えないようにカードを表にする
    show_players(players)

    round_count = 1
    while True:
        print("Round" + str(round_count) + "------")
        show_cards(open_cards)
        show_players(players)

        # 7: 各プレイヤーは自分が持っているカードを予想して、宣言する
        for player in players:
            if player.name == "Player1":
                guess_card = int(input(">" + player.name + "->"))
            else:
                guess_card = random.randint(1, 7)
                print(">" + player.name + "->" + str(guess_card))
            
            sleep(1)

            # 8: 予想があっていたら、手札からカードを場に移動して表にする
            result = player.match_card(guess_card)
            if result > 0:
                open_cards.append(result)
                open_cards.sort()
            
            sleep(1)

            # 9: 最初に手札がなくなったプレイヤーが勝ち
            if player.check():
                print(player.name + " is Win!")
                return
        
        round_count += 1

# ゲームスタート
main()
```
改良できる部分はまだまだたくさん。
また、これと違うプログラムを書いても、ルール通りに動けばOKです。
楽しみながら作ってみましょう！