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

作者:LY 时间:2022-10-04 20:00:49 

本文为大家分享了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实现简单俄罗斯方块游戏

来源:http://henuly.top/?p=462

标签:python,pygame,俄罗斯方块
0
投稿

猜你喜欢

  • 详解基于 axios 的 Vue 项目 http 请求优化

    2024-05-09 15:12:47
  • python glom模块的使用简介

    2021-08-21 10:22:02
  • Oracle数据库"记录被另一个用户锁住"解决方法(推荐)

    2024-01-19 18:33:25
  • 8 行 Node.js 代码实现代理服务器

    2024-04-22 22:37:34
  • WEB移动应用框架构想

    2010-09-28 16:26:00
  • Python中的map()函数和reduce()函数的用法

    2021-10-19 01:04:34
  • Selenium常见八大定位法总结

    2022-07-05 02:16:21
  • Oracle 查看表空间的大小及使用情况sql语句

    2023-07-14 20:06:31
  • PDO::beginTransaction讲解

    2023-06-06 00:57:46
  • jQuery 1.3的VS智能提示下载

    2009-01-18 12:54:00
  • Sql学习第三天——SQL 关于CTE(公用表达式)的递归查询使用

    2024-01-23 01:00:10
  • Node.js对MySQL数据库的增删改查实战记录

    2024-01-14 18:25:12
  • ASP程序中使用断开的数据记录集

    2007-10-17 18:51:00
  • Mysql覆盖索引详解

    2024-01-14 06:54:29
  • mysql日志文件General_log和Binlog开启及详解

    2024-01-17 08:20:44
  • 检查access数据库中是否存在某个名字的表的asp代码

    2011-04-02 11:20:00
  • PHP实现的微信公众号扫码模拟登录功能示例

    2023-11-22 18:13:08
  • Python中的下划线详解

    2021-10-24 14:17:32
  • vue实现图片懒加载的方法分析

    2024-04-27 16:10:29
  • Selenium(Python web测试工具)基本用法详解

    2022-08-02 22:04:39
  • asp之家 网络编程 m.aspxhome.com