Commit 38139c82 by BellCodeEditor

auto save

parent 81e7110a
Showing with 146 additions and 0 deletions
import pygame
from pygame import locals
import random
pygame.init()   # 初始化
score = 0
grid_size = 20  # 格子大小
grid_num_width = 15     # 横向格子数量
grid_num_height = 25      # 纵向格子数量
FPS = 60
count = 0
states = False
gameover = False
# 创建窗口
screen = pygame.display.set_mode((460, 500))
pygame.display.set_caption("俄罗斯方块")
clock = pygame.time.Clock()  # pygame时钟,控制游戏速度(帧数)
# 载入素材
background = pygame.image.load('bg.png')
font = pygame.font.Font('STKAITI.TTF', 60)  # 字体
font1 = pygame.font.Font('STKAITI.TTF', 30)
num_list = []
for i in range(25):
    num_list.append([0]*15)
# 俄罗斯方块所有形状
O = [[(0, 0), (0, 1), (1, 0), (1, 1)]]
I = [[(0, -1), (0, 0), (0, 1), (0, 2)],
     [(-1, 0), (0, 0), (1, 0), (2, 0)]]
Z = [[(0, -1), (0, 0), (1, 0), (1, 1)],
     [(-1, 0), (0, 0), (0, -1), (1, -1)]]
S = [[(-1, 0), (0, 0), (0, 1), (1, 1)],
     [(1, -1), (1, 0), (0, 0), (0, 1)]]
T = [[(0, -1), (0, 0), (0, 1), (-1, 0)],
     [(-1, 0), (0, 0), (1, 0), (0, 1)],
     [(0, -1), (0, 0), (0, 1), (1, 0)],
     [(-1, 0), (0, 0), (1, 0), (0, -1)]]
J = [[(-1, 0), (0, 0), (1, 0), (1, -1)],
     [(0, -1), (0, 0), (0, 1), (-1, -1)],
     [(-1, 0), (0, 0), (1, 0), (-1, 1)],
     [(0, -1), (0, 0), (0, 1), (1, 1)]]
L = [[(-1, 0), (0, 0), (1, 0), (1, 1)],
     [(0, -1), (0, 0), (0, 1), (1, -1)],
     [(-1, 0), (0, 0), (1, 0), (-1, -1)],
     [(0, -1), (0, 0), (0, 1), (-1, 1)]]
shape_list = [I, J, L, O, S, T, Z]  # 7种类型俄罗斯方块
# 一些RGB颜色
cube_colors = [
    (204, 153, 153), (102, 102, 153),(153, 0, 102), 
    (255, 204, 0), (204, 0, 51),(255, 0, 51), (0, 102, 153),
    (153, 0, 51), (204, 255, 102), (255, 153, 0)]
center = [2, 8]     # 第2行第8列
current_shape = [(0, -1), (0, 0), (0, 1), (-1, 0)]
def check(center):
    for cube in current_shape:
        cube=(cube[0]+center[0],cube[1]+center[1])
        if cube[0]<1 or cube[1]<1 or cube[0]>grid_num_height or cube[1]>grid_num_width:
            return False
        if num_list[cube[0]-1][cube[1]-1]!=0:
            return False
while True:
    for event in pygame.event.get():
        if event.type == locals.QUIT:
            exit()
        if event.type == locals.KEYDOWN:
            if gameover == True:
                gameover = False
            if event.key == locals.K_RIGHT:     # 向右
                center[1] += 1
                if check(center) == False:
                    center[1]-=1
            elif event.key == locals.K_LEFT:    # 向左
                center[1] -= 1
                if check(center) == False:
                    center[1]+=1
            elif event.key == locals.K_DOWN:    # 向下  
                center[0]+=1
                if check(center) == False:
                    center[0]-=1
            elif event.key == locals.K_UP:    # 改变形状
                old_way=way
                way +=1
                if way >= len(shape):
                    way=0
                current_shape=shape[way]
                if check(center) == False:
                    way=old_way
                    current_shape=shape[way]
    if gameover==False:
        if states==False:
            states=True
            center=[2,8]
            shape = random.choice(shape_list)    # 形状
            way = random.randint(0,len(shape)-1)    # 方向
            color = random.choice(cube_colors)    # 颜色
        count += 1   # 向下
        if count%FPS==0:    # 减速公式
            center[0] += 1
            if check(center) == False:
                center[0]-=1
                states=False
                for cube in current_pos:
                    num_list[cube[0]-1][cube[1]-1]=color
        # 将背景图画上去
        screen.blit(background, (0, 0))
        # 计算出所有小方块的行、列位置
        current_pos = []
        for cube in shape[way]:
            pos = (cube[0] + center[0], cube[1] + center[1])
            current_pos.append(pos)
        # 取出所有小方块的行、列位置,计算坐标,绘制俄罗斯方块
        for cube in current_pos:
            pygame.draw.rect(screen,color,(cube[1] * 20-20, cube[0] * 20-20, 20, 20), 0)
            pygame.draw.rect(screen, (255, 255, 255), (cube[1] * 20-20, cube[0] * 20-20, 20, 20), 1)
        for x,row in zip(range(1,26),num_list):
            for y,colors in zip(range(1,16),row):
                if colors!=0:
                    pygame.draw.rect(screen,colors,(y * 20-20, x * 20-20, 20, 20), 0)
                    pygame.draw.rect(screen, (255, 255, 255), (y * 20-20, x * 20-20, 20, 20), 1)
        new_list = []
        for h in range(25):     # 消行
            new_list.append([0]*15)
        row_index=24
        for h in range(24,-1,-1):
            is_full=True
            for j in range(grid_num_width):
                if num_list[h][j]==0:
                    is_full=False
            if is_full==False:
                new_list[row_index]=num_list[h]
                row_index-=1
            else:
                score+=1    # 得分
        num_list=new_list
    if num_list[1][7]!=0:
        gameover=True
        text_shibai = font1.render("游戏结束!请按任意键重新开始!", True, (0, 0, 0))
        screen.blit(text_shibai,(0,250))
        num_list=[]
        for i in range(25):
            num_list.append([0]*15)
        score=0
    text_surface = font.render(str(score), True, (0, 0, 0))
    screen.blit(text_surface, (350,70))
    # 刷新画面
    pygame.display.update()
    clock.tick(FPS)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment