【初心者向け】Pythonでブロック崩しゲームを簡単に作ってみた(Turtle)

【初心者向け】Pythonでブロック崩しゲームを簡単に作ってみた(Turtle) プログラミング

Turtleモジュールは、シンプルな命令を組み合わせて、様々な図形や絵を描くことができます。また、色を変えたり、線の太さを調整したりすることも可能です。ブロック崩しゲームでは、このTurtleモジュールを使って、パドル、ボール、ブロック、スコアボードなどのゲーム要素を画面上に表示し、動かしています。各要素がTurtleオブジェクトとして作成され、その動きや相互作用がプログラムによって制御されているのです。


Turtleの特徴である直感的な操作と即時のビジュアルフィードバックは、プログラミング初心者がコードと結果の関係を理解するのに役立ちます。そのため、プログラミングの基礎を学ぶ段階で特に有用なツールとなっています。

完成イメージ

ブロック崩しゲームでは、パドル、ボール、ブロック、スコアの各要素を表示し、衝突時の画面更新やボールの軌道の変更などを制御しています。すべてのブロックが消えるとゲームクリアで、パドルより下にボールが行ってしまうとゲームオーバーになります。

ファイル構成

main.py
ball.py
block.py
paddle.py
scoreboard.py
  • main.py: これはプログラムのメインファイルです。ゲームの実行やその他のモジュールの呼び出しを行う中心的な役割を果たします。
  • ball.py: ボールの初期設定や進行方向、移動アクションなどのクラスを定義したファイルです。
  • block.py: ブロックの設定を行うクラス、位置や色、衝突時の非表示メソッドなどを定義しています。
  • paddle.py: パドルを設定するクラス、初期設定や左右の移動、ボールの進行方向変更のメソッドを定義しています。
  • scoreboard.py: スコア全般を定義したクラス、ブロック衝突に伴う点数の追加やゲームクリア、オーバーの表示を行います。

以下で各ファイルについて、解説しています。

メイン処理(main.py)

main.pyファイルの内容を詳しく解説いたします。

コード全体

from turtle import Screen
from paddle import Paddle
from ball import Ball
from block import BlockManager
from scoreboard import ScoreBoard
import time

# スクリーン作成/初期設定
screen=Screen()
screen.setup(width=800,height=600)
screen.title("Block game")
screen.bgcolor("black")
screen.tracer(0)

# オブジェクト
paddle=Paddle()
ball=Ball()
scoreboard=ScoreBoard()
block=BlockManager()

screen.listen()
screen.onkey(paddle.left,"Left")
screen.onkey(paddle.right,"Right")

game_is_on = True
while game_is_on:
    screen.update()
    time.sleep(0.02)

    ball.move()
    
    # ブロックとの衝突判定
    if block.collision_check(ball):
        scoreboard.update_point()
    
    # パドルとの衝突判定
    paddle.collision_check(ball)
    
    # 壁への衝突判定
    if ball.xcor()<-380 or ball.xcor()>380:
        ball.head=180-ball.head
    
    if ball.ycor()>280:
        ball.head=360-ball.head
    
    # 下の壁との衝突判定
    if ball.ycor()<-280:
        scoreboard.game_over()
        
    # ブロック数が0になったら終了
    if len(block.blocks)==0:
        scoreboard.win()
    
    screen.onkey(ball.restart,"Up")
    
screen.exitonclick()

解説

  1. モジュールのインポート

from turtle import Screen
from paddle import Paddle
from ball import Ball
from block import BlockManager
from scoreboard import ScoreBoard
import time

ここでは、必要なモジュールとクラスをインポートしています。turtleモジュールからはScreenクラスのみをインポートし、他のゲーム要素(パドル、ボール、ブロック、スコアボード)は別ファイルから独自のクラスとしてインポートしています。

  1. スクリーンの設定
screen = Screen()
screen.setup(width=800, height=600)
screen.title("Block game")
screen.bgcolor("black")
screen.tracer(0)

ゲームウィンドウの設定を行っています。幅800ピクセル、高さ600ピクセルのウィンドウを作成し、タイトルを設定し、背景色を黒に設定しています。tracer(0)は画面の自動更新を無効にします。

  1. ゲームオブジェクトの作成
paddle = Paddle()
ball = Ball()
scoreboard = ScoreBoard()
block = BlockManager()

ゲームに必要な各オブジェクト(パドル、ボール、スコアボード、ブロック管理)のインスタンスを作成しています。

  1. キー入力の設定
screen.listen()
screen.onkey(paddle.left, "Left")
screen.onkey(paddle.right, "Right")

キーボード入力を受け付けるように設定し、左右矢印キーでパドルを動かせるようにしています。

  1. メインゲームループ
game_is_on = True
while game_is_on:
    screen.update()
    time.sleep(0.02)

    ball.move()
    # 以下、衝突判定や状態更新のコード

ゲームのメインループです。画面を更新し、短い待機時間を入れてからボールを動かし、各種衝突判定を行います。

  • ブロックとの衝突判定
  • パドルとの衝突判定
  • 壁との衝突判定
  • ゲームオーバーやクリア条件のチェック
  1. ゲーム終了
screen.exitonclick()

クリックされたらゲームウィンドウを閉じます。

このコードは、ゲームの全体的な流れを制御し、各コンポーネント(パドル、ボール、ブロック、スコアボード)を統合してゲームを機能させています。初心者の方にとっては、このファイルを理解することで、ゲームの構造と動作の概要を把握できるでしょう。

ボール(ball.py)

ball.py の解説です

コード全体

from turtle import Turtle
import random

# ボール
class Ball(Turtle):
    
    # タートルスーパークラス継承
    def __init__(self):
        super().__init__()
        self.head=random.randint(1,180)
        self.restart()
    
    # サイズ・色・スタート位置の初期設定
    def restart(self):
        self.shape('circle')
        self.shapesize(1,1)
        self.head=random.randint(1,180)
        self.setheading(self.head)
        self.color('blue')
        self.penup()
        self.goto(0,-265)
    
    # ボールの角度・スピード設定
    def move(self):
        self.setheading(self.head)
        self.forward(5)

解説

  1. クラスの定義
class Ball(Turtle):

Ball クラスは Turtle クラスを継承しています。これにより、Turtle の機能を利用しつつ、ボール特有の動作を追加できます。

  1. コンストラクタ (__init__ メソッド)
def __init__(self):
    super().__init__()
    self.head = random.randint(1, 180)
    self.restart()
  • super().__init__() で親クラス(Turtle)のコンストラクタを呼び出します。
  • self.head にランダムな角度(1〜180度)を設定します。
  • self.restart() メソッドを呼び出して、ボールの初期設定を行います。
  1. restart メソッド
def restart(self):
    # ボールの形状、サイズ、色、位置などを設定

このメソッドはボールの初期状態を設定します。ゲーム開始時や再スタート時に呼び出されます。

  1. move メソッド
def move(self):
    self.setheading(self.head)
    self.forward(5)

ボールを現在の方向(self.head)に5単位分移動させます。壁やパドル、ブロックとの衝突によって、ボールの進行方向(self.head)が変わるようにmain.pyで定義しています。

ブロック(block.py)

コード全体

from turtle import Turtle

block_y=[90,120,150,180,210,240]
block_x=[-375,-300,-225,-150,-75,0,300,225,150,75,375]
block_color=["yellow","yellow","orange","orange","red", "red"]

# ブロック
class BlockManager():
    
    # タートルスーパークラス継承
    def __init__(self):
        self.blocks=[]
        self.block_create()
    
    # ブロックの配置
    def block_create(self):
        color_num=0
        for y in block_y:
            color=block_color[color_num]
            for x in block_x:
                new_block=Turtle()
                new_block.shape("square")
                new_block.shapesize(1,3)
                new_block.color(color)
                new_block.penup()
                new_block.goto(x,y)      
                self.blocks.append(new_block)
            color_num+=1
    
    # ブロックとボールが衝突した際の削除
    def collision_check(self,ball):
        for block in self.blocks[:]:
            if block.distance(ball)<30:
               block.hideturtle()
               self.blocks.remove(block)
               print("collision")
               ball.head=360-ball.head
               
               return True
        return False

解説

  1. グローバル変数
block_y = [90, 120, 150, 180, 210, 240]
block_x = [-375, -300, -225, -150, -75, 0, 300, 225, 150, 75, 375]
block_color = ["yellow", "yellow", "orange", "orange", "red", "red"]

ブロックの配置位置と色を定義しています。

  1. BlockManager クラス
class BlockManager():

このクラスはブロック全体の管理を担当します。

  1. コンストラクタ
def __init__(self):
    self.blocks = []
    self.block_create()

空のブロックリストを作成し、block_create メソッドを呼び出してブロックを配置します。

  1. block_create メソッド
def block_create(self):
    # ブロックを作成し、配置する

定義された位置と色に基づいてブロックを作成し、self.blocks リストに追加します。

  1. collision_check メソッド
def collision_check(self, ball):
    # ボールとブロックの衝突を確認し、衝突時の処理を行う

ボールとブロックの衝突を1ブロックずつ繰り返し確認し、衝突した場合はブロックを非表示にし配列からも削除し、ボールの方向を変更します。
main.pyファイルから繰り返し呼び出され、ボールとブロックが衝突しているか判定されるメソッドです。

パドル(paddle.py)

paddle.py の解説です

コード全体

from turtle import Turtle

# パドル
class Paddle(Turtle):
    
    # タートルスーパークラス継承
    def __init__(self):
        super().__init__()
        self.restart()
    
    # スタート位置・サイズ・色の初期設定
    def restart(self):
        self.shape('square')
        self.shapesize(0.7,4)
        self.setheading(0)
        self.color('white')
        self.penup()
        self.goto(0,-280)
        
    # 移動方法(左)
    def left(self):
        self.forward(-40)
    
    # 移動方法(右)
    def right(self):
        self.forward(40)
        
    def collision_check(self,ball):
        if self.distance(ball)<30:
            ball.head=360-ball.head

解説

  1. Paddle クラスの定義
class Paddle(Turtle):

Paddle クラスは Turtle クラスを継承しています。これにより、Turtleの描画機能を利用してパドルを表現できます。

  1. コンストラクタ
def __init__(self):
    super().__init__()
    self.restart()

super().__init__() で親クラス(Turtle)のコンストラクタを呼び出し、self.restart() でパドルの初期設定を行います。

  1. restart メソッド
def restart(self):
    # パドルの形状、サイズ、色、位置を設定

このメソッドはパドルの初期状態を設定します。四角形の形状で、白色、画面下部中央に配置されます。

移動メソッド

def left(self):
    self.forward(-40)

def right(self):
    self.forward(40)

これらのメソッドでパドルを左右に移動させます。forward メソッドは Turtle クラスから継承したもので、現在の向きに対して指定した距離だけ移動します。
main.pyファイルのscreen.onkey(paddle.left,”Left”)でキー入力のイベントを受け付けるようにしています。

  1. 衝突判定メソッド
def collision_check(self, ball):
    if self.distance(ball) < 30:
        ball.head = 360 - ball.head

ボールとパドルの距離が30未満の場合に衝突したと判断し、ボールの進行方向を反転させます。

スコア(scoreboard.py)

scoreboard.py の解説です

コード全体

from turtle import Turtle
FONT = ("Courier", 24, "normal")
  
# スコアボード
class ScoreBoard(Turtle):
    # タートルスーパークラス継承
    # サイズ・色・スタート位置の初期設定
    def __init__(self):
        super().__init__()
        self.color('white')
        self.penup()
        self.goto(350,260)
        self.hideturtle()
        self.user_point=0
        self.display()

    def display(self):
        self.write(f'Score  : {self.user_point}',align="right",font=("Arial", 18, "normal"))

    # 点数追加
    def update_point(self):
        self.user_point+=1
        self.clear()
        self.display()
        
    def win(self):
        self.goto(0,0)
        self.write(f'YOU WIN',align="center",font=FONT)
    
    def game_over(self):
        self.goto(0,0)
        self.write(f'YOU LOSE',align="center",font=FONT)
            
  1. ScoreBoard クラスの定義
class ScoreBoard(Turtle):
class ScoreBoard(Turtle):

ScoreBoard クラスも Turtle クラスを継承しています。

  1. コンストラクタ
def __init__(self):
    super().__init__()
    # スコアボードの初期設定

スコアボードの色、位置、初期スコアを設定し、display メソッドを呼び出してスコアを表示します。

  1. display メソッド
def display(self):
    self.write(f'Score  : {self.user_point}', align="right", font=("Arial", 18, "normal"))

現在のスコアを画面に表示します。

  1. update_point メソッド
def update_point(self):
    self.user_point += 1
    self.clear()
    self.display()

スコアを1点増やし、表示を更新します。

  1. wingame_over メソッド
def win(self):
    # 勝利メッセージを表示

def game_over(self):
    # ゲームオーバーメッセージを表示

初心者の方にとっては、これらのクラスの構造と役割を理解することで、オブジェクト指向プログラミングの実践的な応用例を学ぶことができます。

また、Turtleモジュールの様々な機能(形状の設定、色の変更、位置の移動など)が効果的に使用されている点も、グラフィカルなプログラミングの良い学習例となっています。

まとめ

今回の記事ではPythonのTurtleモジュールを使ったブロック崩しゲームの作り方について、解説しました。実務で使用するケースは少ないと思いますが、グラフィカルな画面を作る中で、Pythonの基礎構文、クラス、メソッド、条件分岐、ループ処理などを身につけることができますので、チャレンジしてみてください。

タイトルとURLをコピーしました