Kivyでオセロ開発Part3

Kivyでオセロ開発パートさんを表すサムネイル

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

今回は、盤面やアドレス(棋譜)の入力待ちをする関数を作成します。盤面がなければ、戦略を考えることができないですし、入力待ちを唐突に出力させると混乱します。よりゲームっぽくさせるために、この関数は必要になります。

 

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

 

 

スポンサードサーチ


Kivyでオセロ開発Part3

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

 

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

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

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

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

 

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

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

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

 

今回は

今回は、コマンドプロンプト上で遊べるオセロの中でも、表示関数を開発します。

オセロゲームを行う上で必要となる表示関数を考えます。

・盤面の表示
・コマンドの表示
・先手後手を決定の表示
・結果の表示

以上が、オセロゲームを行う上で必要な表示関数であると考えました。

 

盤面の表示とそれ以外の表示で解説します。

 

 

盤面の表示

盤面を表示する関数は、アドレスのアルファベットと数字と8×8のマスと石の表示を担います。

開発する関数の完成形のイメージを以下に示します。

盤面を表示する関数の完成形の画像

 

盤面を表示する関数を、アドレスのアルファベットを表示する関数(printHeader)とアドレスの数字と8×8のマスと石を表示する関数(printField)に分けて考えます。

最終的には、「printHeader」を「printField」に組み込みます。

完成形のイメージだと、どこのことを指すのか示します。青色の線で囲まれた部分をprintHeaderで実現します。赤色の線で囲まれ部分をprintFieldで実現します。

printHeaderとprintFieldのひょじ部分を示した画像

 

盤面を表示する関数のソースコードです。othello_alpha.pyに以下のコードを追記します。

import numpy as np
import random
import sys

class CommonFunc:
    # 省略

class Player(CommonFunc):
    # 省略

class Computer(CommonFunc):
    # 省略

def printHeader():
    alpha = ["a", "b", "c", "d", "e", "f", "g", "h"]
    print("")
    print("   ", end="")
    for i in alpha:
        print("   {0} ".format(i), end="")
    pass

def printField():
    printHeader()
    print("")
    print("   +" + "----+"*8)
    for i in range(field.shape[0]):
        row = i + 1
        print(" {0} |".format(row), end="")
        for j in range(field.shape[1]):
            if(field[i, j] == 0):
                print("    ", end="")
            elif(field[i, j] == 1):
                print(" ○ ", end="")
            elif(field[i, j] == 2):
                print(" ● ", end="")
            print("|", end="")
        print("")
        print("   +" + "----+"*8)
    pass

# 以下省略

 

コードの解説

14行目~20行目の「printHeader」は、アドレスのアルファベットを表示する関数です。print関数を使って微調整しています。

 

22行目~40行目の「printField」は、盤面を表示する関数です。

23行目の「printHeader()」は、アドレスのアルファベットを表示する関数です。

26行目の「for文」では、1行ずつ盤面を表示します。

29行目の「for文」では、列を選択しています。

30、32、34行目の「if文」では、空白か黒石か白石かを判別しています。

 

 

スポンサードサーチ


その他の表示

その他の表示関数は、「コマンドを表示する関数」、「先手後手を決める関数」、「結果を表示する関数」です。

 

コマンドを表示する関数」は、アドレス(棋譜)の選択方法などを表示する関数です。

先手後手を決める関数」は、プレイヤーとコンピュータの先手後手を決めるための関数です。

結果を表示する関数」は、盤面の黒石と白石を数えて先手と後手どちらが勝ったか、または引き分けかを表示する関数です。

 

その他の表示関数のソースコードです。othello_alpha.pyに以下のコードを追記します。

# 上記省略

def printField():
    # 省略

def printCmd():
    print(" 黒駒:○")
    print(" 白駒:●")
    print(" マスの指定の仕方(例): a1, g8")
    print(" アルファベット、数字の順で指定")

def setStone():
    print("先攻と後攻どちらにしますか?")
    print("先攻:1")
    print("後攻:2")
    turn = input("数字を入力してください:")
    if(turn == "1"):
        playerStone = 1
        computerStone = 2
        Turn = playerStone
    elif(turn == "2"):
        playerStone = 2
        computerStone = 1
        Turn = computerStone
    else:
        print("終了します。")
        sys.exit()
    return playerStone, computerStone, Turn

def confResult():
    ps = len(list(zip(*np.where(field == playerStone))))
    cs = len(list(zip(*np.where(field == computerStone))))
    if(ps > cs):
        return 'Winner : You'
    elif(ps < cs):
        return 'Winner : Computer'
    else:
        return 'Result : Draw'

# global 変数
global playerStone
global computerStone
global Turn

# 以下省略

 

コードの解説

6行目~10行目の「printCmd」は、アドレス(棋譜)の選択方法などを表示する関数です。見て分かる通り、4行分の表示を行っています。

 

12行目~28行目の「setStone」は、先手後手を決めるための関数です。

17、22、25行目の「if文」は、プレイヤーによって選択された数字を判別します。

プレイヤーの石(playerStone)とコンピュータの石(computerStone)と手番(Turn)を返却します。

 

30行目~38行目の「confResult」は、結果を表示する関数です。

31、32行目では、プレイヤーの石とコンピュータの石の数を数えています。

33、35、37行目の「if文」では、石の多少によって結果を返却します。

 

41行目の「playerStone」は、プレイヤーの石(数字)を代入するためのグローバル変数です。

42行目の「computerStone」は、コンピュータの石(数字)を代入するためのグローバル変数です。

43行目の「Turn」は、手番(数字)を代入するためのグローバル変数です。

 

 

動作確認

今回作成した、関数の動作確認を行います。コマンドプロンプトを開きothello_alpha.pyを保存したフォルダまで移動します。移動後はそのフォルダでインタプリタを起動させます。

 

インタプリタを起動させたら、othello_alpha.pyからprintField、printCmd、setStone()、confResult、をインポートします。また、othello_alpha.py自身もインポートします。

>>> import othello_alpha
>>> from othello_alpha import printField, printCmd, setStone, confResult
>>>

 

printField関数を実行します。以下のように表示されれば、正しい動作です。

>>> printField()

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

 

printCmd関数を実行します。以下のように表示されれば、正しい動作です。

>>> printCmd()
 黒駒:○
 白駒:●
 マスの指定の仕方(例): a1, g8
 アルファベット、数字の順で指定
>>>

 

setStone関数を実行します。1か2の数字を入力します。以下のように表示されれば、正しい動作です。

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

 

グローバル変数に数字を代入して、confResult関数を実行します。本来ならば、プレイヤーとコンピュータの両者が、どのマスにも石を置くことができなければ、実行します。以下のように表示されれば、正しい動作です。

>>> othello_alpha.playerStone = 1
>>> othello_alpha.computerStone = 2
>>> confResult()
'Result : Draw'
>>>

 

以上で動作確認は完了です。

 

 

スポンサードサーチ


まとめ

今回はオセロの仕組みとは、あまり関係ない関数を開発しました。コマンドプロンプト上で遊ぶことができるオセロを開発しているため、表示関数を作成しました。

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

 

盤面の表示は、オセロの仕組みとは関係ないため分からなくても問題ありません。

 

Part4では、実際にオセロをコマンドプロンプト上で遊ぶためにmain文を作成します。

 

 

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


スポンサードサーチ