Pythonプログラミングで

2048を作る

Stage 5 ゲーム終了を判定する

5-1 ゲームクリアを判定する

いや、あの難解な Stage 4 を潜り抜けてきた皆さんならこんなもの説明不要だとは思うのですが、体裁としてやらないわけには行かないので少しばかりお付き合い願います。

またまたぁ、どうせめんどくさいんでしょ?

とりあえずコードをご覧に入れましょうか。board.py ファイルの isGoal メソッドです。

                        
    def isGoal(self, *, logger=None):
        logger = logger or self.logger
        for row in range(self.size):
            for col in range(self.size):
                if self.board[row][col] >= self.goal:
                    logger.info('{} is goaled'.format([row, col]))
                    return True
        # there is no goaled square
        return False
                        
                    

あっ...楽だわ

ほら言った。

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

このメソッドでは目標とする数字に到達しているかを見ています。デフォルトなら 2048 が出た瞬間にゲームクリアになりますが、そのクリアを判定する機能です。

でもまたゴールを変えるとか言い出すんだろ?

その通りですね。ゴールの値はコンストラクタで self.goal に代入していますので、それに従います。

ではコードに入ります。

要は全部マスを見てその中に goal

以上

の数があればいいんですよね。

「以上」じゃないとダメなん?

例えば self.goal == 2048 であれば「2048 を作れたらゲームクリア」って意味じゃないですか。

イコールつけないと 2048 出てきてもクリアにならんのな

その通りです。

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

ではコードを実際に見てみましょう。まずは 4-2 でやったようにロガーを設定します。

                        
    def isGoal(self, *, logger=None):
        logger = logger or self.logger
        for row in range(self.size):
            for col in range(self.size):
            ...
                        
                    

あとは 2 重の for ループで全てのマスを回って、goal しているのがあれば「ゴール到達」True をリターンします。

                        
        for row in range(self.size):
            for col in range(self.size):
                if self.board[row][col] >= self.goal:
                    logger.info('{} is goaled'.format([row, col]))
                    return True
                        
                    

どこがゴールしたかログで教えてあげるのがいいですね。

どこにも goal しているのがなければ「ゴール未達」False をリターンする。

                        
        # there is no goaled square
        return False
                        
                    

こんなに簡単なことがあるでしょうか。

ムカつく言い回しやな

だってホントのことだもん。

NEXT 5-2 手詰まりを判定する