Pythonプログラミングで

2048を作る

Stage 6 ゲーム進行を実装する

6-3 ゲーム進行を実装する

さあ、最後のチャプターです。

長かった...

あともう一踏ん張りですよ。

                        
if __name__ == "__main__":
    startmenu()
    main_board = board.Board(size=parameters['size'], goal=parameters['goal'])
    main_board.print()

    while True:
        input_d = input('DIRECTION: UP-1, DOWN-2, LEFT-3, RIGHT-4 : ')
        logger.debug('input_d = {}'.format(input_d))
        if input_d in ['1', 'w', 'W']:
            direction = UP
        elif input_d in ['2', 's', 'S']:
            direction = DOWN
        elif input_d in ['3', 'a', 'A']:
            direction = LEFT
        elif input_d in ['4', 'd', 'D']:
            direction = RIGHT
        else:
            print('INVALID INPUT')
            continue
        if main_board.move(direction) == FAILED:
            print('INVALID DIRECTION')
            continue
        if main_board.insert() == FAILED or main_board.isOver():
            main_board.print()
            print('GAME OVER...')
            break
        if main_board.isGoal() == True:
            main_board.print()
            print('You WIN!')
            break
        main_board.print()
        

    logger.info('end')
                        
                    

まだ長かった...

そんな、あとわずかじゃないですか。

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

最初に 6-2 で実装した startmenu を実行します。

                        
if __name__ == "__main__":
    startmenu()
    main_board = board.Board(size=parameters['size'], goal=parameters['goal'])
    main_board.print()
                        
                    

この関数の中で初期設定の変更も済ませられるので、サイズやゴールは parameters をそのまま使って構いません。早速盤面のインスタンスを宣言しましょう。

                        
if __name__ == "__main__":
    startmenu()
    main_board = board.Board(size=parameters['size'], goal=parameters['goal'])
    main_board.print()
                        
                    

インスタンスを宣言したらまずは盤面を表示します。どこにどんな数字があるかもわからないのに「早く動かせ」って言われてもしょうがないでしょ?

もしスタート画面で下手に設定を弄らなければ、画面全体はこの時点でこのようになっています。

UNAVAILABLE

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

さて、ここからは while ループでゴールするかゲームオーバーになるまで同じことを繰り返し続けます。

まずはプレーヤーに盤面を動かす方向を指示してもらいましょう。

                        
    while True:
        input_d = input('DIRECTION: UP-1, DOWN-2, LEFT-3, RIGHT-4 : ')
        logger.debug('input_d = {}'.format(input_d))
                        
                    

無難に 1 ~ 4 の数字で聞いていますが、裏コマンドとして W/S/D/A のキーでも扱えるようにしています。左手の矢印キー機能ですね。

UNAVAILABLE

各方向で場合わけして direction を決めていきます。

                        
        if input_d in ['1', 'w', 'W']:
            direction = UP
        elif input_d in ['2', 's', 'S']:
            direction = DOWN
        elif input_d in ['3', 'a', 'A']:
            direction = LEFT
        elif input_d in ['4', 'd', 'D']:
            direction = RIGHT
        else:
            print('INVALID INPUT')
            continue
                        
                    

正規外の入力があったら

無理だっつってんだろうが、アァ?

と毅然とした態度でつっぱねてください。

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

次いで、入力してもらった方向に move メソッドを発動します。

                        
        if main_board.move(direction) == FAILED:
            print('INVALID DIRECTION')
            continue
                        
                    

FAILED「失敗」したらその向きには盤面を動かせないわけですから、「入力がやっぱりおかしい」と言ってつっぱねてあげましょう。while ループを continue してください。

これでちゃんと move 発動しとるんか?

してますよ。if 文の条件を確認する時に move の返り値をみているわけですが、返り値を得るには必ず move を実行しなければいけませんから。

新しい数を入れられなかったり、ゲームオーバーが確定していたら、盤面を表示して「ゲームオーバーです」と言って while ループを抜けます。

                        
        if main_board.insert() == FAILED or main_board.isOver():
            main_board.print()
            print('GAME OVER...')
            break
                        
                    

またゴールしていたら「ゲームクリア」ということで盤面を表示してプレーヤーをたたえてあげましょう。こちらも break してください。

                        
        if main_board.isGoal() == True:
            main_board.print()
            print('You WIN!')
            break
                        
                    

最後まで残った場合には、まだ新しい盤面が見えていないので、しっかり盤面を見せてから while ループの先頭に戻してあげます。

                        
        if main_board.isGoal() == True:
            main_board.print()
            print('You WIN!')
            break
        main_board.print()
                        
                    

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

さあ、これでコーディングは全て終了しました。みなさま、長らくお疲れ様でした。

疲れた...

ぜひご自分で遊んでみて、ご友人にも遊ばせてみて、今後のコーディングのモチベーションとしていただければと思います。

この解説の中で矛盾や不明瞭な点、誤植などがございましたら、フッター(ページ最下部)からご連絡ください。