也用pygame做了俄罗斯方块,150行
只完成了最简单的功能,由于存在转动数据,这个实在不好意思全部手动输入(实际代码行数超过了手动输入),强行转动(最后一个图形实在无奈,只能手动调整,转动取整后,图形位置移动了,只有这一个,耍赖了一把)
代码:
import sys
import pygame
from pygame.locals import *
import random
class Block:
blk_color = [(255, 255, 255),(255, 255, 0),(255, 0, 255),(0, 255, 255),(255, 0, 0),(0, 255, 0),(0, 0, 255),(32,32,32)]
BLANK = 7
type_coord=[[[-1,0],,,]\
,[[-1,0],,,]\
,[[-1,0],,[-1,1],]\
,[[-1,0],,,]\
,[,,[-1,1],]\
,[[-1,0],,,]\
,[[-1,0],,,[-1,1]]]
type_rotate = []
def __init__(self,x,y,blk,angle):
self.x = x
self.y = y
self.blk = blk
self.angle = angle
@staticmethod
def rotate(no):
rt_all = []
rt = Block.type_coord[:]
cx,cy=0,0
for b in range(4):
rt,rt = rt*4,rt*4
cx += rt
cy += rt
cx = (cx)//8*2 if no !=6 else (cx+4)//8*2
cy = (cy)//8*2 if no !=6 else (cy-4)//8*2
rt_all.append(rt)
for r in range(3):
rt_new = []
for b in range(4):
rt_new.append(),cy-(cx-rt)])
rt_all.append(rt_new)
rt = rt_new
for r in range(4):
for b in range(4):
rt_all //= 4
rt_all //= 4
return rt_all
@staticmethod
def init_rotate():
for r in range(7):
Block.type_rotate.append(Block.rotate(r))
class TRS:
screen = None
map = [*10 for i in range(20)]
STATUS = 0
cbk = None
def __init__(self,screen):
TRS.screen = screen
@staticmethod
def action(key_pressed):
if(key_pressed and TRS.check_action(TRS.cbk.x-1,TRS.cbk.y,TRS.cbk.blk,TRS.cbk.angle)):
TRS.cbk.x -= 1
elif (key_pressed and TRS.check_action(TRS.cbk.x+1,TRS.cbk.y,TRS.cbk.blk,TRS.cbk.angle)):
TRS.cbk.x += 1
elif (key_pressed and TRS.check_action(TRS.cbk.x,TRS.cbk.y,TRS.cbk.blk,TRS.cbk.angle+1)):
TRS.cbk.angle += 1
elif (key_pressed and TRS.check_action(TRS.cbk.x,TRS.cbk.y+1,TRS.cbk.blk,TRS.cbk.angle)):
TRS.cbk.y += 1
@staticmethod
def new_blk():
TRS.cbk = Block(5,0,random.randint(0,6),0)
@staticmethod
def check_action(x,y,blk,angle):
tr = Block.type_rotate
for b in range(4):
bx,by = x + tr,y + tr
if(bx<0 or bx>9 or by <0 or by>19 or TRS.map!=Block.BLANK):
return False
return True
@staticmethod
def check_drop():
if TRS.check_action(TRS.cbk.x,TRS.cbk.y+1,TRS.cbk.blk,TRS.cbk.angle):
TRS.cbk.y += 1
else:
TRS.STATUS = 2
@staticmethod
def check_clear():
blk = Block.type_rotate
row = list({TRS.cbk.y + blk for i in range(4)})
row.sort()
row.reverse()
for b in range(4):
TRS.map]] = TRS.cbk.blk
del_rows = 0
for r in row:
if not (Block.BLANK in TRS.map):
TRS.map.pop(r)
del_rows += 1
for d in range(del_rows):
TRS.map.insert(0,)
@staticmethod
def print_game():
TRS.screen.fill((0, 0, 0))
for row in range(20):
for col in range(10):
pygame.draw.rect(TRS.screen, Block.blk_color], ((col*21,row*21), (20, 20)), 0)
blk = Block.type_rotate
for b in range(4):
pygame.draw.rect(TRS.screen, Block.blk_color, (((TRS.cbk.x+blk)*21,(TRS.cbk.y+blk)*21), (20, 20)), 0)
class App:
def __init__(self):
pygame.init()
screen = pygame.display.set_mode((300,430))
Block.init_rotate()
TRS(screen)
#@staticmethod
def main(self):
clock = pygame.time.Clock() # 创建游戏时钟
count = 1
# 进入游戏循环
while True:
# 设置刷新帧率
clock.tick(15)
# 事件检测
for event in pygame.event.get():
if event.type == pygame.QUIT: # 退出事件
sys.exit()
if TRS.STATUS == 0:
TRS.new_blk()
if TRS.check_action(TRS.cbk.x,TRS.cbk.y,TRS.cbk.blk,TRS.cbk.angle):
TRS.STATUS = 1
else:
TRS.STATUS = 3
print("GAME OVER")
elif TRS.STATUS == 1:
TRS.action(pygame.key.get_pressed())
if count % 10 == 0:
TRS.check_drop()
elif TRS.STATUS == 2:
TRS.check_clear()
TRS.STATUS = 0
TRS.print_game()
pygame.display.update() #刷新屏幕
count += 1
App().main() 一打开高级功能,图形,附件全弄不上去了,只能回帖:
页:
[1]