本気で「テトリス」を作ってみた結果・・・。/さて、何分で完成したのか?

雨・・・こんな日はプログラミング日和。

そうだ! テトリス、作ろう!!
ということで、やってみた。

単純なゲームだ。

オレの手にかかれば・・・造作もない・・・(汗)。

さて、完成までどれくらいかかったのか?

とりあえずは、コードだけでも。

今回の動画は、ホントにオンリーチャレンジだ。

コードの解説なんかは特になくって。

ただただ、書き続ける。
いや、悩んだり・・・書いたり・・・。
悩んだり・・・悩んだり・・・。

動画はコチラ(↓)
本気で作るテトリス。

https://youtu.be/kEkJc3fpFkQ

だから、このブログで解説記事があれば親切なんだけど・・・。

ありません^_^;
動画を見ても・・・ありません。

今後追加するかも・・・未定ですが。

[追記]
解説の動画を作りました。

第1話
https://youtu.be/Nugqv7UojCw
・テトロミノを表示して動かす

第2話
https://youtu.be/PwQr-HWc75E
・アタリ判定とテトロミノを回転させる

第3話
https://youtu.be/SZ6nWwMQufI
・最後の仕上げ一列そろったら消す

#################### Rough TETRIS ####################

import tkinter as tk
import random
from tkinter import messagebox

SIZE = 30       #ブロックのサイズ
moveX = 4       #テトロミノ表示位置(横)
moveY = 0       #テトロミノ表示位置(縦)
type = random.randint(0, 6)        #テトロミノのタイプ

timer = 800     #ゲームスピードコントロール
score = 0       #スコア

color = ["magenta", "blue", "cyan", "yellow", "orange", "red", "green", "black", "white"]

#テトロミノデータ
tetroT = [-1, 0, 0, 0, 1, 0, 0, 1]
tetroJ = [-1, 0, 0, 0, 1, 0, 1, 1]
tetroI = [-1, 0, 0, 0, 1, 0, 2, 0]
tetroO = [ 0, 0, 1, 0, 0, 1, 1, 1]
tetroL = [-1, 0, 0, 0, 1, 0,-1, 1]
tetroZ = [-1,-1, 0,-1, 0, 0, 1, 0]
tetroS = [ 0, 0, 1, 0, 0, 1,-1, 1]
tetro = [tetroT, tetroJ, tetroI, tetroO, tetroL, tetroZ, tetroS]

#フィールドデータ
field = []
for y in range(22):
    sub = []
    for x in range(12):
        if x==0 or x==11 or y==21 :
            sub.append(8)
        else :
            sub.append(7)
    field.append(sub)

#テトロミノを表示する関数
def drawTetris():
    for i in range(4):
        x = (tetro[type][i*2]+moveX)*SIZE
        y = (tetro[type][i*2+1]+moveY)*SIZE
        can. create_rectangle(x, y, x+SIZE, y+SIZE, fill=color[type])

#フィールドを表示する関数
def drawField():
    for i in range(21):
        for j in range(12):
            outLine=0 if color[field[i+1][j]]=="white" else 1   #白いブロックは枠無しで表示
            can.create_rectangle(j*SIZE, i*SIZE, (j+1)*SIZE, (i+1)*SIZE, fill=color[field[i+1][j]], width=outLine)

#テトロミノを動かす関数
def keyPress(event):   
    global moveX, moveY
    afterX = moveX
    afterY = moveY
    afterTetro = []
    afterTetro.extend(tetro[type])
    if event.keysym=="Right" :      #右移動
        afterX += 1
    elif event.keysym=="Left" :     #左移動
        afterX -= 1
    elif event.keysym=="Down" :     #下移動
        afterY += 1
    elif event.keysym=="space" :    #右回転
        afterTetro.clear()
        for i in range(4):
            afterTetro.append(tetro[type][i*2+1]*(-1))
            afterTetro.append(tetro[type][i*2])
    judge(afterX, afterY, afterTetro)   #アタリ判定関数呼び出し

def judge(afterX, afterY, afterTetro):  #アタリ判定をする関数
    global moveX, moveY
    result = True
    for i in range(4):
        x = afterTetro[i*2]+afterX
        y = afterTetro[i*2+1]+afterY
        if field[y+1][x]!=7 :
            result = False
    if result==True :
        moveX = afterX
        moveY = afterY
        tetro[type].clear()
        tetro[type].extend(afterTetro)
    return result

def dropTetris():
    global moveX, moveY, type, timer
    afterTetro = []
    afterTetro.extend(tetro[type])
    result = judge(moveX, moveY+1, afterTetro)
    if result==False :
        for i in range(4):
            x = tetro[type][i*2]+moveX
            y = tetro[type][i*2+1]+moveY
            field[y+1][x] = type
        deleteLine()
        type = random.randint(0, 6)
        moveX = 4
        moveY = 0
    can.after(timer, dropTetris)
    timer -= 2                          #落下速度コントロール
    if timer<140 :
        timer = 180

def deleteLine():
    global score
    for i in range(1, 21):
        if 7 not in field[i]:
            for j in range(i):
                for k in range(12):
                    field[i-j][k] = field[i-j-1][k]
            score += 800-timer
    for i in range(1, 11):
        if 7 != field[1][i]:
            messagebox.showinfo("information", "GAME OVER !")
            exit()

####################  ゲームループ  ####################    
win = tk.Tk()
win.geometry("340x630")
win.title("Rough TETRIS")
can = tk.Canvas(win, width=12*SIZE, height=21*SIZE)
can.place(x=-10, y=0)
var = tk.StringVar()
lab = tk.Label(win, textvariable=var, fg="blue", bg="white", font=("", "20"))   #得点表示
lab.place(x=50, y=600)

win.bind("<Any-KeyPress>", keyPress)    #キープレスをバインド

def gameLoop():
    can.delete("all")
    var.set(score)
    drawField()
    drawTetris()
    can.after(50, gameLoop)

gameLoop()
dropTetris()

win.mainloop()