[Python] 纯文本查看 复制代码
import pygame
import random
import math
# 初始化pygame
pygame.init()
# 设置窗口
width, height = 800, 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("小车向前冲")
# 定义颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
# 小车类
class Car:
def __init__(self):
self.width = 50
self.height = 100
self.rect = pygame.Rect(width // 2 - self.width // 2, height - self.height - 10, self.width, self.height)
def move(self, dx):
self.rect.x += dx
# 边界检查
if self.rect.left < 0:
self.rect.left = 0
elif self.rect.right > width:
self.rect.right = width
def draw(self, surface):
pygame.draw.rect(surface, RED, self.rect) # 绘制小车
# 障碍物基类
class Obstacle:
def __init__(self, durability):
self.durability = durability
def hit(self):
self.durability -= 1
def is_destroyed(self):
return self.durability <= 0
# 方形障碍物类
class SquareObstacle(Obstacle):
def __init__(self):
super().__init__(1) # 方形打1下死
self.size = 50
self.rect = pygame.Rect(random.randint(0, width - self.size), -self.size, self.size, self.size)
def move(self):
self.rect.y += 5
def draw(self, surface):
pygame.draw.rect(surface, BLACK, self.rect)
# 三角形障碍物类
class TriangleObstacle(Obstacle):
def __init__(self):
super().__init__(5) # 三角形打5下死
self.size = 50
self.rect = pygame.Rect(random.randint(0, width - self.size), -self.size, self.size, self.size)
def move(self):
self.rect.y += 5
def draw(self, surface):
points = [(self.rect.x, self.rect.y + self.size),
(self.rect.x + self.size // 2, self.rect.y),
(self.rect.x + self.size, self.rect.y + self.size)]
pygame.draw.polygon(surface, BLACK, points)
# 圆形障碍物类
class CircleObstacle(Obstacle):
def __init__(self):
super().__init__(10) # 圆形打10下死
self.radius = 25
self.rect = pygame.Rect(random.randint(0, width - self.radius * 2), -self.radius * 2, self.radius * 2, self.radius * 2)
def move(self):
self.rect.y += 5
def draw(self, surface):
pygame.draw.circle(surface, BLACK, (self.rect.centerx, self.rect.centery), self.radius)
# 子弹类
class Bullet:
def __init__(self, x, y):
self.width = 5
self.height = 10
self.rect = pygame.Rect(x, y, self.width, self.height)
def move(self):
self.rect.y -= 10 # 子弹的移动速度
def draw(self, surface):
pygame.draw.rect(surface, BLUE, self.rect) # 绘制子弹
# 游戏主循环
def main():
clock = pygame.time.Clock()
car = Car()
obstacles = []
bullets = []
score = 0
lives = 10 # 玩家初始生命值
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
car.move(-5)
if keys[pygame.K_RIGHT]:
car.move(5)
# 发射子弹
if keys[pygame.K_SPACE]:
bullets.append(Bullet(car.rect.centerx, car.rect.top))
# 随机生成障碍物
if random.randint(1, 30) == 1: # 控制生成频率
obstacle_type = random.choice([SquareObstacle, TriangleObstacle, CircleObstacle])
obstacles.append(obstacle_type())
# 更新子弹和障碍物
for bullet in bullets:
bullet.move()
if bullet.rect.bottom < 0: # 移除超出屏幕的子弹
bullets.remove(bullet)
for obstacle in obstacles:
obstacle.move()
if obstacle.rect.top > height: # 移除超出屏幕的障碍物
obstacles.remove(obstacle)
score += 1 # 得分加一
# 碰撞检测
for obstacle in obstacles:
if car.rect.colliderect(obstacle.rect):
lives -= 1 # 生命值减1
obstacles.remove(obstacle) # 碰撞后移除障碍物
if lives <= 0:
running = False # 生命值为0时游戏结束
# 子弹与障碍物碰撞检测
for bullet in bullets:
for obstacle in obstacles:
if bullet.rect.colliderect(obstacle.rect):
obstacle.hit() # 击中障碍物
bullets.remove(bullet) # 移除击中的子弹
if obstacle.is_destroyed(): # 如果障碍物被打掉
obstacles.remove(obstacle) # 移除障碍物
score += 1 # 击中得分
break
# 绘制
screen.fill(WHITE)
car.draw(screen)
for obstacle in obstacles:
obstacle.draw(screen)
for bullet in bullets:
bullet.draw(screen)
# 显示得分和生命值
font = pygame.font.Font(None, 36)
score_text = font.render(f"得分: {score}", True, BLACK)
lives_text = font.render(f"生命: {lives}", True, BLACK)
screen.blit(score_text, (10, 10))
screen.blit(lives_text, (10, 50))
pygame.display.flip()
clock.tick(60)
pygame.quit()
if __name__ == "__main__":
main()