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


Posted in Python onFebruary 19, 2021

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

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

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

Python 相关文章推荐
http请求 request失败自动重新尝试代码示例
Jan 25 Python
解决Matplotlib图表不能在Pycharm中显示的问题
May 24 Python
python生成lmdb格式的文件实例
Nov 08 Python
python使用magic模块进行文件类型识别方法
Dec 08 Python
python3.4爬虫demo
Jan 22 Python
python爬取cnvd漏洞库信息的实例
Feb 14 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
Python字符串格式化输出代码实例
Nov 22 Python
Python参数传递及收集机制原理解析
Jun 05 Python
Django 构建模板form表单的两种方法
Jun 14 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
python Scrapy爬虫框架的使用
Jan 21 Python
解决python读取几千万行的大表内存问题
Jun 26 #Python
详解Python3的TFTP文件传输
Jun 26 #Python
python3爬取数据至mysql的方法
Jun 26 #Python
python清除函数占用的内存方法
Jun 25 #Python
Python IDLE清空窗口的实例
Jun 25 #Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 #Python
PyCharm代码整体缩进,反向缩进的方法
Jun 25 #Python
You might like
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
cmd下运行php脚本
2008/11/25 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
javascript FormatNumber函数实现方法
2008/12/30 Javascript
几个javascript操作word的参考代码
2009/10/26 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
JS获取Table中td值的方法
2015/03/19 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
原生JavaScript实现换肤
2021/02/19 Javascript
python写xml文件的操作实例
2014/10/05 Python
调试Python程序代码的几种方法总结
2015/04/28 Python
python 中split 和 strip的实例详解
2017/07/12 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
2017/07/22 Python
Python基础教程之异常详解
2019/01/10 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
python异常处理和日志处理方式
2019/12/24 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
委托书范本格式
2019/04/18 职场文书
python 如何做一个识别率百分百的OCR
2021/05/29 Python
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis