本文实例为大家分享了pygame实现俄罗斯方块游戏的具体代码,基础的第一篇,供大家参考,具体内容如下
一、初始界面
之前的游戏都比较简单,所以代码都是面向过程的写法,这次游戏后面可能会写比较复杂(比如人机对战、联机对战、使用道具对战等),这次面向对象一点来写这个项目。
游戏的窗口设计一个专门的Panel类便于负责单个游戏窗口的管理控制。
游戏主窗口按每个方块30像素,那么宽3010=300,高是3020=600
# -*- coding=utf-8 -*-
import random
import pygame
class Panel(object): # 用于绘制整个游戏窗口的版面
def __init__(self,bg, position):
self._bg=bg;
self._x,self._y,self._width,self._height=position
self._bgcolor=[0,0,0]
def paint(self):
mid_x=self._x+self._width/2
pygame.draw.line(self._bg,self._bgcolor,[mid_x,self._y],[mid_x,self._y+self._height],self._width)
def run():
pygame.init()
space=40
main_panel_width=300
main_panel_height=main_panel_width*2
screencaption = pygame.display.set_caption('Tetris')
screen = pygame.display.set_mode((main_panel_width+160+space*3,main_panel_height+space*2)) #设置窗口长宽
main_panel=Panel(screen,[space,space,main_panel_width,main_panel_height])
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
screen.fill((100,100,100)) # 将界面设置为灰色
main_panel.paint() # 主面盘绘制
pygame.display.update() # 必须调用update才能看到绘图显示
run()
效果图

二、方块管理
这里首先想到方块不同种类的可以使用工厂模式,所以先定义一个基类的Block,然后不同种类的方块分别继承自这个Block类,分别有这样七种方块

class Block(object):
def __init__(self):
self.rect_arr=[]
def get_rect_arr(self): # 用于获取方块种的四个矩形列表
return self.rect_arr
def move(self,xdiff,ydiff): # 用于移动方块的方法
self.new_rect_arr=[]
for x,y in self.rect_arr:
self.new_rect_arr.append((x+xdiff,y+ydiff))
self.rect_arr=self.new_rect_arr
class LongBlock(Block):
def __init__(self, n=None): # 两种形态
super(LongBlock, self).__init__()
if n is None: n=random.randint(0,1)
self.rect_arr=[(1,0),(1,1),(1,2),(1,3)] if n==0 else [(0,2),(1,2),(2,2),(3,2)]
class SquareBlock(Block): # 一种形态
def __init__(self, n=None):
super(SquareBlock, self).__init__()
self.rect_arr=[(1,1),(1,2),(2,1),(2,2)]
class ZBlock(Block): # 两种形态
def __init__(self, n=None):
super(ZBlock, self).__init__()
if n is None: n=random.randint(0,1)
self.rect_arr=[(2,0),(2,1),(1,1),(1,2)] if n==0 else [(0,1),(1,1),(1,2),(2,2)]
class SBlock(Block): # 两种形态
def __init__(self, n=None):
super(SBlock, self).__init__()
if n is None: n=random.randint(0,1)
self.rect_arr=[(1,0),(1,1),(2,1),(2,2)] if n==0 else [(0,2),(1,2),(1,1),(2,1)]
class LBlock(Block): # 四种形态
def __init__(self, n=None):
super(LBlock, self).__init__()
if n is None: n=random.randint(0,3)
if n==0: self.rect_arr=[(1,0),(1,1),(1,2),(2,2)]
elif n==1: self.rect_arr=[(0,1),(1,1),(2,1),(0,2)]
elif n==2: self.rect_arr=[(0,0),(1,0),(1,1),(1,2)]
else: self.rect_arr=[(0,1),(1,1),(2,1),(2,0)]
class JBlock(Block): # 四种形态
def __init__(self, n=None):
super(JBlock, self).__init__()
if n is None: n=random.randint(0,3)
if n==0: self.rect_arr=[(1,0),(1,1),(1,2),(0,2)]
elif n==1: self.rect_arr=[(0,1),(1,1),(2,1),(0,0)]
elif n==2: self.rect_arr=[(2,0),(1,0),(1,1),(1,2)]
else: self.rect_arr=[(0,1),(1,1),(2,1),(2,2)]
class TBlock(Block): # 四种形态
def __init__(self, n=None):
super(TBlock, self).__init__()
if n is None: n=random.randint(0,3)
if n==0: self.rect_arr=[(0,1),(1,1),(2,1),(1,2)]
elif n==1: self.rect_arr=[(1,0),(1,1),(1,2),(0,1)]
elif n==2: self.rect_arr=[(0,1),(1,1),(2,1),(1,0)]
else: self.rect_arr=[(1,0),(1,1),(1,2),(2,1)]
三、创建方块和方块落下
定义一个创建方块的函数
def create_block():
n = random.randint(0,19)
if n==0: return SquareBlock(n=0)
elif n==1 or n==2: return LongBlock(n=n-1)
elif n==3 or n==4: return ZBlock(n=n-3)
elif n==5 or n==6: return SBlock(n=n-5)
elif n>=7 and n<=10: return LBlock(n=n-7)
elif n>=11 and n<=14: return JBlock(n=n-11)
else: return TBlock(n=n-15)
给Panel类加一下当前移动方块的属性,并且修改它的paint方法,将移动方块绘制
class Panel(object): # 用于绘制整个游戏窗口的版面
moving_block=None # 正在落下的方块
def __init__(self,bg, block_size, position):
self._bg=bg;
self._x,self._y,self._width,self._height=position
self._block_size=block_size
self._bgcolor=[0,0,0]
def create_move_block(selj4(}}|i }}|4(9聸Р4(tlt4(4)M 而74(}}|M }}|4(9聸Р4(tlt4(4)1 而no74(}}|1 }}|4(9聸Р4(t4(t4(t4(t4(4)) 而no74(}}|) }}|4(9聸Р4(t4(t4(t4(t4(4)Q 而no74(}}|Q }}|4(9聸Р4(t4(t4(t4(t4(4(4)}Р4(M (1 4(i 4(M 4(1 4() 4(Q 4(4)Р4((}}4(}}}}锨4(}}}}锨4(Q4(}}}}Э_>V}}}锱m}}}}4(4(4(}}}4(4(}njWH4(}(4(QЁйРй坅EU%PР4(4(4(V3v&(}Рvnc"(4(R&7"n4(4(}(}}4(4)4(#g"нх}4(brZj3ro疒j惚r'&*rokkR2 |