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 相关文章推荐
Python SQLite3数据库操作类分享
Jun 10 Python
python实现web方式logview的方法
Aug 10 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 Python
python2.x实现人民币转大写人民币
Jun 20 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
python抓取京东小米8手机配置信息
Nov 13 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
Python read函数按字节(字符)读取文件的实现
Jul 03 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
Python 实现自动导入缺失的库
Oct 29 Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 Python
python中翻译功能translate模块实现方法
Dec 17 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分页显示制作详细讲解
2006/10/09 PHP
全文搜索和替换
2006/10/09 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
原生js实现电商侧边导航效果
2017/01/19 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
英国在线泳装店:Simply Swim
2019/05/05 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
人事助理岗位职责
2013/11/18 职场文书
企业文明单位申报材料
2014/05/16 职场文书
业务内勤岗位职责
2015/04/13 职场文书
晚会开场白和结束语
2015/05/29 职场文书
django上传文件的三种方式
2021/04/29 Python