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批量导出导入MySQL用户的方法
Nov 15 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
python实现学生管理系统
Jan 11 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
python3 深浅copy对比详解
Aug 12 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
python两个_多个字典合并相加的实例代码
Dec 26 Python
python logging.info在终端没输出的解决
May 12 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 Python
python 中[0]*2与0*2的区别说明
May 10 Python
教你如何用Python实现人脸识别(含源代码)
Jun 23 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下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
学习并汇集javascript匿名函数
2010/11/25 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
中止javascript执行的方法
2014/02/14 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
jQuery代码实现实时获取时间
2017/01/29 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
vue.js实现标签页切换效果
2018/06/07 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
2018/08/31 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
python妙用之编码的转换详解
2017/04/21 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
使用Pycharm分段执行代码
2020/04/15 Python
python新手学习可变和不可变对象
2020/06/11 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
说出一些常用的类,包,接口
2014/09/22 面试题
简历自荐信
2013/12/02 职场文书
小学三年级数学教学反思
2014/01/31 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书