はじめに
プログラミングの基礎を学びたいと思う初心者の皆さん、または、すでに何らかのプログラミング言語に触れたことがある方でも、新たにPythonを学びたいと考えている方々に向けて、この記事は役立つ内容となっています。
テーマは「Pythonでテトリスを作る」です。
テトリスは、世界中で親しまれているパズルゲームですので、その作り方を学ぶことでプログラミングの楽しさや、その構造を理解することができます。
●Pythonとは
Pythonは、初心者から研究者、大規模システムを開発するプロフェッショナルまで幅広いユーザーに選ばれているプログラミング言語です。
○Pythonの特徴
Pythonの特徴としては次のようなものがあります。
①シンプルで読みやすい構文
Pythonのコードは、他の多くのプログラミング言語に比べて非常に読みやすいです。
これは、Pythonが「人間のためのプログラミング言語」を目指して設計されたからです。
②多機能な標準ライブラリ
Pythonには、ファイル操作からウェブスクレイピング、数学計算まで、様々なタスクをこなすためのライブラリが標準で提供されています。
③広範なコミュニティと豊富なサードパーティライブラリ
Pythonは広大なコミュニティに支えられており、その結果、あらゆる種類の問題を解決するためのサードパーティライブラリが存在します。
○Pythonのインストール方法
Pythonをインストールするには、公式ウェブサイトからダウンロードするのが一番簡単です。
ウェブサイトにアクセスして、自分のPCのOSに合ったバージョンを選択し、インストーラをダウンロードして実行します。
インストールが完了したら、コマンドプロンプト(Windows)またはターミナル(Mac)を開き、「python –version」と入力してインストールが正しく行われたかを確認します。
●テトリスとは
テトリスは、さまざまな形の「テトリミノ」と呼ばれるブロックを操作して、画面に積み上げるパズルゲームです。
プレイヤーの目標は、テトリミノを操作して、画面の一列をブロックで埋めることです。一列全体がブロックで埋まるとその列は消え、プレイヤーにポイントが加算されます。
●Pythonでテトリスを作る前に理解すべき基礎
Pythonでテトリスを作る前に、いくつかの基本的なプログラミングの概念を理解しておく必要があります。
○変数とデータ型
Pythonでは、情報を保存するために変数を使用します。
例えば、「score = 0」は、ゼロを「score」という名前の変数に割り当てています。
ここで「0」は整数型(int)のデータです。他にも、文字列型(str)、リスト型(list)、ブール型(bool)などのデータ型があります。
○条件分岐とループ
条件分岐(if文)とループ(for文、while文)は、プログラムの流れを制御する基本的な構造です。
if文はある条件が真か偽かに基づいて処理を分岐します。
for文やwhile文は指定された条件が満たされる限り処理を繰り返します。
○関数とオブジェクト指向
関数は特定の処理をまとめたもので、何度も同じ処理を書く代わりに、一度定義した関数を呼び出して使うことができます。
また、Pythonはオブジェクト指向プログラミング言語であり、データとそのデータを操作するためのメソッド(関数)を一緒にした「オブジェクト」を作ることができます。
以上の概念は、テトリスを作る際に基本となる要素です。
それぞれについて理解を深めていきましょう。
●Pythonでテトリスを作る10ステップ
テトリスを作るためには、基本的なゲームのロジックを理解してそれをPythonのコードで表現する必要があります。
それでは、Pythonでテトリスを作るためのステップを紹介します。
○ステップ1:ゲーム画面を作る
まず、ゲーム画面を作るところから始めます。
Pythonには様々なライブラリがありますが、今回はpygameというライブラリを使用します。
このライブラリはゲーム作成に必要な基本的な機能を提供しています。
以下に、pygameを使ってゲーム画面を作るためのコードを紹介します。
このコードでは、ゲーム画面のサイズを設定し、ゲームループを作成しています。
import pygame
# ゲーム画面の大きさ
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
# pygameの初期化
pygame.init()
# 画面の作成
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# ゲームループ
running = True
while running:
# イベント処理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 画面を白で塗りつぶす
screen.fill((255, 255, 255))
# 画面を更新
pygame.display.flip()
pygame.quit()
上記のコードを実行すると、白いゲーム画面が表示されます。
ここでは、ゲーム画面の大きさを設定し、ゲームが終了するまでループを続けています。
また、イベント処理を行うことで、ユーザーの操作に応じた反応を作ることができます。
○ステップ2:テトリミノを定義する
次に、テトリスのゲームに必要なテトリミノを定義します。テトリミノは、さまざまな形状を持つブロックのことを指します。
テトリミノの形状を定義したコードを紹介します。
# テトリミノの形状を定義
tetrominoes = [
[(1, 1, 1, 1)],
[(1, 1), (1, 1)],
[(1, 1, 0), (0, 1, 1)],
[(0, 1, 1), (1, 1)],
[(1, 1, 1), (0, 1, 0)],
[(1, 1, 1), (1)],
[(1, 1, 1, 1), (0, 0, 1, 0), (0, 0, 1, 0), (0, 0, 1, 0)]
]
このコードでは、テトリミノの形状を2次元のリストとして定義しています。
このリストの各要素がテトリミノのブロックを表しており、1がブロックを表し、0が空白を表しています。
○ステップ3:テトリミノを動かす
テトリミノを動かすには、ユーザーの入力を検出し、それに応じてテトリミノの位置を更新するコードを記述する必要があります。
このコードでは、ユーザーがキーボードの矢印キーを押すことで、テトリミノが左右に動くように設定しています。
また、時間の経過に合わせてテトリミノが自動的に下に移動するようにしています。
# 省略...
# テトリミノの初期位置
x, y = 0, 0
# ゲームループ
while running:
# 省略...
# キーボードの入力を検出
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= 1
if keys[pygame.K_RIGHT]:
x += 1
# 時間経過でテトリミノを下に移動
y += 1
# 省略...
上記のコードを実行すると、ユーザーが矢印キーを押すたびにテトリミノが左右に動き、時間の経過とともにテトリミノが下に移動します。
○ステップ4:衝突判定を実装する
テトリスのゲームでは、テトリミノがゲーム画面の端や他のテトリミノと接触した場合に動きを止める必要があります。
これを実現するためには、衝突判定を実装する必要があります。
このコードでは、テトリミノが画面の端を越えないようにし、またテトリミノが他のブロックと重ならないようにしています。
# 省略...
# ブロックの配置を記録する配列
board = [[0] * SCREEN_WIDTH for _ in range(SCREEN_HEIGHT)]
# 衝突判定
def check_collision(x, y, tetromino):
for dx, row in enumerate(tetromino):
for dy, cell in
enumerate(row):
if cell != 0 and (x + dx < 0 or x + dx >= SCREEN_WIDTH or y + dy < 0 or y + dy >= SCREEN_HEIGHT or board[y+dy][x+dx] != 0):
return True
return False
# ゲームループ
while running:
# 省略...
# 衝突判定
if check_collision(x, y, tetrominoes[0]):
x, y = 0, 0 # テトリミノの位置をリセット
# 省略...
このコードを実行すると、テトリミノがゲーム画面の端や他のテトリミノと衝突した場合、テトリミノの位置が初期位置に戻ります。
○ステップ5:行が完成したら消す
テトリスのゲームでは、行が全部埋まったらその行を消すというルールがあります。
# 省略...
# 行が全部埋まったら消す
for y, row in enumerate(board):
if all(cell != 0 for cell in row):
del board[y]
board.insert(0, [0] * SCREEN_WIDTH)
# 省略...
上記のコードを実行すると、行が全て埋まった場合、その行が消えて新たな空行が上に追加されます。
○ステップ6:ゲームオーバー判定
テトリミノが画面の上端まで積み上がった時にゲームを終了する、ゲームオーバー判定のコードを紹介します。
# 省略...
# ゲームオーバー判定
if any(cell != 0 for cell in board[0]):
running = False
# 省略...
このコードを実行すると、テトリミノが画面の一番上に達した時、ゲームが終了します。
○ステップ7:ゲームの進行速度を制御する
次に、ゲームの進行速度を制御するコードを示します。時間の経過とともにテトリミノが落下する速度を増やすことで、ゲームの難易度を上げることができます。
# 省略...
# ゲームの進行速度
speed = 0.5
clock = pygame.time.Clock()
# ゲームループ
while running:
# 省略...
# 時間経過でテトリミノを下に移動
if pygame.time.get_ticks() / 1000 > speed:
y += 1
pygame.time.set_ticks(0)
# 省略...
clock.tick(60)
# 省略...
上記のコードを実行すると、ゲームの進行速度が徐々に上がり、テトリミノが落下する速度が早くなります。
○ステップ8:スコア表示
ゲームの進行とともにスコアを表示する機能も必要です。
行を消すたびにスコアを増やすコードを示します。
# 省略...
# スコア
score = 0
font = pygame.font.Font(None, 36)
# 行が全部埋まったら消す
for y, row in enumerate(board):
if all(cell != 0 for cell in row):
del board[y]
board.insert(0, [0] * SCREEN_WIDTH)
score += 100
# スコア表示
score_text = font.render(f"Score: {score}", True, (0, 0, 0))
screen.blit(score_text, (10, 10))
# 省略...
上記のコードを実行すると、行を消すたびにスコアが100点増え、ゲーム画面の左上にスコアが表示されます。
○ステップ9:次のテトリミノのプレビューを表示
次に出てくるテトリミノをプレビュー表示することも重要な機能の一つです。以下にそのためのコードを示します。
# 省略...
# プレビューテトリミノ
preview_tetromino = random.choice(tetrominoes)
# プレビュー表示
for dx, row in enumerate(preview_tetromino):
for dy, cell in enumerate(row):
if cell != 0:
pygame.draw.rect(screen, (0, 0, 0), pygame.Rect(SCREEN_WIDTH + dx * 30, 100 + dy * 30, 30, 30))
# 省略...
上記のコードを実行すると、次に出てくるテトリミノがゲーム画面の右側にプレビュー表示されます。
○ステップ10:ゲームを再スタートする
ゲームオーバーになった後でも、ユーザーが新しいゲームを始められるようにするには、再スタートの機能を追加する必要があります。
# 省略...
# ゲームオーバー
判定
if any(cell != 0 for cell in board[0]):
running = False
# ゲームオーバー画面
while not running:
screen.fill((255, 255, 255))
game_over_text = font.render("Game Over", True, (0, 0, 0))
screen.blit(game_over_text, (SCREEN_WIDTH // 2 - game_over_text.get_width() // 2, SCREEN_HEIGHT // 2 - game_over_text.get_height() // 2))
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:
board = [[0] * SCREEN_WIDTH for _ in range(SCREEN_HEIGHT)] # ボードをリセット
running = True # ゲームを再開
# 省略...
上記のコードを実行すると、ゲームオーバーになった時に「Game Over」という文字が表示され、Enterキーを押すことで新しいゲームを始めることができます。
●Pythonでテトリスを作る際の注意点
以上のステップで基本的なテトリスのゲームは作成できますが、プログラミング初心者がコードを書く際には注意すべき点がいくつかあります。
- テトリミノの形状や色、動きは自由にカスタマイズできますが、それぞれのテトリミノが正しく動作するように確認する必要があります。
特に衝突判定は、テトリミノが壁や他のテトリミノに衝突したときの挙動を正しく制御するために重要です。 - ゲームの速度はプレイヤーのスキルレベルによって異なるため、固定の値ではなく時間経過によって変化するように設定すると良いでしょう。
- スコア表示やゲームオーバー判定などのゲームの要素も適切に実装することで、ユーザー体験を向上させることができます。
●テトリスのカスタマイズ方法
基本的なテトリスのゲームを作成したら、次にカスタマイズを試みることができます。
それでは、それぞれ噛み砕て簡単に説明していきます。
①テトリミノの色や形状を変える
テトリミノの配列を変更することで新しい形状を作り出すことができます。
また、pygame.draw.rect
関数の第二引数を変更することで色を変更することができます。
②ゲームの難易度を変更する
ゲームの速度を制御するspeed
変数の値を変更することで、ゲームの難易度を調整することができます。
③バックグラウンドミュージックを追加する
pygame.mixer
モジュールを使用して、ゲームに背景音楽を追加することができます。
④スコアリングシステムを改良する
例えば、一度に多くの行を消すと追加ポイントがもらえるようにするなど、スコアリングシステムを更に洗練させることができます。
Pythonでテトリスを作成することは、プログラミングスキルを磨くだけでなく、創造力や問題解決能力を鍛えるのにも役立ちます。
是非このチュートリアルを活用し、自分だけのオリジナルテトリスゲームを作成してみてください。
まとめ
この記事では、初心者でも簡単にPythonでテトリスを作成する方法を10のステップに分けて説明しました。
これにより、Pythonの基本的な使用方法とテトリスのロジックを理解することができます。
また、カスタマイズの方法や注意点についても触れました。
これからもPythonでのプログラミングを続けていき、自分だけのゲームを作る楽しさを体験してみてください。
そして、それがさらなる学びへの一歩となることを願っています。