You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
6.8 KiB
280 lines
6.8 KiB
6 months ago
|
import random
|
||
|
|
||
|
import pygame
|
||
|
|
||
|
BLACK = (0, 0, 0)
|
||
|
WHITE = (255, 255, 255)
|
||
|
GREEN = (0, 255, 0)
|
||
|
RED = (255, 0, 0)
|
||
|
|
||
|
pygame.init()
|
||
|
|
||
|
size = (700, 500)
|
||
|
screen = pygame.display.set_mode(size)
|
||
|
|
||
|
|
||
|
class Ball(object):
|
||
|
def __init__(self, screen, radius, x, y):
|
||
|
self.__screen = screen
|
||
|
self._radius = radius
|
||
|
self._xLoc = x
|
||
|
self._yLoc = y
|
||
|
self.__xVel = 7
|
||
|
self.__yVel = 2
|
||
|
w, h = pygame.display.get_surface().get_size()
|
||
|
self.__width = w
|
||
|
self.__height = h
|
||
|
|
||
|
def getXVel(self):
|
||
|
return self.__xVel
|
||
|
|
||
|
def getYVel(self):
|
||
|
return self.__yVel
|
||
|
|
||
|
def draw(self):
|
||
|
|
||
|
pygame.draw.circle(screen, (255, 0, 0), (self._xLoc, self._yLoc), self._radius)
|
||
|
|
||
|
def update(self, paddle, brickwall):
|
||
|
|
||
|
self._xLoc += self.__xVel
|
||
|
self._yLoc += self.__yVel
|
||
|
|
||
|
if self._xLoc <= self._radius:
|
||
|
self.__xVel *= -1
|
||
|
|
||
|
elif self._xLoc >= self.__width - self._radius:
|
||
|
self.__xVel *= -1
|
||
|
|
||
|
if self._yLoc <= self._radius:
|
||
|
self.__yVel *= -1
|
||
|
|
||
|
elif self._yLoc >= self.__width - self._radius:
|
||
|
return True
|
||
|
|
||
|
if brickwall.collide(self):
|
||
|
self.__yVel *= -1
|
||
|
|
||
|
paddleY = paddle._yLoc
|
||
|
paddleW = paddle._width
|
||
|
paddleH = paddle._height
|
||
|
paddleX = paddle._xLoc
|
||
|
ballX = self._xLoc
|
||
|
ballY = self._yLoc
|
||
|
|
||
|
if ((ballX + self._radius) >= paddleX and ballX <= (paddleX + paddleW)) and (
|
||
|
(ballY + self._radius) >= paddleY and ballY <= (paddleY + paddleH)
|
||
|
):
|
||
|
self.__yVel *= -1
|
||
|
|
||
|
return False
|
||
|
|
||
|
|
||
|
class Paddle(object):
|
||
|
def __init__(self, screen, width, height, x, y):
|
||
|
self.__screen = screen
|
||
|
self._width = width
|
||
|
self._height = height
|
||
|
self._xLoc = x
|
||
|
self._yLoc = y
|
||
|
w, h = pygame.display.get_surface().get_size()
|
||
|
self.__W = w
|
||
|
self.__H = h
|
||
|
|
||
|
def draw(self):
|
||
|
pygame.draw.rect(
|
||
|
screen, (0, 0, 0), (self._xLoc, self._yLoc, self._width, self._height), 0
|
||
|
)
|
||
|
|
||
|
def update(self):
|
||
|
x, y = pygame.mouse.get_pos()
|
||
|
if x >= 0 and x <= (self.__W - self._width):
|
||
|
self._xLoc = x
|
||
|
|
||
|
|
||
|
class Brick(pygame.sprite.Sprite):
|
||
|
def __init__(self, screen, width, height, x, y):
|
||
|
self.__screen = screen
|
||
|
self._width = width
|
||
|
self._height = height
|
||
|
self._xLoc = x
|
||
|
self._yLoc = y
|
||
|
w, h = pygame.display.get_surface().get_size()
|
||
|
self.__W = w
|
||
|
self.__H = h
|
||
|
self.__isInGroup = False
|
||
|
|
||
|
def draw(self):
|
||
|
|
||
|
pygame.draw.rect(
|
||
|
screen,
|
||
|
(56, 177, 237),
|
||
|
(self._xLoc, self._yLoc, self._width, self._height),
|
||
|
0,
|
||
|
)
|
||
|
|
||
|
def add(self, group):
|
||
|
|
||
|
group.add(self)
|
||
|
self.__isInGroup = True
|
||
|
|
||
|
def remove(self, group):
|
||
|
|
||
|
group.remove(self)
|
||
|
self.__isInGroup = False
|
||
|
|
||
|
def alive(self):
|
||
|
|
||
|
return self.__isInGroup
|
||
|
|
||
|
def collide(self, ball):
|
||
|
|
||
|
brickX = self._xLoc
|
||
|
brickY = self._yLoc
|
||
|
brickW = self._width
|
||
|
brickH = self._height
|
||
|
ballX = ball._xLoc
|
||
|
ballY = ball._yLoc
|
||
|
ballXVel = ball.getXVel()
|
||
|
ballYVel = ball.getYVel()
|
||
|
|
||
|
if (
|
||
|
(
|
||
|
(ballX + ball._radius) >= brickX and (ballX + ball._radius) <= (brickX + brickW)
|
||
|
) and (
|
||
|
(ballY - ball._radius) >= brickY and (ballY - ball._radius) <= (brickY + brickH)
|
||
|
)):
|
||
|
return True
|
||
|
else:
|
||
|
return False
|
||
|
|
||
|
|
||
|
class BrickWall(pygame.sprite.Group):
|
||
|
def __init__(self, screen, x, y, width, height):
|
||
|
self.__screen = screen
|
||
|
self._x = x
|
||
|
self._y = y
|
||
|
self._width = width
|
||
|
self._height = height
|
||
|
self._bricks = []
|
||
|
|
||
|
X = x
|
||
|
Y = y
|
||
|
for i in range(4):
|
||
|
for j in range(4):
|
||
|
self._bricks.append(Brick(screen, width, height, X, Y))
|
||
|
X += width + (width / 7.0)
|
||
|
|
||
|
Y += height + (height / 7.0)
|
||
|
X = x
|
||
|
|
||
|
def add(self, brick):
|
||
|
|
||
|
self._bricks.append(brick)
|
||
|
|
||
|
def remove(self, brick):
|
||
|
|
||
|
self._bricks.remove(brick)
|
||
|
|
||
|
def draw(self):
|
||
|
|
||
|
for brick in self._bricks:
|
||
|
if brick != None:
|
||
|
brick.draw()
|
||
|
|
||
|
def update(self, ball):
|
||
|
|
||
|
for i in range(len(self._bricks)):
|
||
|
if (self._bricks[i] != None) and self._bricks[i].collide(ball):
|
||
|
self._bricks[i] = None
|
||
|
|
||
|
for brick in self._bricks:
|
||
|
if brick is None:
|
||
|
self._bricks.remove(brick)
|
||
|
|
||
|
def hasWin(self):
|
||
|
|
||
|
return len(self._bricks) == 0
|
||
|
|
||
|
def collide(self, ball):
|
||
|
|
||
|
for brick in self._bricks:
|
||
|
if brick.collide(ball):
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
|
||
|
ball = Ball(screen, 25, random.randint(1, 700), 250)
|
||
|
paddle = Paddle(screen, 100, 20, 250, 450)
|
||
|
brickWall = BrickWall(screen, 25, 25, 150, 50)
|
||
|
|
||
|
isGameOver = False
|
||
|
gameStatus = True
|
||
|
|
||
|
score = 0
|
||
|
|
||
|
pygame.display.set_caption("砖块游戏-作者匡昊-有需要联系15576337262")
|
||
|
|
||
|
done = False
|
||
|
|
||
|
clock = pygame.time.Clock()
|
||
|
|
||
|
pygame.font.init()
|
||
|
|
||
|
mgGameOver = pygame.font.SysFont("Fangsong", 50)
|
||
|
|
||
|
mgWin = pygame.font.SysFont("Fangsong", 50)
|
||
|
|
||
|
mgScore = pygame.font.SysFont("Fangsong", 30)
|
||
|
|
||
|
textsurfaceGameOver = mgGameOver.render("Game Over!", False, (0, 0, 0))
|
||
|
textsurfaceWin = mgWin.render("You win!", False, (0, 0, 0))
|
||
|
textsurfaceScore = mgScore.render("score: " + str(score), False, (0, 0, 0))
|
||
|
|
||
|
while not done:
|
||
|
|
||
|
for event in pygame.event.get():
|
||
|
if event.type == pygame.QUIT:
|
||
|
done = True
|
||
|
|
||
|
screen.fill(WHITE)
|
||
|
|
||
|
if gameStatus:
|
||
|
|
||
|
brickWall.draw()
|
||
|
|
||
|
if brickWall.collide(ball):
|
||
|
score += 10
|
||
|
textsurfaceScore = mgScore.render("score: " + str(score), False, (0, 0, 0))
|
||
|
screen.blit(textsurfaceScore, (550, 0))
|
||
|
|
||
|
brickWall.update(ball)
|
||
|
|
||
|
paddle.draw()
|
||
|
paddle.update()
|
||
|
|
||
|
if ball.update(paddle, brickWall):
|
||
|
isGameOver = True
|
||
|
gameStatus = False
|
||
|
|
||
|
if brickWall.hasWin():
|
||
|
gameStatus = False
|
||
|
|
||
|
ball.draw()
|
||
|
|
||
|
else:
|
||
|
if isGameOver:
|
||
|
screen.blit(textsurfaceGameOver, (0, 0))
|
||
|
textsurfaceScore = mgScore.render("score: " + str(score), False, (0, 0, 0))
|
||
|
screen.blit(textsurfaceScore, (300, 0))
|
||
|
elif brickWall.hasWin():
|
||
|
screen.blit(textsurfaceWin, (0, 0))
|
||
|
textsurfaceScore = mgScore.render("score: " + str(score), False, (0, 0, 0))
|
||
|
screen.blit(textsurfaceScore, (300, 0))
|
||
|
|
||
|
pygame.display.flip()
|
||
|
|
||
|
clock.tick(60)
|
||
|
|
||
|
pygame.quit()
|