周报9

俄罗斯方块
# -*-coding:utf8 -*-
import random

import pygame
import sys
import time
import mysql
from dateutil.parser import parse

# 初始化
pygame.init()


# 主屏幕窗口
screen = pygame.display.set_mode((350, 500))

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

# 得分
score = [0]

# 游戏结束标志
gameover = []

# 帧数统计
speeds = 0

press = False
level =1
# 创建元素
all_block = [
[[0, 0], [0, -1], [0, 1], [0, 2]],
[[0, 0], [0, 1], [1, 1], [1, 0]],
[[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]]
]

# 随机选择一个方块
select_block = list(random.choice(all_block))

# 创建背景20*10
background = [[0 for column in range(0, 10)] for row in range(0, 22)]

background[0] = [1 for _ in range(0, 10)]
# 位置
block_initial_position = [21, 5]


def block_down_move():
# 实现方块掉落
y_drop = block_initial_position[0]
x_move = block_initial_position[1]
y_drop -= 1

for row, column in select_block:
row += y_drop
column += x_move
# 触底
if background[row][column] == 1:
break
else:
block_initial_position.clear()
block_initial_position.extend([y_drop, x_move])
return

y_drop, x_move = block_initial_position

for row, column in select_block:
background[row+y_drop][column+x_move] = 1
complete_row = []

for row in range(1, 21):
if 0 not in background[row]:
complete_row.append(row)

complete_row.sort(reverse=True) # 逆序排列

for row in complete_row:
background.pop(row)
background.append([0 for _ in range(0, 10)])

score[0] += len(complete_row)
pygame.display.set_caption("得分:" + str(score[0])+"分")

select_block.clear()
select_block.extend(list(random.choice(all_block)))

block_initial_position.clear()
block_initial_position.extend([20, 5])
y_drop, x_move = block_initial_position
# 加新物块是否触顶
for row, column in select_block:
row += y_drop
column += x_move
if background[row][column]:
gameover.append(1)


def draw_block():
y_drop, x_move = block_initial_position
for row, column in select_block:
row += y_drop
column += x_move
point = (column*25, 500-row*25)
pygame.draw.rect(screen, (230, 100, 34), (column*25, 500-row*25, 23, 23))

for row in range(0, 20):
for column in range(0, 10):
bottom = background[row][column]
if bottom:
pygame.draw.rect(screen, (255, 64, 64), (column*25, 500-row*25, 23, 23))


def move_left_right(n):
# 移动
y_drop, x_move = block_initial_position
x_move += n
for row, column in select_block:
row += y_drop
column += x_move
if column < 0 or column > 9 or background[row][column]:
break
else:
block_initial_position.clear()
block_initial_position.extend([y_drop, x_move])


def rotate():
# 旋转
y_drop, x_move = block_initial_position
rotate_position = [(-column, row)for row, column in select_block]
for row, column in rotate_position:
row += y_drop
column += x_move
if column < 0 or column > 9 or background[row][column]:
break
else:
select_block.clear()
select_block.extend(rotate_position)


def do_event(pos):
if 350 > pos[0] > 250 and 450 < pos[1] < 500:
reset()
elif 350 > pos[0] > 250 and 400 < pos[1] < 450:
store_history()


def reset():
global background
global block_initial_position
global level
level = 1
score[0] = 0
pygame.display.set_caption("得分:" + str(score[0]) + "分")
gameover.clear()
select_block.clear()
select_block.extend(list(random.choice(all_block)))
background = [[0 for column in range(0, 10)] for row in range(0, 22)]
background[0] = [1 for _ in range(0, 10)]
block_initial_position = [21, 5]


def load_history():
res = mysql.select_item()[0]
score[0] = int(res[1])
pygame.display.set_caption("得分:" + str(score[0]) + "分")
if res[4]:
gameover.clear()
else:
gameover.append(1)

global background
global block_initial_position
global select_block
background = eval(res[2])
block_initial_position = eval(res[3])
select_block.clear()
select_block = eval(res[5])



def store_history():
global background
global block_initial_position
sh = []
t = parse(time.asctime())
t.strftime("%Y-%m-%d")
sc = score[0]
sh.append(t)
sh.append(sc)
sh.append(str(background))
print(background)
sh.append(str(block_initial_position))
# 0为失败 1反之
if gameover:
sh.append(1)
else:
sh.append(0)
sh.append(str(select_block))
mysql.insert_item(sh)



load_history()
while True:
rect = pygame.Rect(0, 0, 250, 500)
rect2 = pygame.Rect(250, 0, 100, 500)
rect3 = pygame.Rect(250, 450, 100, 50)
rect4 = pygame.Rect(250, 400, 100, 50)
screen.fill(color=(34, 139, 34), rect=rect)
screen.fill(color=(255, 255, 255), rect=rect2)
screen.fill(color=(255, 245, 40), rect=rect3)
screen.fill(color=(255, 245, 40), rect=rect4)
f = pygame.font.Font('C:/Windows/Fonts/simhei.ttf', 20)
text_reset = f.render("重新开始", True, (255, 0, 0), (255, 245, 40))
textRect_reset = text_reset.get_rect()
textRect_reset.center = (300, 475)


text_reset2 = f.render("存档", True, (255, 0, 0), (255, 245, 40))
textRect_reset2 = text_reset2.get_rect()
textRect_reset2.center = (300, 425)
# 将准备好的文本信息,绘制到主屏幕 Screen 上。
screen.blit(text_reset, textRect_reset)
screen.blit(text_reset2, textRect_reset2)
# 捕获事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# ESC程序停止
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
move_left_right(-1)
elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
move_left_right(1)
elif event.type == pygame.KEYDOWN and event.key == pygame.K_UP:
rotate()
elif event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN:
press = True
elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN:
press = False
elif event.type == pygame.KEYUP and event.key == pygame.K_z:
if level < 30:
level = level+1
elif event.type == pygame.KEYUP and event.key == pygame.K_x:
if level > 1:
level = level - 1
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
select_block.clear()
select_block.extend(list(random.choice(all_block)))
elif event.type == pygame.MOUSEBUTTONDOWN:
print('鼠标按下', event.pos)
do_event(event.pos)
# 方块掉落
if press:
speeds += 10
if speeds >= 30:
block_down_move()
speeds = 0
else:
speeds += level

draw_block()
pygame.time.Clock().tick(100)
if gameover:
# 引入字体类型
f = pygame.font.Font('C:/Windows/Fonts/simhei.ttf', 60)
# 生成文本信息,第一个参数文本内容;第二个参数,字体是否平滑;
# 第三个参数,RGB模式的字体颜色;第四个参数,RGB模式字体背景颜色;
text = f.render("Gameover", True, (0, 0, 0), (34, 139, 34))
# 获得显示对象的rect区域坐标
textRect = text.get_rect()
# 设置显示对象居中
textRect.center = (125, 250)
# 将准备好的文本信息,绘制到主屏幕 Screen 上。
screen.blit(text, textRect)

# sys.exit()
# 刷新
pygame.display.flip()
# pygame.display.update()
posted @ 2022-05-01 17:09  我的未来姓栗山  阅读(19)  评论(0编辑  收藏  举报