Pythonプログラミングで

リバーシを作る

Stage 3 盤面を表すクラスの基本機能を作る

3-2 盤面を表示する機能を実装する

さてここからは盤面を表示する機能を作っていきますよ。board.py ファイルの BoardPrint メソッドをコーディングしていきます。

                        
    def BoardPrint(self, logger=None):
        logger = logger or self.logger
        
        print('\n')
        print('\t    a   b   c   d   e   f   g   h')
        print('\t   -------------------------------')
        for row in range(SIZE):
            print('\t{} |'.format(row + 1), end='')
            for col in range(SIZE):
                if self.board[row][col] == EMPTY:
                    print('   |', end='')
                elif self.board[row][col] == WHITE:
                    print(' ● |', end='')
                elif self.board[row][col] == BLACK:
                    print(' ○ |', end='')
                else:
                    logger.critical('UNEXPECTED PLAYER VALUE in BoardPrint')
                    return False
            print(' {}'.format(row + 1))
            print('\t   -------------------------------')
        print('\t    a   b   c   d   e   f   g   h')
        print('\n')
                        
                    

~~~~~~~~~~~~~~~

引数にはロガーをとります。

                        
    def BoardPrint(self, logger=None):
        logger = logger or self.logger
                        
                    

なんでわざわざロガーなんか引数に入れんの

このメソッドで主に使うロガーを自由に設定できるようにするためです。その意義についてはこちらのサイトで力説されていますので、是非ご覧ください。

ログ出力のための print と import logging はやめてほしい

でもロガーのデフォルトは None じゃん
ロガー設定する気ないじゃん

def 文直下でロガーを設定します。

                        
    def BoardPrint(self, logger=None):
        logger = logger or self.logger
                        
                    

やってることは 3-1 でロガーを設定した時と同じです。わからない方は戻って確認してください。

~~~~~~~~~~~~~~~

メソッドのゴタゴタした設定も終わったことですし、そろそろ本題の「盤面表示」に入りましょう。

                        
        print('\n')
        print('\t    a   b   c   d   e   f   g   h')
        print('\t   -------------------------------')
        for row in range(SIZE):
            print('\t{} |'.format(row + 1), end='')
            for col in range(SIZE):
                if self.board[row][col] == EMPTY:
                    print('   |', end='')
                elif self.board[row][col] == WHITE:
                    print(' ● |', end='')
                elif self.board[row][col] == BLACK:
                    print(' ○ |', end='')
                else:
                    logger.critical('UNEXPECTED PLAYER VALUE in BoardPrint')
                    return False
            print(' {}'.format(row + 1))
            print('\t   -------------------------------')
        print('\t    a   b   c   d   e   f   g   h')
        print('\n')
                        
                    

コードと一緒に完成図もご覧になっていただきましょうか。

UNAVAILABLE

黒の背景に白の文字なので中抜きを黒にしていますが、これは実行環境によって変えてください。まあ実際のところ変えなくてもさして支障がないようには作ってありますが。

じゃあ白黒変える必要ないじゃん

一応ルール的には黒の石を右上と左下、白を左上と右下に置くことになっていますので、できればそれに合わせるのがいいでしょう。

~~~~~~~~~~~~~~~

それではコーディングに入ります。まず最初に改行して盤面を見やすくしてあげます。

                        
        print('\n')
        print('\t    a   b   c   d   e   f   g   h')
        print('\t   -------------------------------')
        for row in range(SIZE):
            ...
                        
                    

すぐに column を表すアルファベットを振り、盤面の端となる線を入れていきます。

                        
        print('\n')
        print('\t    a   b   c   d   e   f   g   h')
        print('\t   -------------------------------')
        for row in range(SIZE):
            ...
                        
                    

左端にタブ文字入ってんのか ...?

よく気づきました。冒頭の開業と同じように、これも盤面を見やすくするために入れています。

~~~~~~~~~~~~~~~

ここからは各 row ごとに作業していきます。for ループで回していきましょう。

                        
        for row in range(SIZE):
            print('\t{} |'.format(row + 1), end='')
            for col in range(SIZE):
                if self.board[row][col] == EMPTY:
                    print('   |', end='')
                elif self.board[row][col] == WHITE:
                    print(' ● |', end='')
                elif self.board[row][col] == BLACK:
                    print(' ○ |', end='')
                else:
                    logger.critical('UNEXPECTED PLAYER VALUE in BoardPrint')
                    return False
            print(' {}'.format(row + 1))
            print('\t   -------------------------------')
                        
                    

ループの中身、まずは row を表す数字を入れます。

                        
        for row in range(SIZE):
            print('\t{} |'.format(row + 1), end='')
            for col in range(SIZE):
                ...
                        
                    

row は 0 から始まるインデックスの値なので、画面に表示するときは 1 スタートになるよう 1 を加えてあげてください。

また、print はデフォルトで改行します。このあとは後ろにマスをつなげていくので、end='' を入れて改行しないようにしてあげましょう。

~~~~~~~~~~~~~~~

ここから先は、同じ row の中でさらに column ごとに作業します。こちらも for ループです。

                        
            for col in range(SIZE):
                if self.board[row][col] == EMPTY:
                    print('   |', end='')
                elif self.board[row][col] == WHITE:
                    print(' ● |', end='')
                elif self.board[row][col] == BLACK:
                    print(' ○ |', end='')
                else:
                    logger.critical('UNEXPECTED PLAYER VALUE in BoardPrint')
                    return False
                        
                    

board[row][col] の値によって表示するものを変えます。

EMPTY のときはいいとして、白と黒でなんで石の色逆にしてんの?

これ見ればわかるでしょ?

UNAVAILABLE

ああ、さっき見たな

さっきも申し上げましたが、背景が黒いから中抜きを黒にしているんです。この色はご自分の実行環境に合わせて調節してください。

~~~~~~~~~~~~~~~

column を全て廻りきったら、盤面右端の row 番号を入れて改行、マスを区切る横線を入れてください。

                        
        for row in range(SIZE):
            print('\t{} |'.format(row + 1), end='')
            for col in range(SIZE):
                ...
            print(' {}'.format(row + 1))
            print('\t   -------------------------------')
                        
                    

相変わらず row 番号は

row + 1

です。

row を回る for ループも抜けたら column 番号を盤面下にふって、改行してスペーシングしてください。

                        
        print('\t    a   b   c   d   e   f   g   h')
        print('\n')
                        
                    

これにて盤面表示の機能は実装完了です。お疲れ様でした。

NEXT Stage 4 石をおけるか判別する機能を実装する