📺

Pygameで昔遊んだ「ラストワン」を再現する

2024/09/29に公開

はじめに

昔はまった「ラストワン」をネットで検索したところ、アプリが数件ヒットしたのみだったためPygameを使って再現する

目次

  1. ラストワンはどんなゲームか?
  2. プレイ画面の作成
  3. 駒の移動可能判定
  4. 駒の移動処理
  5. まとめ
  6. 参考にしたサイト

ラストワンはどんなゲームか?

チェッカーのように飛び越えた駒を盤面から取り除いて行き最後の一つを中心になるように解くパズルゲーム。

プレイ画面の作成

概要

プレイの土台になる画面を作成する。

作成する画面のイメージ

3*3マスの9マスの上下左右に6マスのグリットを追加した形を作成する。

プレイ画面の作成

import pygame
import sys

# Pygameの初期化
pygame.init()

# 画面サイズの設定
screen_width = 900
screen_height = 800
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("ラストワン")

# 色の定義
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# ゲームのループ
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 画面を白で塗りつぶす
    screen.fill(WHITE)

    pygame.draw.rect(screen, BLACK, (300,50,300,700), 2)

    pygame.draw.rect(screen, BLACK, (100,250,700,300), 2)

    pygame.draw.rect(screen, BLACK, (400,50,100,700), 2)

    pygame.draw.rect(screen, BLACK, (100,350,700,100), 2)

    pygame.draw.line(screen, BLACK, (300, 150), (600, 150), 2)

    pygame.draw.line(screen, BLACK, (300, 650), (600, 650), 2)

    pygame.draw.line(screen, BLACK, (200, 250), (200, 550), 2)

    pygame.draw.line(screen, BLACK, (700, 250), (700, 550), 2)

    # 画面を更新
    pygame.display.flip()

    # フレームレートを設定
    pygame.time.Clock().tick(60)

駒の移動可能判定

駒を動かす時のルール

  • 他の駒を必ず飛び越えなければいけない
  • 一度に1つの駒までしか飛び越えられない
  • 飛び越えた先に駒はあってはいけない

コードの内容

上記のルールを動かすことのできる場所と駒の判定を行う。
駒の位置は配列で管理する。

駒の動かすことが可能なマスの判定処理の流れ

  1. 駒を選択する
  2. 駒の上下左右のマスに駒が配置されているか確認する。
    1. 配置されている方向については、3の処理に進む
    2. 配置されていない方向については、駒を動かすことができない
    3. 盤面の端でマスがない場合も、駒を動かすことができない
  3. 2の処理と同じ方向に1つ進んだマスの状態を確認する。
    1. マスが空いている場合は、駒を動かすことが可能。
    2. 盤面の端でマスがない場合は、駒を動かすことは不可。
    3. マスに他の駒がある場合は、駒を動かすことは不可。

選択された駒を動かすことが可能なマスの判定コード

# 移動可能なマスを判定する
# (x,y)は選択された駒の座標
# 移動可能なマスには5を入れる
def move_piece(x,y):
    if y - 1 >= 0:#上    
        if pieces[y-1][x] == 10:
            if pieces[y-2][x] == 0:
                pieces[y-2][x] = 5
    
    if y + 1 <= 6:#下
        if pieces[y+1][x] == 10:
            if pieces[y+2][x] == 0:
                pieces[y+2][x] = 5
    
    if x - 1 >= 0:#左
        if pieces[y][x-1] == 10:
            if pieces[y][x-2] == 0:
                pieces[y][x-2] = 5
    
    if x + 1 <= 6:#右
        if pieces[y][x+1] == 10:
            if pieces[y][x+2] == 0:
                pieces[y][x+2] = 5

駒の移動処理

概要

クリックされたマスの上下左右のどこに選択されたマスがあるか特定する。選択されたマスとクリックされたマスに挟まれたマスを選択したマスと同様に盤面から削除する。

駒移動のコード

if y - 2 >= 0:#上
        if pieces[y - 2][x] == 20:
            pieces[y - 1][x] = 15
    
    if y + 2 <= 6:#下
        if pieces[y + 2][x] == 20:
            pieces[y + 1][x] = 15

    if x - 2 >= 0:#左
        if pieces[y][x - 2] == 20:
            pieces[y][x - 1] = 15
       
    if x + 2 <= 6:#右
        if pieces[y][x + 2] == 20:
            pieces[y][x + 1] = 15

    for i in range(7):
        for j in range(7):
            if pieces[i][j] == 20:
                pieces[i][j] = 0
            elif pieces[i][j] == 15:
                pieces[i][j] = 0
            elif pieces [i][j] == 5:
                pieces[i][j] = 10

まとめ

ここまでのソースコードでゲームクリアまでのゲームとしての動作は再現することができた。駒を移動するタイミングで移動した駒が同時に選択される不具合が解消できていないため、次回はその解消について取り組もうと思っている。

参考にしたサイト

Discussion