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

本文为大家分享了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)

运行结果:

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

(0)

相关推荐

  • python实现俄罗斯方块游戏

    在公司实习.公司推崇Python和Django框架,所以也得跟着学点. 简单瞅了下Tkinter,和Canvas配合在一起,还算是简洁的界面开发API.threading.Thread创建新的线程,其多线程机制也算是方便. 只是canvas.create_rectangle居然不是绘制矩形,而是新建了矩形控件这点让人大跌眼镜.先开始,在线程里每次都重绘多个矩形(随数组变化),其实是每次都新建了N个矩形,结果内存暴增.原来,对矩形进行变更时,只需用canvas.itemconfig即可. 下面就是

  • Python小游戏之300行代码实现俄罗斯方块

    前言 本文代码基于 python3.6 和 pygame1.9.4. 俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块.但是想到旋转,停靠,消除等操作,感觉好像很难啊,等真正写完了发现,一共也就 300 行代码,并没有什么难的. 先来看一个游戏截图,有点丑,好吧,我没啥美术细胞,但是主体功能都实现了,可以玩起来. 现在来看一下实现的过程. 外形 俄罗斯方块整个界面分为两部分,一部分是左边的游戏区域,另一部分是右边的显示区域,显示得分.速度.下一个方块样式等.

  • python实现俄罗斯方块

    网上搜到一个Pygame写的俄罗斯方块(tetris),大部分看懂的前提下增加了注释,Fedora19下运行OK的 主程序: #coding:utf8 #! /usr/bin/env python # 注释说明:shape表示一个俄罗斯方块形状 cell表示一个小方块 import sys from random import choice import pygame from pygame.locals import * from block import O, I, S, Z, L, J,

  • Python使用pygame模块编写俄罗斯方块游戏的代码实例

    文章先介绍了关于俄罗斯方块游戏的几个术语. 边框--由10*20个空格组成,方块就落在这里面. 盒子--组成方块的其中小方块,是组成方块的基本单元. 方块--从边框顶掉下的东西,游戏者可以翻转和改变位置.每个方块由4个盒子组成. 形状--不同类型的方块.这里形状的名字被叫做T, S, Z ,J, L, I , O.如下图所示: 模版--用一个列表存放形状被翻转后的所有可能样式.全部存放在变量里,变量名字如S_SHAPE_TEMPLATE or J_SHAPE_TEMPLATE 着陆--当一个方块

  • 用Python编写一个简单的俄罗斯方块游戏的教程

    俄罗斯方块游戏,使用Python实现,总共有350+行代码,实现了俄罗斯方块游戏的基本功能,同时会记录所花费时间,消去的总行数,所得的总分,还包括一个排行榜,可以查看最高记录. 排行榜中包含一系列的统计功能,如单位时间消去的行数,单位时间得分等. 附源码: from Tkinter import * from tkMessageBox import * import random import time #俄罗斯方块界面的高度 HEIGHT = 18 #俄罗斯方块界面的宽度 WIDTH = 10

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

    本文为大家分享了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) S

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

    本文实例为大家分享了python实现简单俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 import pygame,sys,random,time all_block = [[[0,0],[0,-1],[0,1],[0,2]],         [[0,0],[0,1],[1,1],[1,0]],         [[0,0],[0,-1],[-1,0],[-1,1]],          [[0,0],[0,1],[-1,-1],[-1,0]],           [[0,0],[0,1

  • 使用python和pygame制作挡板弹球游戏

    python是个很有趣的语言,可以在cmd命令窗口运行,还有很多的功能强大的模块. 学了一天pygame,用python和pygame写一个简单的挡板弹球游戏. 2018年6月21日 00:15:21 GitHub: EasyBaffleBallGame # -*- coding:utf-8 -*- from sys import exit import pygame from pygame.locals import * pygame.init() # 创建窗口 ScreenWidth = 5

  • Python实现AI自动玩俄罗斯方块游戏

    目录 导语 正文 1)Tetris.py 2)Tetris_model.py​​ 3)Tetris_ai.py​​ 效果展示 导语 提到<俄罗斯方块>(Tetris),那真是几乎无人不知无人不晓.​ 其历史之悠久,可玩性之持久,能手轻轻一挥,吊打一大波游戏. 对于绝大多数小友而言,<俄罗斯方块>的规则根本无需多言——将形状不一的方块填满一行消除即可. 这款火了30几年的<俄罗斯方块>游戏之前就已经写过的哈,往期的Pygame合集里面可以找找看! 但今天木木子介绍的是&l

  • Python基于pygame实现的font游戏字体(附源码)

    本文实例讲述了Python基于pygame实现的font游戏字体.分享给大家供大家参考,具体如下: 在pygame游戏开发中,一个友好的UI中,漂亮的字体是少不了的 今天就给大伙带来有关pygame中字体的一些介绍说明 首先我们得判断一下我们的pygame中有没有font这个模块 复制代码 代码如下: if not pygame.font: print('Warning, fonts disabled') 如果有的话才可以进行接下来的操作:-) 我们可以这样使用pygame中的字体: 复制代码

  • pygame实现简单五子棋游戏

    本文实例为大家分享了pygame实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 看代码: ①Gomuku2.py: import sys import random import pygame from pygame.locals import * import pygame.gfxdraw from checkerboard import Checkerboard, BLACK_CHESSMAN, WHITE_CHESSMAN, offset, Point SIZE = 30  # 棋

  • 教你使用Python的pygame模块实现拼图游戏

    目录 pygame介绍 安装pygame pygame常用模块 pygame入门案例 pygame实现拼图游戏 总结 pygame介绍 Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows.Linux.Mac OS 等操作系统,具有良好的跨平台性.Pygame 由 Pete Shinners 于 2000 年开发而成,是一款免费.开源的的软件包,因此您可以放心地使用它来开发游戏,不用担心有任何费用产生. Pygame 在 SDL(Simple Di

  • Python加pyGame实现的简单拼图游戏实例

    本文实例讲述了Python加pyGame实现的简单拼图游戏.分享给大家供大家参考.具体实现方法如下: import pygame, sys, random from pygame.locals import * # 一些常量 WINDOWWIDTH = 500 WINDOWHEIGHT = 500 BACKGROUNDCOLOR = (255, 255, 255) BLUE = (0, 0, 255) BLACK = (0, 0, 0) FPS = 40 VHNUMS = 3 CELLNUMS

  • Python+Pygame实现简单的射击小游戏

    目录 前言 一.运行环境 二.代码展示 ​三.效果展示 1)游戏界面 2)击中效果 3)+3分 前言 哈喽!哈喽.栗子上线啦~ 要说什么游戏能够获得大家的喜爱? 唯射击游戏莫属.此前大火手游的<刺激战场>当然现在是叫做<和平精英>啦,想当初我也是第一批下载的老玩家了!射击游戏加上丰富的地图不同的体验那是相当的有趣好玩儿. 玩家在射击游戏中,通过瞄准,击杀敌人,能够获得及时的爽感反馈.射击游戏很早就在游戏圈占据一席之地啦~ 今天的游戏代码灵感就是来源于此哦,简约简约,大制作小编一个程

随机推荐