ボンバーマン

講師から一言
ボンバーマン、懐かしいですね。爆弾を置いたときのギミックが本物のボンバーマンぽくて面白いと思います。リストと余り(%)を使うロジックは汎用性があり、見事に使いこなしています。random.randint()を使って実行するたびに二次元リストの値を変更し、敵や壁をランダムに配置する技にも挑戦してください。

Pythonで記述したコード
import tkinter
import pygame

#変数定義
i=0 #爆弾の画像交互に表示するために使用
mx=1 #ボンバーマンのx座標
my=1 #ボンバーマンのy座標
mx2=0 #爆弾のx座標
my2=0 #爆弾のy座標
mx3=0 #二次元リストで更新用
my3=0 #二次元リストで更新用
key =""
フラグ=0 #フラグ
スコア=1 #敵をカウントする

#関数定義
def key_down(e):
    global key
    key= e.keysym
    
def key_up(e):
    global key
    key =""

def 爆弾():
    global i,mx2,my2,フラグ
    if フラグ==1:
        canvas.delete("BOM")
        canvas.create_image(mx2,my2,image=爆弾リスト[i],tag="BOM")  
        i = i + 1
        i = i%2
        root.after(400,爆弾)

def 消す(): #爆発画像を消す
    canvas.delete("爆発1")
    root.after(100,黒)

def 黒(): #二次元リスト上で3の所を焦跡にする
    canvas.delete("爆発1")
    for y in range(7):
        for x in range(10):
            if maze[y][x]==3:
                canvas.create_image(x*80+40,y*80+40,image=焦跡,tag="焦跡")

def エンディング():
    効果音_BGM.stop()
    効果音_クリア.play()
    canvas.delete("壁")
    canvas.delete("BOM")
    canvas.delete("焦跡")
    canvas.delete("敵1")
    canvas.delete("床")
    canvas.delete("壁2")
    canvas.delete("ボンバーマン")
    canvas.create_image(400,280,image = クリア)

def ボンバーマン左歩行():
    global i
    i = i +1
    i = i%2
    canvas.delete("ボンバーマン")
    canvas.create_image(mx*80+40,my*80+40,image=ボンバーマン左リスト[i],tag="ボンバーマン")

def ボンバーマン右歩行():
    global i
    i = i +1
    i = i%2
    canvas.delete("ボンバーマン")
    canvas.create_image(mx*80+40,my*80+40,image=ボンバーマン右リスト[i],tag="ボンバーマン")

def ボンバーマン下歩行():
    global i
    i = i +1
    i = i%2
    canvas.delete("ボンバーマン")
    canvas.create_image(mx*80+40,my*80+40,image=ボンバーマン下リスト[i],tag="ボンバーマン")

def ボンバーマン上歩行():
    global i
    i = i +1
    i = i%2
    canvas.delete("ボンバーマン")
    canvas.create_image(mx*80+40,my*80+40,image=ボンバーマン上リスト[i],tag="ボンバーマン")

def 爆発():
    global フラグ,maze
    効果音_爆発.play()
    canvas.delete("BOM1")
    canvas.delete("BOM2")
    フラグ=0
    スコア=0
    #基準になる点(二次元リストを変更して焦跡(3)にする)
    maze[my3][mx3] =3 
    #爆弾の1つ右が壁(1)でなければ二次元リストを変更して焦跡(3)にする
    if maze[my3][mx3+1] !=1:
        maze[my3][mx3+1] =3
    #爆弾の1つ右が壁(1)でなければ二次元リストを変更して焦跡(3)にする
    if maze[my3][mx3-1] !=1:
        maze[my3][mx3-1] =3
    #爆弾の1つ上が壁(1)でなければ二次元リストを変更して焦跡(3)にする
    if maze[my3+1][mx3] !=1:
        maze[my3+1][mx3]=3
    #爆弾の1つ下が壁(1)でなければ二次元リストを変更して焦跡(3)にする
    if maze[my3-1][mx3] !=1:
        maze[my3-1][mx3]=3
    #2次元リスト上で2(敵)の数を数える。爆弾で消すと2(敵)が3(焦跡)に変わる。
    for y in range(7):
        for x in range(10):
            if maze[y][x] == 2:
                スコア= スコア+1
    #2次元リスト上で3の所を爆発画像にする            
    for y in range(7):
        for x in range(10):
            if maze[y][x]==3:
                    canvas.create_image(mx2,my2,image = 爆発1,tag="爆発1")
                    canvas.create_image(mx2-80,my2,image = 爆発1,tag="爆発1")
                    canvas.create_image(mx2+80,my2,image = 爆発1,tag="爆発1")
                    canvas.create_image(mx2,my2+80,image = 爆発1,tag="爆発1")
                    canvas.create_image(mx2,my2-80,image = 爆発1,tag="爆発1")
    #2次元リスト上で1の所を壁にする            
    for y in range(7):
        for x in range(10):
            if maze[y][x]==1:
                canvas.create_image(x*80+40,y*80+40,image=壁,tag="壁")
    #2次元リスト上で2の所を敵にする            
            if maze[y][x]==2:
                canvas.create_image(x*80+40,y*80+40,image=敵,tag="敵1")

    #二次元リストで2(敵)がすべてなくなったらエンディングを送る
    if スコア==0:
        root.after(100,黒)
        root.after(500,エンディング)
    else:
        root.after(100,消す)
        
#メイン処理
def main_proc():
    global mx,my,yuka,mx2,my2,フラグ,mx3,my3,maze,スコア
    #「↑」キーが押されるかつ、1つ上が通路のとき
    if key == "Up" and maze[my-1][mx]==0:
        my = my - 1
        効果音_足音.play()
        ボンバーマン上歩行()
        
    #「↓」キーが押されるかつ、1つ下が通路のとき
    if key == "Down" and maze[my+1][mx]==0:
        my = my + 1
        効果音_足音.play()
        ボンバーマン下歩行()

    #「←」キーが押されるかつ、1つ左が通路のとき
    if key =="Left" and maze[my][mx-1]==0:
        mx = mx - 1
        効果音_足音.play()
        ボンバーマン左歩行()


    #「→」キーが押されるかつ、1つ右が通路のとき
    if key == "Right" and maze[my][mx+1]==0:
        mx = mx + 1
        効果音_足音.play()
        ボンバーマン右歩行()
        
    #「スペース」キーが押されたときの処理
    if key == "space":
        mx2=mx*80+40 #その時点のマウスのx座標をmx2に代入する(mx2は爆弾を配置するx座標)
        my2=my*80+40 #その時点のマウスのy座標をmy2に代入する(my2は爆弾を配置するy座標)
        mx3=mx #二次元リストの値を更新するために使用する
        my3=my #二次元リストの値を更新するために使用する
        フラグ=1 #フラグが1のときに爆弾の画像を入れ替えて、爆弾に動きをつける。
        爆弾() #爆弾を配置する関数
        root.after(2000,爆発) #配置した爆弾を2秒後に爆破させる
    root.after(100,main_proc)

#画面作成
root=tkinter.Tk()
root.title("ボンバーマン")
root.resizable(False,False)
root.bind("",key_down)
root.bind("",key_up)
canvas = tkinter.Canvas(width=800,height=560,bg="white")
canvas.pack()

#効果音
pygame.init()
pygame.mixer.init()
効果音_爆発=pygame.mixer.Sound("sound\爆発.mp3")
効果音_BGM=pygame.mixer.Sound("sound\BGM.wav")
効果音_足音=pygame.mixer.Sound("sound\足音.wav")
効果音_クリア=pygame.mixer.Sound("sound\クリア.wav")

#BGM
効果音_BGM.play(-1)

#画像のアップロード
ボンバーマン下1 = tkinter.PhotoImage(file="image\ボンバーマン下1.png")
ボンバーマン下2 = tkinter.PhotoImage(file="image\ボンバーマン下2.png")
ボンバーマン上1 = tkinter.PhotoImage(file="image\ボンバーマン上1.png")
ボンバーマン上2 = tkinter.PhotoImage(file="image\ボンバーマン上2.png")
ボンバーマン左1 = tkinter.PhotoImage(file="image\ボンバーマン左1.png")
ボンバーマン左2 = tkinter.PhotoImage(file="image\ボンバーマン左2.png")
ボンバーマン右1 = tkinter.PhotoImage(file="image\ボンバーマン右1.png")
ボンバーマン右2 = tkinter.PhotoImage(file="image\ボンバーマン右2.png")

爆弾1 = tkinter.PhotoImage(file="image\爆弾1.png")
爆弾2 = tkinter.PhotoImage(file="image\爆弾2.png")
爆発1 = tkinter.PhotoImage(file="image\爆発1.png")
クリア = tkinter.PhotoImage(file="image\クリア.png")
敵 = tkinter.PhotoImage(file="image\敵.png")
壁 = tkinter.PhotoImage(file="image\壁.png")
壁2 = tkinter.PhotoImage(file="image\壁2.png")
床 = tkinter.PhotoImage(file="image\床.png")
焦跡 = tkinter.PhotoImage(file="image\焦げ跡.png")

#爆弾リスト※爆弾を大きくしたり、小さくしたりする時に使用
爆弾リスト=[爆弾1,爆弾2]
ボンバーマン左リスト=[ボンバーマン左1,ボンバーマン左2]
ボンバーマン右リスト=[ボンバーマン右1,ボンバーマン右2]
ボンバーマン下リスト=[ボンバーマン下1,ボンバーマン下2]
ボンバーマン上リスト=[ボンバーマン上1,ボンバーマン上2]

#二次元リストで迷路の定義(0:床、1:壁、2:敵、3:焦げ跡、4:壁2)
maze = [
    [1,1,1,1,1,1,1,1,1,1],
    [1,0,2,0,2,0,0,0,0,1],
    [1,0,4,0,0,4,0,0,2,1],
    [1,0,0,0,0,0,0,0,2,1],
    [1,0,0,0,4,0,4,0,2,1],
    [1,0,2,0,2,0,0,0,0,1],
    [1,1,1,1,1,1,1,1,1,1]
    ]

#迷路の描画(最初の1回目)
for y in range(7):
    for x in range(10):
        if maze[y][x]==0 or maze[y][x]==2 or maze[y][x]==4 or maze[y][x]==1:
            canvas.create_image(x*80+40,y*80+40,image=床,tag="床")
        if maze[y][x]==1:
            canvas.create_image(x*80+40,y*80+40,image=壁,tag="壁")
        if maze[y][x]==2:
            canvas.create_image(x*80+40,y*80+40,image=敵,tag="敵1")
        if maze[y][x]==4:
            canvas.create_image(x*80+40,y*80+40,image=壁2,tag="壁2")
            
#ボンバーマンの描画
canvas.create_image(mx*80+40,my*80+40,image=ボンバーマン下1,tag="ボンバーマン")

#メインプロセスの呼び出し
main_proc()

#ループ処理
root.mainloop()