簡易ブラックジャックを作ってみよう

# はじめに
　今日の授業では下記のブラックジャックを作ってみようという課題が与えられましたが、とても難しいと感じ上手くプログラムを書くことができませんでした。
　クラスメイトに教わったおかげでStepUp3の構造を理解でき、とてもありがたかったのですが、自分で組み上げたいと思い授業後まとめてみましたのでみていただけたらありがたいです。
# ブラックジャックの実装
　簡易的な21を超えたら負けー！！になるブラックジャックを実装していきます。
　ステップが四段階あり3番目が特に難しかったです。
難しかった点は以下の通りです。
* 21を超えたら自動で抜け出すようにする条件分岐
* カードを引きたいときにその意思表示を確認する変数judgeの条件分岐
* 21を超えた際に終了させるために0を代入する変数judgeの処理をいつ行うか
* 1が出た際に1か11を選ばせますが、それ以外を選んだら選ぶまで繰り返し選択する画面にする条件分岐と繰り返し処理


## StepUp1

- 3回カードを引き合計を表示するプログラムを作成しなさい
- カードを引いた値は、1〜10のランダムな値とする
- 乱数は標準ライブラリrandomモジュールを使用すること

```python
import random

def StepUp1():
  #乱数を入れる変数rの初期化
  r = 0 
  #合計を入れる変数sumの初期化
  sum = 0 
  #3回繰り返し処理を行う
  for i in range(3): 
    #乱数を求めて変数rに代入
    r = random.randint(1,10) 
    #引いたカードの合計を変数sumに代入する
    sum += r
    print(str(i + 1) + "回目:合計" + str(sum)) 
  print("得点:" + str(sum))

StepUp1()
"""
処理結果の一例(乱数を用いるため毎回結果が異なる)
1回目:合計7
2回目:合計15
3回目:合計20
得点:20
"""
```

## StepUp2

- 繰り返し回数はユーザが入力して決めなさい
- 合計が21を超えた場合は0点にすること

```python
import random

def StepUp2():
  #乱数を入れる変数rの初期化
  r = 0 
  #合計を入れる変数sumの初期化
  sum = 0 
  #繰り返し処理を行う回数を変数cntに代入
  cnt = int(input("引く回数を入力しなさい:"))
  #初期値0の変数iがcntの値になるまで繰り返し処理を行う
  for i in range(0,cnt,1):
    #乱数を求めて変数rに代入
    r = random.randint(1,10)
    #引いたカードの合計を変数sumに足していく
    sum += r
    print(str(i + 1) + "回目:合計" + str(sum)) 

  #繰り返し処理終了後、sumが21より大きい時の処理
  if sum > 21:
    #変数sumに0を代入
    sum = 0

  print("引いた回数:" + str(cnt))
  print("得点:" + str(sum))

StepUp2()
"""
処理結果の一例(乱数を用いるため毎回結果が異なる)
引く回数を入力しなさい:4
1回目:合計2
2回目:合計10
3回目:合計15
4回目:合計24
引いた回数:4
得点:0
"""
```

## StepUp3

ユーザがカードを引くか選択できるようにする

- ユーザはカードを引くか数字で入力

　　1:カードを引く

　　それ以外:カードを引かずに終了する

- 1〜10までの乱数を求めて合計に足す
- ユーザが1以外の数字を選択したら結果（得点と引いた枚数）を表示

```python
import random

def StepUp3():
  #乱数を入れる変数rの初期化
  r = 0  
  #合計を入れる変数sumの初期化
  sum = 0 
  #繰り返し処理を何回行ったか記録するための変数cntの初期化
  cnt = 0
  #繰り返し処理を始めるために変数judgeに代入
  judge = 1
  #judge＝1の間、繰り返し処理を続ける
  while judge == 1:
    if sum < 21:
      judge = int(input("1:カードを引く,それ以外:引くのをやめる"))
      if judge == 1:
        #乱数を求めて変数rに代入
        r = random.randint(1,10)
        #引いたカードの合計を変数sumに足していく
        sum += r
        cnt += 1
        print(str(cnt) + "回目:合計" + str(sum)) 
      else:
        judge = 0
    elif sum = 21 or judge != 1:
      judge = 0
      print("--終了--")
    else:
      sum = 0
      judge = 0
      print("--終了--")

  print("引いた回数:" + str(cnt))
  print("得点:" + str(sum))

StepUp3()

"""
処理結果1（乱数を用いるため毎回結果が異なる）
1:カードを引く,それ以外:引くのをやめる1
1回目:合計6
1:カードを引く,それ以外:引くのをやめる1
2回目:合計11
1:カードを引く,それ以外:引くのをやめる1
3回目:合計15
1:カードを引く,それ以外:引くのをやめる1
4回目:合計20
1:カードを引く,それ以外:引くのをやめる0
引いた回数:4
得点:20

ーーーーーーーーーーーーーーーーーーー
処理結果2（乱数を用いるため毎回結果が異なる）
1:カードを引く,それ以外:引くのをやめる1
1回目:合計10
1:カードを引く,それ以外:引くのをやめる1
2回目:合計20
1:カードを引く,それ以外:引くのをやめる1
3回目:合計28
--終了--
引いた回数:3
得点:0
"""
```

## StepUp4

- 21ぴったりの時に「ブラックジャック」と出力する
- 絵札（11、12、13）が出た場合は10としてカウントする
- 1が出た時は1か11のどちらかを選択して使用することができる

```python
import random

def StepUp4():
  #乱数を入れる変数rの初期化
  r = 0  
  #合計を入れる変数sumの初期化
  sum = 0 
  #繰り返し処理を何回行ったか記録するための変数cntの初期化
  cnt = 0
  #繰り返し処理を始めるために変数judgeに代入
  judge = 1
  #1が出た際に1か11を選んだ場合に繰り返し処理から抜ける判定するための変数decisionの初期化
  decision = 0
  #judge＝1の間、繰り返し処理を続ける
  while judge == 1:
    if sum < 21:
      judge = int(input("1:カードを引く,それ以外:引くのをやめる"))
      if judge == 1:
        #乱数を求めて変数rに代入
        r = random.randint(1,13)
        #1が出た場合に1か11のどちらかを選ぶ繰り返し処理
        if r == 1:
          while decision == 0:
            r = int(input("1が出ましたので1か11のどちらかを選んでください"))
            if r == 1 or r == 11:
              #引いたカードの合計を変数sumに足していく
              sum += r
              cnt += 1
              #1か11のどちらかを選ばなければならない繰り返しから抜け出すために1を代入
              decision = 1
              print(str(cnt) + "回目:合計" + str(sum))
        #11以上の絵札が出た場合は10としてカウントする
        elif r >= 11:
          r = 10
          #引いたカードの合計を変数sumに足していく
          sum += r
          cnt += 1
          print(str(cnt) + "回目:合計" + str(sum))
        #それ以外のカードが出た場合の処理
        else:
          #引いたカードの合計を変数sumに足していく
          sum += r
          cnt += 1
          print(str(cnt) + "回目:合計" + str(sum)) 
      elif sum == 21:
        judge = 0
        print("ブラックジャック")
      else:
        judge = 0
        print("--終了--")
    else:
      sum = 0
      judge = 0
      print("--ゲームオーバ--")

  print("引いた回数:" + str(cnt))
  print("得点:" + str(sum))

StepUp4()
"""
処理結果1（乱数を用いるため毎回結果が異なる）
1:カードを引く,それ以外:引くのをやめる1
1が出ましたので1か11のどちらかを選んでください3
1が出ましたので1か11のどちらかを選んでください7
1が出ましたので1か11のどちらかを選んでください11
1回目:合計11
1:カードを引く,それ以外:引くのをやめる1
2回目:合計16
1:カードを引く,それ以外:引くのをやめる1
3回目:合計22
--ゲームオーバ--
引いた回数:3
得点:0
--------------------------------
処理結果2（乱数を用いるため毎回結果が異なる）
1:カードを引く,それ以外:引くのをやめる1
1が出ましたので1か11のどちらかを選んでください11
1回目:合計11
1:カードを引く,それ以外:引くのをやめる1
2回目:合計13
1:カードを引く,それ以外:引くのをやめる1
3回目:合計18
1:カードを引く,それ以外:引くのをやめる0
--終了--
引いた回数:3
得点:18
"""
```

# 最後に
このような演習を通して今回の考え方や便利な判断を抜ける処理ををいろんなプログラミング学習に活かしていきたいと思っていますので、授業でこのような機会を頂けたのは本当にありがたいです。
いつかCPUディーラーとの対戦ができる機能をつけたいと思っています！