Pythonプログラミングで

2048を作る

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

3-4 盤面を表示する

おつぎは print メソッドです。文字通り盤面を表示する機能になります。とりあえずどのような形になるかご覧いただきましょうかね。

UNAVAILABLE

しょっぼ

コードはこんなんです。

                        
    def print(self):
        print('\n-', end='')
        for row in range(self.size):
            print('--------', end='')
        print('')   # to a new line
        for row in range(self.size):
            print('|', end='')
            for col in range(self.size):
                if self.board[row][col] == EMPTY:
                    print('       |', end='')
                else:
                    print(' {} '.format(self.board[row][col]).center(7) + '|', end='')
            print('\n-', end='')  # to new line
            for col in range(self.size):
                print('--------', end='')
            print('')  # to a new line
        print('')   # to a new line
        return SUCCEEDED
                        
                    

なっが

おたくのいう「ショボい」グラフィックスをきれいにするともっと長くなりますよ。それでは早速取り掛かりましょう。

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

まず他の行と分けて見やすくするため最初は改行を入れます。

                        
    def print(self):
        print('\n-', end='')
                        
                    

改行文字の隣のハイフンは何なん?

盤面の内外を仕切る横線です。これは盤面のサイズによって長さが変わるようにしなければいけません。例えば 6 × 6 マスになったらこんな感じに。

UNAVAILABLE

この長さを調節するために最初の 1 個だけを入れたものです。

じゃあ残りの大量のハイフンはどうやってコーディングするんだよ

盤面の大きさ self.size に合わせて for 文で後ろにハイフンをつないでいく形になります。

                        
        for row in range(self.size):
            print('--------', end='')
                        
                    

print は文末改行がデフォルトですから、必ず end='' をつけてくださいね。最後まで終わったら print('') でただただ改行するだけ。

                        
        for row in range(self.size):
            print('--------', end='')
        print('')   # to a new line 
                        
                    

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

ここからは board のマスごとの作業をするつもりで進めていきます。まず最初に row を、その中に column を、という 2 重の for ループ構造にします。

                        
        for row in range(self.size): 
            print('|', end='')
            for col in range(self.size): 
                if self.board[row][col] == EMPTY:
                ...
                        
                    

各 row のはじめに、盤面の内外を隔てる縦の仕切りを入れます。

                        
        for row in range(self.size):
            print('|', end='') 
            for col in range(self.size):
                        
                    

この時も end=''をお忘れなきよう。というか、ここから先は大体改行しませんので、書くクセをつけてしまってください。

column のループに入ったら、マスに入っている数字で場合わけします。

                        
            for col in range(self.size):
                if self.board[row][col] == EMPTY:
                    print('       |', end='')
                else:
                    print(' {} '.format(self.board[row][col]).center(7) + '|', end='') 
                print('\n-', end='')  # to new line
                        
                    

上の写真でお見せしましたけれども、EMPTY のマスには何も入れません。

空白入れろってことやろ

右端の縦線はマスとマスを区切る仕切りになります。

一方 board[col][row] の値が EMPTY ではない場合、その数字を具体的に表示しなければなりません。ただ、マスの端っこに申し訳なさそうにおいておくのではなくて、堂々とマスの中央に数字を書きたいじゃないですか。なので center メソッドを使ってあげてください。

                        
                else:
                    print(' {} '.format(self.board[row][col]).center(7) + '|', end='')
                        
                    

ここでの空白などの文字数は上のコードをコピペするのでもいいのですが、実際にご自分で「これくらいだろ」と数字を入れてみて、サイズが合わなかったら調節する、そんな実験的アプローチがいいと思います。

え〜、めんどくさ

そもそも何もないところからコーディングするときはそうしますからね。

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

column ごとの for ループが終了したら、あとは上のマスと下のマスの間の仕切りとなる横棒を入れてあげておしまいです。

                        
                else:
                    print(' {} '.format(self.board[row][col]).center(7) + '|', end='')
            print('\n-', end='')  # to new line
            for col in range(self.size):
                print('--------', end='')
            print('')  # to a new line
                        
                    

冒頭でやったように board.size に合わせて長さを変えてください。改行して row のループを抜け、そして全て表示し終わったら最後にもう一度改行しましょう。

                        
            for col in range(self.size):
                print('--------', end='')
            print('')  # to a new line
        print('')   # to a new line
        return SUCCEEDED
                        
                    

これ以降に入ってくる文字列と盤面の間隔を開けるためです。

全部終わったら「表示成功」SUCCEEDED をリターンしてください。いや、別にリターン値使うことないからなんでもいいんですが。

じゃあリターンする必要ねーじゃん

まあそうですね。おっしゃる通りです。

NEXT Stage 4 盤面を動かす