python和pygame实现简单俄罗斯方块游戏-创新互联

本文为大家分享了python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下

成都服务器托管,创新互联提供包括服务器租用、棕树数据中心、带宽租用、云主机、机柜租用、主机租用托管、CDN网站加速、国际域名空间等业务的一体化完整服务。电话咨询:18982081108

Github:Tetris

代码:

# -*- coding:utf-8 -*-

import pygame, sys, random, copy
from pygame.locals import *

pygame.init()

CubeWidth = 40
CubeHeight = 40
Column = 10
Row = 20
ScreenWidth = CubeWidth * (Column + 5)
ScreenHeight = CubeHeight * Row
ScreenSize = (ScreenWidth, ScreenHeight)
Screen = pygame.display.set_mode(ScreenSize, 0, 32)
pygame.display.set_caption("Ly's Tetris")

pygame.mixer.music.load('BackgroundMusic.ogg')
pygame.mixer.music.play(-1, 0.0)
ClickMusic = pygame.mixer.Sound('ClickMusic.wav')
ExplodeMusic = pygame.mixer.Sound('Explode.wav')
BackgroundImg = pygame.image.load('BackgroundImg.png').convert()
PreImg = pygame.image.load('PreImg.png').convert()
PStartImg = pygame.image.load('PStartImg.png').convert()
ResultPreImg = pygame.image.load('GameResultPreBgImg.png').convert()
RestartImg = pygame.image.load('GameResultRestBgImg.png').convert()
ScoreHintFont = pygame.font.SysFont('arial', 50)
ScoreFont = pygame.font.SysFont('arial', 40)
ResultFont = pygame.font.SysFont('arial', 200)

Aquamarine = (127, 255, 212)
LightGoldenrod = (255, 236, 139)
IndianRed = (255, 106, 106)
DarkOrchid = (153, 50, 204)
RoyalBlue = (72, 118, 255)
DarkOrange = (255, 165, 0)
Turquoise = (0, 245, 255)

IsRect = []

FPSClock = pygame.time.Clock()

class I():
 def __init__(self):
 self.Statu = ''
 self.Color = Aquamarine
 self.Body = []
 x = random.randint(1, 2)
 if x == 1:
  self.Statu = 'upright'
  for i in range(4):
  InitBody = pygame.Rect(160, i * 40, 40, 40)
  self.Body.append(InitBody)
 elif x == 2:
  self.Statu = 'horizon'
  for i in range(4):
  InitBody = pygame.Rect(120 + i * 40, 0, 40, 40)
  self.Body.append(InitBody)

 def Fall(self):
 for rect in self.Body:
  rect.top += 40

 def IsFalled(self):
 for rect in self.Body:
  if rect.top == 760:
  return True
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
  return True

 def Move(self, Curkey):
 CanMoveFlag = True
 if Curkey == K_UP:
  self.Rotate()
 elif Curkey == K_LEFT:
  for rect in self.Body:
  if rect.left == 0:
   CanMoveFlag = not CanMoveFlag
   break
  elif IsRect[int(rect.top / 40) + 1][int(rect.left / 40) - 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left -= 40
 elif Curkey == K_RIGHT:
  for rect in self.Body:
  if rect.left == 360:
   CanMoveFlag = not CanMoveFlag
   break
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40) + 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left += 40

 def Rotate(self):
 if self.Statu == 'upright':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left -= 40
  TempRotate[0].top += 40
  TempRotate[2].left += 40
  TempRotate[2].top -= 40
  TempRotate[3].left += 40 * 2
  TempRotate[3].top -= 40 * 2
  IsRotate = True
  if TempRotate[0].left < 0:
  IsRotate = False
  if TempRotate[3].left > 360:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'horizon'
 else:
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left += 40
  TempRotate[0].top -= 40
  TempRotate[2].left -= 40
  TempRotate[2].top += 40
  TempRotate[3].left -= 40 * 2
  TempRotate[3].top += 40 * 2
  IsRotate = True
  if TempRotate[0].top < 0:
  IsRotate = False
  if TempRotate[3].top > 760:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'upright'

class O():
 def __init__(self):
 self.Color = LightGoldenrod
 self.Body = []
 for i in range(2):
  InitBody = pygame.Rect(160, i * 40, 40, 40)
  self.Body.append(InitBody)
 for i in range(2):
  InitBody = pygame.Rect(200, i * 40, 40, 40)
  self.Body.append(InitBody)

 def Fall(self):
 for rect in self.Body:
  rect.top += 40

 def IsFalled(self):
 for rect in self.Body:
  if rect.top == 760:
  return True
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
  return True

 def Move(self, Curkey):
 CanMoveFlag = True
 if Curkey == K_UP:
  self.Rotate()
 elif Curkey == K_LEFT:
  for rect in self.Body:
  if rect.left == 0:
   CanMoveFlag = not CanMoveFlag
   break
  elif IsRect[int(rect.top / 40) + 1][int(rect.left / 40) - 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left -= 40
 elif Curkey == K_RIGHT:
  for rect in self.Body:
  if rect.left == 360:
   CanMoveFlag = not CanMoveFlag
   break
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40) + 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left += 40

 def Rotate(self):
 pass

class T():
 def __init__(self):
 self.Statu = ''
 self.Color = IndianRed
 self.Body = []
 x = random.randint(1, 4)
 if x == 1:
  self.Statu = 'up'
  self.Body.append(pygame.Rect(200, 0, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(160 + i * 40, 40, 40, 40))
 elif x == 2:
  self.Statu = 'left'
  self.Body.append(pygame.Rect(160, 40, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(200, 80 - i * 40, 40, 40))
 elif x == 3:
  self.Statu = 'down'
  self.Body.append(pygame.Rect(200, 80, 40, 40))
  for i in range(2, -1, -1):
  self.Body.append(pygame.Rect(160 + i * 40, 40, 40, 40))
 elif x == 4:
  self.Statu = 'right'
  self.Body.append(pygame.Rect(240, 40, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(200, i * 40, 40, 40))

 def Fall(self):
 for rect in self.Body:
  rect.top += 40

 def IsFalled(self):
 for rect in self.Body:
  if rect.top == 760:
  return True
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
  return True

 def Move(self, Curkey):
 CanMoveFlag = True
 if Curkey == K_UP:
  self.Rotate()
 elif Curkey == K_LEFT:
  for rect in self.Body:
  if rect.left == 0:
   CanMoveFlag = not CanMoveFlag
   break
  elif IsRect[int(rect.top / 40) + 1][int(rect.left / 40) - 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left -= 40
 elif Curkey == K_RIGHT:
  for rect in self.Body:
  if rect.left == 360:
   CanMoveFlag = not CanMoveFlag
   break
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40) + 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left += 40

 def Rotate(self):
 if self.Statu == 'up':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left -= 40
  TempRotate[0].top += 40
  TempRotate[1].left += 40
  TempRotate[1].top += 40
  TempRotate[3].left -= 40
  TempRotate[3].top -= 40
  IsRotate = True
  if TempRotate[1].top > 760:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'left'
 elif self.Statu == 'left':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left += 40
  TempRotate[0].top += 40
  TempRotate[1].left += 40
  TempRotate[1].top -= 40
  TempRotate[3].left -= 40
  TempRotate[3].top += 40
  IsRotate = True
  if TempRotate[1].left > 360:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'down'
 elif self.Statu == 'down':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left += 40
  TempRotate[0].top -= 40
  TempRotate[1].left -= 40
  TempRotate[1].top -= 40
  TempRotate[3].left += 40
  TempRotate[3].top += 40
  IsRotate = True
  if TempRotate[1].top < 0:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'right'
 elif self.Statu == 'right':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left -= 40
  TempRotate[0].top -= 40
  TempRotate[1].left -= 40
  TempRotate[1].top += 40
  TempRotate[3].left += 40
  TempRotate[3].top -= 40
  IsRotate = True
  if TempRotate[1].top < 0:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'up'

class Z():
 def __init__(self):
 self.Statu = ''
 self.Color = DarkOrchid
 self.Body = []
 x = random.randint(1, 2)
 if x == 1:
  self.Statu = 'horizon'
  for i in range(2):
  self.Body.append(pygame.Rect(120 + i * 40, 0, 40, 40))
  for i in range(2):
  self.Body.append(pygame.Rect(160 + i * 40, 40, 40, 40))
 elif x == 2:
  self.Statu = 'upright'
  for i in range(2):
  self.Body.append(pygame.Rect(200, i * 40, 40, 40))
  for i in range(2):
  self.Body.append(pygame.Rect(160, 40 + i * 40, 40, 40))

 def Fall(self):
 for rect in self.Body:
  rect.top += 40

 def IsFalled(self):
 for rect in self.Body:
  if rect.top == 760:
  return True
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
  return True

 def Move(self, Curkey):
 CanMoveFlag = True
 if Curkey == K_UP:
  self.Rotate()
 elif Curkey == K_LEFT:
  for rect in self.Body:
  if rect.left == 0:
   CanMoveFlag = not CanMoveFlag
   break
  elif IsRect[int(rect.top / 40) + 1][int(rect.left / 40) - 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left -= 40
 elif Curkey == K_RIGHT:
  for rect in self.Body:
  if rect.left == 360:
   CanMoveFlag = not CanMoveFlag
   break
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40) + 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left += 40

 def Rotate(self):
 if self.Statu == 'horizon':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left += 40 * 2
  TempRotate[1].left += 40
  TempRotate[1].top += 40
  TempRotate[3].left -= 40
  TempRotate[3].top += 40
  IsRotate = True
  if TempRotate[3].top > 760:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'upright'
 elif self.Statu == 'upright':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left -= 40 * 2
  TempRotate[1].left -= 40
  TempRotate[1].top -= 40
  TempRotate[3].left += 40
  TempRotate[3].top -= 40
  IsRotate = True
  if TempRotate[0].left < 0:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'horizon'

class S():
 def __init__(self):
 self.Statu = ''
 self.Color = DarkOrchid
 self.Body = []
 x = random.randint(1, 2)
 if x == 1:
  self.Statu = 'horizon'
  for i in range(2):
  self.Body.append(pygame.Rect(200 - i * 40, 0, 40, 40))
  for i in range(2):
  self.Body.append(pygame.Rect(160 - i * 40, 40, 40, 40))
 elif x == 2:
  self.Statu = 'upright'
  for i in range(2):
  self.Body.append(pygame.Rect(120, i * 40, 40, 40))
  for i in range(2):
  self.Body.append(pygame.Rect(160, 40 + i * 40, 40, 40))

 def Fall(self):
 for rect in self.Body:
  rect.top += 40

 def IsFalled(self):
 for rect in self.Body:
  if rect.top == 760:
  return True
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
  return True

 def Move(self, Curkey):
 CanMoveFlag = True
 if Curkey == K_UP:
  self.Rotate()
 elif Curkey == K_LEFT:
  for rect in self.Body:
  if rect.left == 0:
   CanMoveFlag = not CanMoveFlag
   break
  elif IsRect[int(rect.top / 40) + 1][int(rect.left / 40) - 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left -= 40
 elif Curkey == K_RIGHT:
  for rect in self.Body:
  if rect.left == 360:
   CanMoveFlag = not CanMoveFlag
   break
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40) + 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left += 40

 def Rotate(self):
 if self.Statu == 'horizon':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left -= 40 * 2
  TempRotate[1].left -= 40
  TempRotate[1].top += 40
  TempRotate[3].left += 40
  TempRotate[3].top += 40
  IsRotate = True
  if TempRotate[3].top > 760:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'upright'
 elif self.Statu == 'upright':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left += 40 * 2
  TempRotate[1].left += 40
  TempRotate[1].top -= 40
  TempRotate[3].left -= 40
  TempRotate[3].top -= 40
  IsRotate = True
  if TempRotate[0].left > 360:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'horizon'

class L():
 def __init__(self):
 self.Statu = ''
 self.Color = DarkOrange
 self.Body = []
 x = random.randint(1, 4)
 if x == 1:
  self.Statu = 'horizonright'
  self.Body.append(pygame.Rect(120, 0, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(120 + i * 40, 40, 40, 40))
 elif x == 2:
  self.Statu = 'uprightup'
  self.Body.append(pygame.Rect(120, 80, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(160, 80 - i * 40, 40, 40))
 elif x == 3:
  self.Statu = 'horizonleft'
  self.Body.append(pygame.Rect(200, 40, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(200 - i * 40, 0, 40, 40))
 elif x == 4:
  self.Statu = 'uprightdown'
  self.Body.append(pygame.Rect(160, 0, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(120, i * 40, 40, 40))

 def Fall(self):
 for rect in self.Body:
  rect.top += 40

 def IsFalled(self):
 for rect in self.Body:
  if rect.top == 760:
  return True
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
  return True

 def Move(self, Curkey):
 CanMoveFlag = True
 if Curkey == K_UP:
  self.Rotate()
 elif Curkey == K_LEFT:
  for rect in self.Body:
  if rect.left == 0:
   CanMoveFlag = not CanMoveFlag
   break
  elif IsRect[int(rect.top / 40) + 1][int(rect.left / 40) - 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left -= 40
 elif Curkey == K_RIGHT:
  for rect in self.Body:
  if rect.left == 360:
   CanMoveFlag = not CanMoveFlag
   break
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40) + 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left += 40

 def Rotate(self):
 if self.Statu == 'horizonright':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left -= 40
  TempRotate[0].top += 40
  TempRotate[2].left -= 40
  TempRotate[2].top -= 40
  TempRotate[3].left -= 40 * 2
  TempRotate[3].top -= 40 * 2
  IsRotate = True
  if TempRotate[0].left < 0:
  IsRotate = False
  if TempRotate[3].top < 0:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'uprightup'
 elif self.Statu == 'uprightup':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left += 40
  TempRotate[0].top += 40
  TempRotate[2].left -= 40
  TempRotate[2].top += 40
  TempRotate[3].left -= 40 * 2
  TempRotate[3].top += 40 * 2
  IsRotate = True
  if TempRotate[3].left < 0:
  IsRotate = False
  if TempRotate[0].top > 760:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'horizonleft'
 elif self.Statu == 'horizonleft':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left += 40
  TempRotate[0].top -= 40
  TempRotate[2].left += 40
  TempRotate[2].top += 40
  TempRotate[3].left += 40 * 2
  TempRotate[3].top += 40 * 2
  IsRotate = True
  if TempRotate[0].left > 360:
  IsRotate = False
  if TempRotate[3].top > 760:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'uprightdown'
 elif self.Statu == 'uprightdown':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left -= 40
  TempRotate[0].top -= 40
  TempRotate[2].left += 40
  TempRotate[2].top -= 40
  TempRotate[3].left += 40 * 2
  TempRotate[3].top -= 40 * 2
  IsRotate = True
  if TempRotate[0].top < 0:
  IsRotate = False
  if TempRotate[3].left > 360:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'horizonright'

class J():
 def __init__(self):
 self.Statu = ''
 self.Color = Turquoise
 self.Body = []
 x = random.randint(1, 4)
 if x == 1:
  self.Statu = 'horizonleft'
  self.Body.append(pygame.Rect(200, 0, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(200 - i * 40, 40, 40, 40))
 elif x == 2:
  self.Statu = 'uprightup'
  self.Body.append(pygame.Rect(240, 80, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(200, 80 - i * 40, 40, 40))
 elif x == 3:
  self.Statu = 'horizonright'
  self.Body.append(pygame.Rect(120, 40, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(120 + i * 40, 0, 40, 40))
 elif x == 4:
  self.Statu = 'uprightdown'
  self.Body.append(pygame.Rect(120, 0, 40, 40))
  for i in range(3):
  self.Body.append(pygame.Rect(160, i * 40, 40, 40))

 def Fall(self):
 for rect in self.Body:
  rect.top += 40

 def IsFalled(self):
 for rect in self.Body:
  if rect.top == 760:
  return True
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
  return True

 def Move(self, Curkey):
 CanMoveFlag = True
 if Curkey == K_UP:
  self.Rotate()
 elif Curkey == K_LEFT:
  for rect in self.Body:
  if rect.left == 0:
   CanMoveFlag = not CanMoveFlag
   break
  elif IsRect[int(rect.top / 40) + 1][int(rect.left / 40) - 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left -= 40
 elif Curkey == K_RIGHT:
  for rect in self.Body:
  if rect.left == 360:
   CanMoveFlag = not CanMoveFlag
   break
  if IsRect[int(rect.top / 40) + 1][int(rect.left / 40) + 1]:
   CanMoveFlag = not CanMoveFlag
   break
  if CanMoveFlag:
  for rect in self.Body:
   rect.left += 40

 def Rotate(self):
 if self.Statu == 'horizonleft':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left += 40
  TempRotate[0].top += 40
  TempRotate[2].left += 40
  TempRotate[2].top -= 40
  TempRotate[3].left += 40 * 2
  TempRotate[3].top -= 40 * 2
  IsRotate = True
  if TempRotate[0].left > 360:
  IsRotate = False
  if TempRotate[3].top < 0:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'uprightup'
 elif self.Statu == 'uprightup':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left -= 40
  TempRotate[0].top += 40
  TempRotate[2].left += 40
  TempRotate[2].top += 40
  TempRotate[3].left += 40 * 2
  TempRotate[3].top += 40 * 2
  IsRotate = True
  if TempRotate[3].left > 360:
  IsRotate = False
  if TempRotate[0].top > 760:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'horizonright'
 elif self.Statu == 'horizonright':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left -= 40
  TempRotate[0].top -= 40
  TempRotate[2].left -= 40
  TempRotate[2].top += 40
  TempRotate[3].left -= 40 * 2
  TempRotate[3].top += 40 * 2
  IsRotate = True
  if TempRotate[0].left < 0:
  IsRotate = False
  if TempRotate[3].top > 760:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'uprightdown'
 elif self.Statu == 'uprightdown':
  TempRotate = copy.deepcopy(self.Body)
  TempRotate[0].left += 40
  TempRotate[0].top -= 40
  TempRotate[2].left -= 40
  TempRotate[2].top -= 40
  TempRotate[3].left -= 40 * 2
  TempRotate[3].top -= 40 * 2
  IsRotate = True
  if TempRotate[0].top < 0:
  IsRotate = False
  if TempRotate[3].left < 0:
  IsRotate = False
  if IsRotate:
  for rect in TempRotate:
   if IsRect[int(rect.top / 40) + 1][int(rect.left / 40)]:
   IsRotate = False
   break
  if IsRotate:
  self.Body = copy.deepcopy(TempRotate)
  self.Statu = 'horizonleft'

def ShapeChoose():
 ShapeChoose = random.randint(1, 7)
 if ShapeChoose == 1:
 return I()
 elif ShapeChoose == 2:
 return O()
 elif ShapeChoose == 3:
 return T()
 elif ShapeChoose == 4:
 return Z()
 elif ShapeChoose == 5:
 return S()
 elif ShapeChoose == 6:
 return L()
 elif ShapeChoose == 7:
 return J()

def GameMain():
 global IsRect
 for row in range(21):
 TempRowIsRect = []
 for column in range(11):
  TempRowIsRect.append(False)
 IsRect.append(TempRowIsRect)

 PreBackgroundImg = PreImg
 while True:
 StarFalg = False
 for event in pygame.event.get():
  if event.type == QUIT:
  pygame.quit()
  sys.exit()
  if event.type == KEYDOWN:
  ClickMusic.play()
  if event.key == K_SPACE:
   PreBackgroundImg = PStartImg
  if event.type == KEYUP:
  ClickMusic.play()
  if event.key == K_SPACE:
   StarFalg = True
 if StarFalg:
  break

 Screen.blit(PreBackgroundImg, (0, 0))
 pygame.display.update()

 falling = ShapeChoose()

 GameOver = False
 Score = 0
 FallSpeed = 4

 while True: # main game loop
 for event in pygame.event.get():
  if event.type == QUIT:
  pygame.quit()
  sys.exit()
  if event.type == KEYDOWN:
  if event.key == K_DOWN:
   FallSpeed = 15
  else:
   falling.Move(event.key)
  if event.type == KEYUP:
  if event.key == K_DOWN:
   FallSpeed = 4

 Screen.blit(BackgroundImg, (0, 0))

 for row in range(20):
  for column in range(10):
  if IsRect[row][column]:
   pygame.draw.rect(Screen, IsRect[row][column][1], IsRect[row][column][0], 0)

 falling.Fall()

 for rect in falling.Body:
  pygame.draw.rect(Screen, falling.Color, rect, 0)

 if falling.IsFalled():
  for rect in falling.Body:
  Info = []
  Info.append(rect)
  Info.append(falling.Color)
  IsRect[int(rect.top / 40)][int(rect.left / 40)] = Info
  falling = ShapeChoose()

 for IsOver in IsRect[1]:
  if IsOver:
  GameOver = True
  break
 if GameOver:
  IsRect = []
  return Score

 for CheckRow in range(19, 0, -1):
  CheckFlag = True
  for CheckC in range(10):
  if IsRect[CheckRow][CheckC]:
   pass
  else:
   CheckFlag = False
  if CheckFlag:
  ExplodeMusic.play()
  Score += 10
  for ChangeRow in range(CheckRow, 0, -1):
   for ChangeC in range(10):
   if IsRect[ChangeRow - 1][ChangeC]:
    IsRect[ChangeRow - 1][ChangeC][0].top += 40
   IsRect[ChangeRow] = IsRect[ChangeRow - 1]

 ScoreHintSurface = ScoreHintFont.render('Score:', True, (0, 0, 0))
 Screen.blit(ScoreHintSurface, (420, 100))
 ScoreSurface = ScoreFont.render(str(Score), True, (0, 0, 0))
 Screen.blit(ScoreSurface, (480, 180))

 pygame.display.update()
 FPSClock.tick(FallSpeed)

def GameResult(Score):
 ResultImg = ResultPreImg
 while True:
 for event in pygame.event.get():
  if event.type == QUIT:
  pygame.quit()
  sys.exit()
  if event.type == KEYDOWN:
  ClickMusic.play()
  if event.key == K_SPACE:
   ResultImg = RestartImg
  if event.type == KEYUP:
  ClickMusic.play()
  if event.key == K_SPACE:
   return True
 Screen.blit(ResultImg, (0, 0))
 ScoreSurface = ResultFont.render(str(Score), True, (255, 127, 80))
 if Score < 10:
  Screen.blit(ScoreSurface, (250, 260))
 elif Score < 100:
  Screen.blit(ScoreSurface, (210, 260))
 elif Score < 1000:
  Screen.blit(ScoreSurface, (160, 260))
 pygame.display.update()

if __name__ == '__main__':
 Flag = True
 while Flag:
 Score = GameMain()
 Flag = GameResult(Score)

文章名称:python和pygame实现简单俄罗斯方块游戏-创新互联
文章来源:http://scyanting.com/article/gicoo.html