python编的俄罗斯方块游戏_分享一个Python写的俄罗斯方块源码,非常适合新手学习...

import pygame, sys, random, time

def new_draw():

screen.fill(white)

for i in range(1, 21):

for j in range(10):

bolck = background[i][j]

if bolck:

pygame.draw.rect(screen, blue, (j * 25 + 1, 500 - i * 25 + 1, 23, 23))

x, y = centre

for i, j in active:

i += x

j += y

pygame.draw.rect(screen, blue, (j * 25 + 1, 500 - i * 25 + 1, 23, 23))

pygame.display.update()

def move_LR(n):

"""n=-1代表向左,n=1代表向右"""

x, y = centre

y += n

for i, j in active:

i += x

j += y

if j < 0 or j > 9 or background[i][j]:

break

else:

centre.clear()

centre.extend([x, y])

def rotate():

x, y = centre

l = [(-j, i) for i, j in active]

for i, j in l:

i += x

j += y

if j < 0 or j > 9 or background[i][j]:

break

else:

active.clear()

active.extend(l)

def move_down():

x, y = centre

x -= 1

for i, j in active:

i += x

j += y

if background[i][j]:

break

else:

centre.clear()

centre.extend([x, y])

return

# 如果新位置未被占用 通过return结束

# 如果新位置被占用则继续向下执行

x, y = centre

for i, j in active:

background[x + i][y + j] = 1

l = []

for i in range(1, 20):

if 0 not in background[i]:

l.append(i)

# l装 行号,鉴于删去后,部分索引变化,对其降序排列,倒着删除

l.sort(reverse=True)

for i in l:

background.pop(i)

background.append([0 for j in range(10)])

# 随删随补

score[0] += len(l)

pygame.display.set_caption("分数:%d" % (score[0]))

active.clear()

active.extend(list(random.choice(all_block)))

# all_block保存7种形状的信息,手打出来的

centre.clear()

centre.extend([20, 4])

x, y = centre

for i, j in active:

i += x

j += y

if background[i][j]:

break

else:

return

alive.append(1)

if __name__ == '__main__':

pygame.init()

screen = pygame.display.set_mode((250, 500))

pygame.display.set_caption("俄罗斯方块")

fclock = pygame.time.Clock()

all_block = (((0, 0), (0, -1), (0, 1), (0, 2)),

((0, 0), (0, 1), (-1, 0), (-1, 1)),

((0, 0), (0, -1), (-1, 0), (-1, 1)),

((0, 0), (0, 1), (-1, -1), (-1, 0)),

((0, 0), (0, 1), (1, 0), (0, -1)),

((0, 0), (1, 0), (-1, 0), (1, -1)),

((0, 0), (1, 0), (-1, 0), (1, 1)))

background = [[0 for i in range(10)] for j in range(24)]

background[0] = [1 for i in range(10)]

active = list(random.choice(all_block))

centre = [20, 4]

score = [0]

black = 0, 0, 0

white = 255, 255, 255

blue = 0, 0, 255

times = 0

alive = []

press = False

while True:

for event in pygame.event.get():

if event.type == pygame.quit:

sys.exit()

elif event.type == pygame.KEYDOWN:

if event.key == pygame.K_LEFT:

move_LR(-1)

elif event.key == pygame.K_RIGHT:

move_LR(1)

elif event.key == pygame.K_UP:

rotate()

elif event.key == pygame.K_DOWN:

press = True

elif event.type == pygame.KEYUP:

if event.key == pygame.K_DOWN:

press = False

if press:

times += 10

if times >= 50:

move_down()

times = 0

else:

times += 1

if alive:

pygame.display.set_caption("over分数:%d" % (score[0]))

time.sleep(3)

break

new_draw()

fclock.tick(100)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值