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中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
Python中标准模块importlib详解
Apr 16 Python
Python列表list排列组合操作示例
Dec 18 Python
python 内置模块详解
Jan 01 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 Python
实例详解Python模块decimal
Jun 26 Python
python中time库的实例使用方法
Oct 31 Python
python groupby 函数 as_index详解
Dec 16 Python
python烟花效果的代码实例
Feb 25 Python
简单了解Python多态与属性运行原理
Jun 15 Python
python中tab键是什么意思
Jun 18 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
杏林同学录(六)
2006/10/09 PHP
用PHP查询域名状态whois的类
2006/11/25 PHP
利用static实现表格的颜色隔行显示的代码
2007/09/02 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
javascript 写类方式之九
2009/07/05 Javascript
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
javascript 闭包疑问
2010/12/30 Javascript
完美解决IE低版本不支持call与apply的问题
2013/12/05 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
js中this的用法实例分析
2015/01/10 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
JavaScript定义函数的三种实现方法
2017/09/23 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
大学四年学习的自我评价分享
2013/12/09 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
2014年英语工作总结
2014/12/20 职场文书
CSS实现漂亮的时钟动画效果的实例代码
2021/03/30 HTML / CSS