プログラミング初心者はとりあえず『ゲーム』を作ればいいんじゃないか？っていう話

#はじめに

プログラミング始めたんだけど、これが何の役に立つのか分からない。何ができるようになるのかイメージがつかめないって初心者さんは意外と多いんじゃないでしょうか？

そりゃあ、例えばpythonだったら自動化だったり機械学習だったり画像認識だったりできるっていうのは知っているでしょう。私だって知ってます。

でも、実際に勉強し始めると最初は『変数』だとか『データ型』だとか『リスト』だとか……
で、それが何なの？美味しいの？？
ってなりませんか。私はﾊﾞｶだからなりました。

さて、

前置きが長くなりましたね。私は現在のプログラミング教育ってハードルが高いと思っています。賢い人は別なんでしょうけど、私みたいな人には学習コストが高いです。

だから、もっと簡単なことから始めてもいいんじゃないかと思うのです。

#で、なにするの？

『ゲーム』を作ります。
しかし、ゲームと言っても死ぬほど簡単です。
推しキャラと『じゃんけん』するだけの簡単なゲームです。

プログラミング初心者向けの本でも度々登場するじゃんけんゲームですね。これを自分なりにアレンジしたものを作ります。

たかがじゃんけん１つでも、愛情たっぷり丹精込めて作ったじゃんけんはそれなりに面白いと思うんですよね。

#実装
###1. まずは単純なじゃんけんをします
```janken.py

import random

# janken head
print("ジャンケンだYO！")
print("最初はドーン！　ジャンケンッ　ホイッ！！")

# define function
def janken():
    global myhand
    global mynum
    global yournum
    yournum = random.randint(1,3)
    mynum = 0
    myhand = input(":")
    if myhand == "goo":
        mynum = 1
    elif myhand == "choki":
        mynum = 2
    elif myhand == "paa":
        mynum = 3
    else:
        print("真面目にやってください！")
    
    if yournum == 1:
        yourhand = "goo"
        print(yourhand)
    elif yournum == 2:
        yourhand = "choki"
        print(yourhand)
    elif yournum == 3:
        yourhand = "paa"
        print(yourhand)
    
    i = 1
    while i ==1:
        result = (yournum - mynum) % 3
        if result == 0:
            print("あいこでしょ！")
            janken()
        elif result == 1:
            print("負けました～")
            break
        elif result == 2:
            print("私の勝ちですねっ！")
            break

# execute function
janken()

```
なんか藤原書記っぽい人とじゃんけんするゲームができあがりました。
じゃんけんプログラムの肝は2点あって、
１つは、["goo","choki","paa"]を[1,2,3]と数値で表すこと。そして、相手と自分の数値の差を3の合同式を使って勝敗を決めることです。
例えば、相手が"goo"で自分も"goo"を出したら、1-1=0　0%3=0なのであいこ。
相手が"goo"で自分が"choki"なら、1-2=-1 -1%3=2なので自分の負け。
相手が"goo"で自分が"paa"なら、1-3=-2 -2%3=1なので自分の勝ち。といった具合に。

２つは、あいこの場合をうまく表現すること。じゃんけんはあいこの時だけループが発生するアルゴリズムとなっています。
なので、あいこの時は、最初からやり直す処理を記述する必要があります（私は関数を再び呼び出していますが、もっと良いやり方があるかもしれませんね）

さて、藤原書記っぽい人とじゃんけんをするだけでもそれなりに楽しいですし、一般的な学習本ならこの程度で終わりなのですが、今回はもっとアレンジしていきたいと思います。

###2. ３本先取にする
じゃんけんと言えばだいたい３本先取ですよね。なので、こちらのプログラムを３本先取にしていきます。

```janken.py

import random

# janken head
print("３本先取ジャンケンだYO！")
print("最初はドーン！　ジャンケンッ　ホイッ！！")

count = [0,0]   # [mypoint,yourpoint]

# define function
def janken():
    global myhand
    global mynum
    global yournum
    yournum = random.randint(1,3)
    mynum = 0
    myhand = input(":")
    if myhand == "goo":
        mynum = 1
    elif myhand == "choki":
        mynum = 2
    elif myhand == "paa":
        mynum = 3
    else:
        print("真面目にやってください！")
    
    if yournum == 1:
        yourhand = "goo"
        print(yourhand)
    elif yournum == 2:
        yourhand = "choki"
        print(yourhand)
    elif yournum == 3:
        yourhand = "paa"
        print(yourhand)
    
    global count
    i = 1
    while i ==1:
        result = (yournum - mynum) % 3
        if result == 0:
            print("あいこでしょ！")
            janken()
        elif result == 1:
            print("負けました～")
            if count[0] < 2:
                print("次は負けませんよ～")
                count[0] += 1
                print(str(count[0]) + "勝"+ str(count[1]) + "敗ですね！")
                janken()
            elif count[0] == 2:
                print("やられちゃいました～")
                break
        elif result == 2:
            print("私の勝ちですねっ！")
            if count[1] < 2:
                print("負けた人は勝った人の言うことをなんでも聞くんですよね～")
                count[1] += 1
                print(str(count[0]) + "勝"+ str(count[1]) + "敗ですね！")
                janken()
            elif count[1] == 2:
                print("わーい！　勝ちました～")
                break

# execute function
janken()

```
これで３本先取にすることができました。勝率は５割くらいでしょうか。実際にやってみると案外勝てません。
今回はcountという変数を作って、勝敗ごとに勝ち点１を加算していくだけなので実装は簡単ですね。
３本先取するまでは、先のあいこと同じように関数を呼び出してループさせています。

さて、藤原書記とじゃんけんするだけでもそれなりに楽しいですし、ともすれば藤原書記とじゃんけんをしているだけで１日が過ぎ去るんですが、
なにか、こう……物足りないですよね。

###3. キャラを増やす
そうですね。物足りなさの正体はキャラの少なさです。
そりゃあまあ、藤原書記も可愛いですけど、１日中藤原書記とじゃんけんばかりしていても飽きますよね（というか、藤原書記に飽きられる）
なので、キャラを増やしましょう。

```janken.py

import random

# 勝ち数をカウントする
count = [0,0]   # [mypoint,yourpoint]

# define class and function
class Shuchiin:
    def __init__(self,name,words_list):
        self.name = name
        self.words_list = words_list
    
    def janken_head(self,words_list):
        self.words_list = words_list
        print(words_list[0])
        print(words_list[1])

    def janken(self,words_list):
        self.words_list = words_list
        global myhand
        global mynum
        global yournum
        yournum = random.randint(1,3)
        mynum = 0
        myhand = input(":")
        if myhand == "goo":
            mynum = 1
        elif myhand == "choki":
            mynum = 2
        elif myhand == "paa":
            mynum = 3
        else:
            print(words_list[2])
        
        if yournum == 1:
            yourhand = "goo"
            print(yourhand)
        elif yournum == 2:
            yourhand = "choki"
            print(yourhand)
        elif yournum == 3:
            yourhand = "paa"
            print(yourhand)
        
        global count
        i = 1
        while i ==1:
            result = (yournum - mynum) % 3
            if result == 0:
                print(words_list[3])
                self.janken(words_list)
            elif result == 1:
                if count[0] < 2:
                    print(words_list[4])
                    print(words_list[5])
                    count[0] += 1
                    print(str(count[0]) + "勝"+ str(count[1]) + "敗ですね")
                    self.janken(words_list)
                elif count[0] == 2:
                    print(words_list[6])
                    break
            elif result == 2:
                if count[1] < 2:
                    print(words_list[7])
                    print(words_list[8])
                    count[1] += 1
                    print(str(count[0]) + "勝"+ str(count[1]) + "敗ですね")
                    self.janken(words_list)
                elif count[1] == 2:
                    print(words_list[9])
                    break

# define each words_list
Kei_list = ["じゃんけんですか？","最初はぐー、じゃんけん、ほいっ","真面目にしないならやめますよ","あいこでしょ","うぅ","次こそ……","強いんですね。でも、次は負けませんから","ふっ","まだやりますか？","私の勝ちですね。まずはこんにち殺法の練習から始めた方がいいですよ"]
Huziwara_list = ["３本先取ジャンケンだYO！","最初はドーン！　ジャンケンッ　ホイッ！！","真面目にやってください！","あいこでしょ！","負けました～","次は負けませんよ～","やられちゃいました～","私の勝ちですねっ！","負けた人は勝った人の言うことをなんでも聞くんですよね～","わーい！　勝ちました～"]
Shinomiya_list = ["あら、私とじゃんけんをしたいのですか？　お可愛いこと。３本先取でいいですね？","最初はグー、じゃんけん、ほい","真面目にしていただけませんか","おあいこですね","あら、負けましたわ","次は負けないですからね","認めましょう、私の負けです","あら、私の勝ちですね","遺言を考えておいた方が良いですよ","お可愛いこと"]

# create each instance
Kei = Shuchiin("Kei",Kei_list)
Huziwara = Shuchiin("Huziwara",Huziwara_list)
Shinomiya = Shuchiin("Shinomiya",Shinomiya_list)

# execute function
player = input("誰と対戦しますか？:")
if player == "kei":
    Kei.janken_head(Kei_list)
    Kei.janken(Kei_list)
elif player == "huziwara":
    Huziwara.janken_head(Huziwara_list)
    Huziwara.janken(Huziwara_list)
elif player == "shinomiya":
    Shinomiya.janken_head(Shinomiya_list)
    Shinomiya.janken(Shinomiya_list)
else:
    print("今日はもう帰りましょう")

```

藤原書記の他に圭ちゃんとかぐや様を呼んできました（女性陣ばかりなのはたまたまです）
これでバラエティ豊かになりましたね。
変更点はキャラごとに台詞を変えたことと、開始時に対戦プレイヤーを選択できるようにしました。

ふぅ、これで１日中遊べますね。




#おわりに
さて、簡単なゲームを実装して思ったことですが、プログラミングは条件分岐や繰り返しを含む『手続き』を表現できることがわかりましたね。

じゃんけんは、勝敗の条件分岐と連戦という繰り返しを含む最も簡単な手続きをするゲームだと言えます。

そして、じゃんけん一つとっても、四則演算や条件分岐、関数やクラスが必要なことがわかりました。

なんでも小さいことをコツコツと続けることが最強だと思っております。
私もプログラミング初心者ですが、一歩ずつプログラミング道を歩んでいきたいと思います