Kivyでオセロ開発Part4

kivyでオセロ開発パートよんのサムネイル

こんにちは、にわこまです。

今回は、オセロゲームの仕組み部分を担うmain文を作成します。Part1~Part3で作ってきたクラスや関数を使って作成します。先手後手選択、アドレス(棋譜)入力、盤面更新、勝利判定、続けるかやめるかなどを組み込みます。

 

誤字脱字など、何かございましたらご連絡お願い致します。

 

 

スポンサードサーチ


Kivyでオセロ開発Part4

今回のシリーズは、Kivyを使ってオセロを開発することを目的としています。

 

今回のシリーズの主な内容

1.コマンドプロンプト上で遊べるオセロの開発←今ココ

2.kivyを使ってオセロを開発(Kivy Languageは使用しない)

3.kivyを使ってオセロを開発(Kivy Languageを使用する)

 

目的を達成するためにも、まずはコマンドプロンプト上で遊ぶことができるオセロを開発します。

次に、kivyを使ってオセロを開発します。しかし、Kivy Languageは使用しません。つまり、pythonだけをつかってオセロアプリケーションを開発します。

最後に、Kivy Languageとpythonを使ってオセロアプリケーションを開発します。

 

今回は

今回は、コマンドプロンプト上で遊ぶことができるオセロの、main文を作成します。また、コマンドプロンプト上で遊べるオセロ開発の最終回です。

このプログラムを基にKivyでの開発を進めるため、理解しましょう。

 

 

main文のフローチャート

main文に、どのような手順が必要であるか考えます。

 

1.先手後手の選択

2.盤面表示

3.ループ開始

3-1.プレイヤーの手番であればプレイヤーの操作

3-2.コンピュータの手番であればコンピュータの操作

4.盤面表示

5.勝利判定(試合が終わればループから抜ける、終わらなければループから抜けない)

6.続けるか続けないかの選択(続ける場合は1に戻る)

 

以上がmain文に必要な手順であると考えました。細かい部分は省いています。

言葉だけでは分かりにくいと思うため、図にして示します。

メイン文をフローチャートとして表現した画像

 

 

スポンサードサーチ


main文

main文の手順をコードに書き換えたものを解説します。

main文のソースコードです。othello_alpha.pyに以下のコードを追記します。

# 上記省略

def setField():
    field = np.array([[0,0,0,0,0,0,0,0],
                      [0,0,0,0,0,0,0,0],
                      [0,0,0,0,0,0,0,0],
                      [0,0,0,2,1,0,0,0],
                      [0,0,0,1,2,0,0,0],
                      [0,0,0,0,0,0,0,0],
                      [0,0,0,0,0,0,0,0],
                      [0,0,0,0,0,0,0,0]])
    return field

# global 変数
# 省略

def main():
    # main loop
    playcount = 0
    while(playcount == 0):
        # 盤面を初期状態にする
        global field
        field = setField()
        # 先攻後攻を決める
        global playerStone
        global computerStone
        global Turn
        playerStone, computerStone, Turn = setStone()

        global player
        global comp
        player = Player(playerStone, computerStone)
        comp = Computer(computerStone, playerStone)

        # 盤面の表示
        printField()
        printCmd()

        # play loop
        while(True):
            if(Turn == playerStone):
                pl = player.getPossibleLocation()
                if(len(pl) == 0):
                    # pass
                    print("pass")
                    Turn = computerStone
                else:
                    address = input("棋譜を選択してください:")
                    if(address in ["End", "end"]):
                        sys.exit()
                    pos = player.address2pos(address)
                    if(player.confPos(pos)):
                        player.updateField(pos)
                        Turn = computerStone
                    else:
                        print("{0}を選択することはできません。".format(address))
                        print("")
                        continue
            elif(Turn == computerStone):
                pos = comp.electRandom()
                if(pos == None):
                    # pass
                    Turn = playerStone
                else:
                    comp.updateField(pos)
                    Turn = playerStone
            else:
                print("終了します。")
                break

            # 盤面表示
            printField()

            # 勝利判定
            if(len(player.getPossibleLocation()) == 0 and len(comp.getPossibleLocation()) == 0):
                print("オセロを終了します。")
                print("まで、{0}手".format(playcount))
                print(confResult())
                break
            playcount += 1

        # Question : continue
        print("Continue? (New Game)")
        ans = input("Yes(y) / No(n) : ")
        if(ans in ["No", "no", "n"]):
            break
        playcount = 0
        print("================== New Game ====================")
    pass

if __name__ == '__main__':
    main()

 

コードの解説

3行目~12行目の「setField」は、初期状態の盤面をグローバル変数fieldに代入するための関数です。オセロゲームを続けるときに必要となります。

 

17行目~90行目の「main」は、オセロゲームを実行する関数です。

20行目の「while文」は、フローチャートで示すと「スタート」から「エンド」のことを指します。

21行目~32行目は、グローバル変数へ値を代入しています。また先手後手を決めています。

34行目~36行目は、盤面とコマンドを表示しています。

39行目の「while文」は、フローチャートで示すと「ループ開始」から「勝利判定」のことを指します。

 

40行目~57行目は、プレイヤーのターンであるときの操作です。

42、46行目は、プレイヤーが「pass」であるかどうかを調べています。

プレイヤーがパスであれば、コンピュータに手番を回します。

プレイヤーがパスでなければ、アドレス(棋譜)の入力待ちを行います。その後、選択されたマスに石を置くことができるか確かめて、盤面を更新します。選択不可能なマスを選択した場合は、もう一度アドレス(棋譜)の入力待ちを行います。

 

58行目~65行目は、コンピュータのターンであるときの操作です。

60、63行目は、コンピュータが「pass」であるかどうかを調べています。

コンピュータがパスであれば、プレイヤーに手番を回します。

コンピュータがパスでなければ、盤面を更新します。

 

71行目の「printField」は、盤面を表示しています。フローチャートで示すと、2回目の「盤面の表示」のことを指します。

 

74行目~78行目は、勝利判定を行っています。プレイヤーとコンピュータの両者に石を置くことができなければ、勝ち負けまたは引き分けを表示し、ループから抜け出します。

 

82行目~85行目は、もう一度オセロを続けるかどうかの判定を行っています。

 

 

動作確認

main文が正しくどうさするか確認するために動作確認を行います。コマンドプロンプトを開きothello_alpha.pyを保存したフォルダまで移動します。

 

フォルダまで移動したらothello_alpha.pyを実行し、オセロをプレイします。

python othello_alpha.py

 

実行したら初めに、以下のように表示されます。1か2のどちらかを入力します。

先攻と後攻どちらにしますか?
先攻:1
後攻:2
数字を入力してください:

 

次に盤面とコマンドが表示されます。私は先攻を選択したため以下のように表示されました。

      a    b    c    d    e    f    g    h
   +----+----+----+----+----+----+----+----+
 1 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 2 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 3 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 4 |    |    |    | ●  | ○  |    |    |    |
   +----+----+----+----+----+----+----+----+
 5 |    |    |    | ○  | ●  |    |    |    |
   +----+----+----+----+----+----+----+----+
 6 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 7 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 8 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 黒駒:○
 白駒:●
 マスの指定の仕方(例): a1, g8
 アルファベット、数字の順で指定
棋譜を選択してください:

 

適当にアドレス(棋譜)を入力してゲームを進めます。入力後、更新された盤面が表示されます。またその後、コンピュータがアドレス(棋譜)を選択し、盤面が更新されます。以下のように表示されました。

      a    b    c    d    e    f    g    h
   +----+----+----+----+----+----+----+----+
 1 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 2 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 3 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 4 |    |    |    | ●  | ○  |    |    |    |
   +----+----+----+----+----+----+----+----+
 5 |    |    |    | ○  | ○  |    |    |    |
   +----+----+----+----+----+----+----+----+
 6 |    |    |    |    | ○  |    |    |    |
   +----+----+----+----+----+----+----+----+
 7 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 8 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+

      a    b    c    d    e    f    g    h
   +----+----+----+----+----+----+----+----+
 1 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 2 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 3 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 4 |    |    |    | ●  | ○  |    |    |    |
   +----+----+----+----+----+----+----+----+
 5 |    |    |    | ○  | ●  |    |    |    |
   +----+----+----+----+----+----+----+----+
 6 |    |    |    |    | ○  | ●  |    |    |
   +----+----+----+----+----+----+----+----+
 7 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
 8 |    |    |    |    |    |    |    |    |
   +----+----+----+----+----+----+----+----+
棋譜を選択してください:

 

以上を繰り返すとオセロをプレイすることができます。

動作確認は完了です。

 

 

スポンサードサーチ


まとめ

今回は、コマンドプロンプト上でプレイするオセロを完成させました。本記事で作成したmain文の考え方は今後作成するkivyでのアプリでも通ずるものがあるため覚えておきましょう。

以下に本記事で使用したコードを示します。

 

コマンドプロンプト上で遊ぶことができるオセロを完成させなければ、今後開発するkivyでのアプリでつまずく可能性があります。

分からない点がありましたらご連絡お願い致します。メールかTwitterのDMで承ります。

 

次回のPart5からは、kivyを使ってアプリケーション開発します。

 

 

最後までお読みいただきありがとうございます。


スポンサードサーチ