欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python和pygame实现简单俄罗斯方块游戏

程序员文章站 2023-11-07 16:53:40
本文为大家分享了python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 Github: 代码: # -*- coding:utf-8 -*-...

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

Github:

代码:

# -*- 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实现简单俄罗斯方块游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。