0、新年放烟花
import pygame
import random
import math# 初始化Pygame
pygame.init()# 设置窗口
WIDTH = 800
HEIGHT = 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("新年放烟花")# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)# 烟花粒子类
class Particle:def __init__(self, x, y, color):self.x = xself.y = yself.color = colorself.size = 2angle = random.uniform(0, math.pi * 2)speed = random.uniform(2, 6)self.vx = math.cos(angle) * speedself.vy = math.sin(angle) * speedself.lifetime = 100def update(self):self.x += self.vxself.y += self.vyself.vy += 0.1 # 重力效果self.lifetime -= 2return self.lifetime > 0def draw(self, screen):if self.lifetime > 0:alpha = int(self.lifetime * 2.55) # 淡出效果color = (self.color[0], self.color[1], self.color[2], alpha)surface = pygame.Surface((self.size * 2, self.size * 2), pygame.SRCALPHA)pygame.draw.circle(surface, color, (self.size, self.size), self.size)screen.blit(surface, (int(self.x - self.size), int(self.y - self.size)))# 烟花类
class Firework:def __init__(self, x, y):self.x = xself.y = HEIGHTself.target_y = yself.speed = -10self.particles = []self.exploded = Falseself.color = (random.randint(50, 255),random.randint(50, 255),random.randint(50, 255))def update(self):if not self.exploded:self.y += self.speedif self.y <= self.target_y:self.explode()particles_to_keep = []for particle in self.particles:if particle.update():particles_to_keep.append(particle)self.particles = particles_to_keepreturn len(self.particles) > 0 or not self.explodeddef explode(self):self.exploded = Truefor _ in range(50): # 创建50个粒子self.particles.append(Particle(self.x, self.y, self.color))def draw(self, screen):if not self.exploded:pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), 3)for particle in self.particles:particle.draw(screen)# 主游戏循环
def main():clock = pygame.time.Clock()fireworks = []running = Truewhile running:screen.fill(BLACK)for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.MOUSEBUTTONDOWN:x, y = pygame.mouse.get_pos()fireworks.append(Firework(x, y))# 随机添加烟花if random.random() < 0.03: # 3%的概率在每一帧添加新烟花x = random.randint(0, WIDTH)y = random.randint(HEIGHT//3, 2*HEIGHT//3)fireworks.append(Firework(x, y))# 更新和绘制烟花fireworks_to_keep = []for firework in fireworks:if firework.update():fireworks_to_keep.append(firework)firework.draw(screen)fireworks = fireworks_to_keeppygame.display.flip()clock.tick(60)pygame.quit()if __name__ == "__main__":main()
1、贪吃蛇
pip install pygame
import pygame
import random
import sys# 初始化Pygame
pygame.init()# 定义颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLACK = (0, 0, 0)# 游戏设置
WINDOW_WIDTH = 800 # 窗口宽度
WINDOW_HEIGHT = 600 # 窗口高度
GRID_SIZE = 20 # 网格大小
GRID_WIDTH = WINDOW_WIDTH // GRID_SIZE # 网格宽度
GRID_HEIGHT = WINDOW_HEIGHT // GRID_SIZE # 网格高度
SNAKE_SPEED = 5 # 速度# 创建游戏窗口
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption('贪吃蛇游戏')
clock = pygame.time.Clock()class Snake:def __init__(self):self.length = 3self.positions = []center_x = GRID_WIDTH // 2center_y = GRID_HEIGHT // 2for i in range(self.length):self.positions.append((center_x + i, center_y))self.direction = LEFTself.color = GREENself.score = 0def get_head_position(self):return self.positions[0]def update(self):cur = self.get_head_position()x, y = self.directionnew = ((cur[0] + x) % GRID_WIDTH, (cur[1] + y) % GRID_HEIGHT)if new in self.positions[3:]:return Falseself.positions.insert(0, new)if len(self.positions) > self.length:self.positions.pop()return Truedef reset(self):self.length = 3self.positions = []center_x = GRID_WIDTH // 2center_y = GRID_HEIGHT // 2for i in range(self.length):self.positions.append((center_x + i, center_y))self.direction = LEFTself.score = 0def render(self):for p in self.positions:pygame.draw.rect(screen, self.color, (p[0] * GRID_SIZE, p[1] * GRID_SIZE, GRID_SIZE, GRID_SIZE))class Food:def __init__(self):self.position = (0, 0)self.color = REDself.randomize_position()def randomize_position(self):self.position = (random.randint(0, GRID_WIDTH-1), random.randint(0, GRID_HEIGHT-1))def render(self):pygame.draw.rect(screen, self.color,(self.position[0] * GRID_SIZE, self.position[1] * GRID_SIZE, GRID_SIZE, GRID_SIZE))# 定义方向
UP = (0, -1)
DOWN = (0, 1)
LEFT = (-1, 0)
RIGHT = (1, 0)def main():snake = Snake()food = Food()font = pygame.font.Font(None, 36)while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP and snake.direction != DOWN:snake.direction = UPelif event.key == pygame.K_DOWN and snake.direction != UP:snake.direction = DOWNelif event.key == pygame.K_LEFT and snake.direction != RIGHT:snake.direction = LEFTelif event.key == pygame.K_RIGHT and snake.direction != LEFT:snake.direction = RIGHT# 更新蛇的位置if not snake.update():snake.reset()food.randomize_position()# 检查是否吃到食物if snake.get_head_position() == food.position:snake.length += 1snake.score += 1food.randomize_position()# 绘制screen.fill(BLACK)snake.render()food.render()# 显示分数score_text = font.render(f'分数: {snake.score}', True, WHITE)screen.blit(score_text, (10, 10))pygame.display.update()clock.tick(SNAKE_SPEED)if __name__ == '__main__':main()
2、俄罗斯方块
import pygame
import random# 初始化 Pygame
pygame.init()# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
CYAN = (0, 255, 255)
YELLOW = (255, 255, 0)
MAGENTA = (255, 0, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
ORANGE = (255, 165, 0)# 游戏参数
BLOCK_SIZE = 30
GRID_WIDTH = 10
GRID_HEIGHT = 20
SCREEN_WIDTH = BLOCK_SIZE * (GRID_WIDTH + 8)
SCREEN_HEIGHT = BLOCK_SIZE * GRID_HEIGHT# 方块形状定义
SHAPES = [[[1, 1, 1, 1]], # I[[1, 1], [1, 1]], # O[[1, 1, 1], [0, 1, 0]], # T[[1, 1, 1], [1, 0, 0]], # L[[1, 1, 1], [0, 0, 1]], # J[[1, 1, 0], [0, 1, 1]], # S[[0, 1, 1], [1, 1, 0]] # Z
]COLORS = [CYAN, YELLOW, MAGENTA, ORANGE, BLUE, GREEN, RED]class Tetris:def __init__(self):self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption("俄罗斯方块")self.clock = pygame.time.Clock()self.grid = [[0 for _ in range(GRID_WIDTH)] for _ in range(GRID_HEIGHT)]self.current_piece = Noneself.game_over = Falseself.score = 0self.level = 1self.fall_speed = 1000 # 初始下落速度(毫秒)self.last_fall_time = pygame.time.get_ticks()self.new_piece()def new_piece(self):# 随机选择新方块shape_idx = random.randint(0, len(SHAPES) - 1)self.current_piece = {'shape': SHAPES[shape_idx],'color': COLORS[shape_idx],'x': GRID_WIDTH // 2 - len(SHAPES[shape_idx][0]) // 2,'y': 0}# 检查游戏是否结束if not self.is_valid_move(self.current_piece['shape'], self.current_piece['x'], self.current_piece['y']):self.game_over = Truedef rotate_piece(self):# 旋转方块rows = len(self.current_piece['shape'])cols = len(self.current_piece['shape'][0])# 创建新的旋转后的矩阵rotated = [[0 for _ in range(rows)] for _ in range(cols)]# 执行90度顺时针旋转for i in range(rows):for j in range(cols):rotated[j][rows-1-i] = self.current_piece['shape'][i][j]if self.is_valid_move(rotated, self.current_piece['x'], self.current_piece['y']):self.current_piece['shape'] = rotateddef is_valid_move(self, shape, x, y):# 检查移动是否有效for i in range(len(shape)):for j in range(len(shape[0])):if shape[i][j]:if (y + i >= GRID_HEIGHT or x + j < 0 or x + j >= GRID_WIDTH or self.grid[y + i][x + j]):return Falsereturn Truedef merge_piece(self):# 将方块合并到网格中for i in range(len(self.current_piece['shape'])):for j in range(len(self.current_piece['shape'][0])):if self.current_piece['shape'][i][j]:self.grid[self.current_piece['y'] + i][self.current_piece['x'] + j] = self.current_piece['color']def clear_lines(self):# 清除完整的行lines_cleared = 0i = GRID_HEIGHT - 1while i >= 0:if all(self.grid[i]):lines_cleared += 1del self.grid[i]self.grid.insert(0, [0 for _ in range(GRID_WIDTH)])else:i -= 1# 更新分数if lines_cleared > 0:self.score += (100 * lines_cleared * self.level)self.level = self.score // 1000 + 1self.fall_speed = max(100, 1000 - (self.level - 1) * 100)def draw(self):self.screen.fill(BLACK)# 绘制网格for i in range(GRID_HEIGHT):for j in range(GRID_WIDTH):if self.grid[i][j]:pygame.draw.rect(self.screen, self.grid[i][j],[j * BLOCK_SIZE, i * BLOCK_SIZE, BLOCK_SIZE - 1, BLOCK_SIZE - 1])else:pygame.draw.rect(self.screen, WHITE,[j * BLOCK_SIZE, i * BLOCK_SIZE, BLOCK_SIZE - 1, BLOCK_SIZE - 1], 1)# 绘制当前方块if self.current_piece:for i in range(len(self.current_piece['shape'])):for j in range(len(self.current_piece['shape'][0])):if self.current_piece['shape'][i][j]:pygame.draw.rect(self.screen, self.current_piece['color'],[(self.current_piece['x'] + j) * BLOCK_SIZE,(self.current_piece['y'] + i) * BLOCK_SIZE,BLOCK_SIZE - 1, BLOCK_SIZE - 1])# 绘制分数和等级font = pygame.font.Font(None, 36)score_text = font.render(f'分数: {self.score}', True, WHITE)level_text = font.render(f'等级: {self.level}', True, WHITE)self.screen.blit(score_text, (GRID_WIDTH * BLOCK_SIZE + 10, 20))self.screen.blit(level_text, (GRID_WIDTH * BLOCK_SIZE + 10, 60))if self.game_over:game_over_text = font.render('游戏结束!', True, RED)self.screen.blit(game_over_text, (GRID_WIDTH * BLOCK_SIZE + 10, 100))pygame.display.flip()def run(self):while not self.game_over:current_time = pygame.time.get_ticks()for event in pygame.event.get():if event.type == pygame.QUIT:returnif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:if self.is_valid_move(self.current_piece['shape'], self.current_piece['x'] - 1, self.current_piece['y']):self.current_piece['x'] -= 1elif event.key == pygame.K_RIGHT:if self.is_valid_move(self.current_piece['shape'], self.current_piece['x'] + 1, self.current_piece['y']):self.current_piece['x'] += 1elif event.key == pygame.K_DOWN:if self.is_valid_move(self.current_piece['shape'], self.current_piece['x'], self.current_piece['y'] + 1):self.current_piece['y'] += 1elif event.key == pygame.K_UP:self.rotate_piece()elif event.key == pygame.K_SPACE:# 快速下落while self.is_valid_move(self.current_piece['shape'], self.current_piece['x'], self.current_piece['y'] + 1):self.current_piece['y'] += 1# 自动下落if current_time - self.last_fall_time > self.fall_speed:if self.is_valid_move(self.current_piece['shape'], self.current_piece['x'], self.current_piece['y'] + 1):self.current_piece['y'] += 1else:self.merge_piece()self.clear_lines()self.new_piece()self.last_fall_time = current_timeself.draw()self.clock.tick(60)# 游戏结束后等待几秒pygame.time.wait(2000)if __name__ == '__main__':game = Tetris()game.run()pygame.quit()
3、超级玛丽
import pygame
import sys# 初始化Pygame
pygame.init()# 设置窗口
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("超级玛丽")# 颜色定义
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BROWN = (139, 69, 19)# 玩家类
class Player(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image = pygame.Surface((30, 50))self.image.fill(RED)self.rect = self.image.get_rect()self.rect.x = 100self.rect.y = WINDOW_HEIGHT - 100self.velocity_y = 0self.jumping = Falseself.speed = 5def update(self):# 重力self.velocity_y += 0.8self.rect.y += self.velocity_y# 防止掉出屏幕底部if self.rect.bottom > WINDOW_HEIGHT - 50:self.rect.bottom = WINDOW_HEIGHT - 50self.velocity_y = 0self.jumping = False# 防止超出屏幕左右边界if self.rect.left < 0:self.rect.left = 0if self.rect.right > WINDOW_WIDTH:self.rect.right = WINDOW_WIDTHdef jump(self):if not self.jumping:self.velocity_y = -15self.jumping = True# 平台类
class Platform(pygame.sprite.Sprite):def __init__(self, x, y, width):super().__init__()self.image = pygame.Surface((width, 20))self.image.fill(GREEN)self.rect = self.image.get_rect()self.rect.x = xself.rect.y = y# 创建精灵组
all_sprites = pygame.sprite.Group()
platforms = pygame.sprite.Group()# 创建玩家
player = Player()
all_sprites.add(player)# 创建平台
ground = Platform(0, WINDOW_HEIGHT - 50, WINDOW_WIDTH)
platform1 = Platform(300, 400, 200)
platform2 = Platform(100, 300, 200)
platform3 = Platform(500, 200, 200)platforms.add(ground)
platforms.add(platform1)
platforms.add(platform2)
platforms.add(platform3)
all_sprites.add(ground)
all_sprites.add(platform1)
all_sprites.add(platform2)
all_sprites.add(platform3)# 游戏循环
clock = pygame.time.Clock()
running = Truewhile running:# 事件处理for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:player.jump()# 获取按键状态keys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:player.rect.x -= player.speedif keys[pygame.K_RIGHT]:player.rect.x += player.speed# 更新player.update()# 检测与平台的碰撞hits = pygame.sprite.spritecollide(player, platforms, False)if hits:player.rect.bottom = hits[0].rect.topplayer.velocity_y = 0player.jumping = False# 绘制screen.fill(WHITE)all_sprites.draw(screen)pygame.display.flip()# 控制帧率clock.tick(60)pygame.quit()
sys.exit()
4、五子棋
#
import pygame
import sys
import numpy as np# 初始化Pygame
pygame.init()# 常量定义
BOARD_SIZE = 15 # 棋盘大小 15x15
GRID_SIZE = 40 # 每个格子的大小
MARGIN = 40 # 边距
PIECE_SIZE = 18 # 棋子大小# 计算窗口大小
WINDOW_SIZE = BOARD_SIZE * GRID_SIZE + 2 * MARGIN# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BROWN = (205, 133, 63)
RED = (255, 0, 0)# 创建窗口
screen = pygame.display.set_mode((WINDOW_SIZE, WINDOW_SIZE))
pygame.display.set_caption('五子棋')class GomokuGame:def __init__(self):self.board = np.zeros((BOARD_SIZE, BOARD_SIZE), dtype=int)self.current_player = 1 # 1为黑子,2为白子self.game_over = Falseself.winner = Nonedef place_piece(self, row, col):if self.board[row][col] == 0 and not self.game_over:self.board[row][col] = self.current_playerif self.check_win(row, col):self.game_over = Trueself.winner = self.current_playerself.current_player = 3 - self.current_player # 切换玩家return Truereturn Falsedef check_win(self, row, col):# 检查方向:水平、垂直、对角线directions = [(1, 0), (0, 1), (1, 1), (1, -1)]player = self.board[row][col]for dx, dy in directions:count = 1# 正向检查for i in range(1, 5):new_row, new_col = row + i * dx, col + i * dyif (0 <= new_row < BOARD_SIZE and 0 <= new_col < BOARD_SIZE and self.board[new_row][new_col] == player):count += 1else:break# 反向检查for i in range(1, 5):new_row, new_col = row - i * dx, col - i * dyif (0 <= new_row < BOARD_SIZE and 0 <= new_col < BOARD_SIZE and self.board[new_row][new_col] == player):count += 1else:breakif count >= 5:return Truereturn Falsedef draw_board():screen.fill(BROWN)# 绘制棋盘线for i in range(BOARD_SIZE):# 横线pygame.draw.line(screen, BLACK,(MARGIN, MARGIN + i * GRID_SIZE),(WINDOW_SIZE - MARGIN, MARGIN + i * GRID_SIZE))# 竖线pygame.draw.line(screen, BLACK,(MARGIN + i * GRID_SIZE, MARGIN),(MARGIN + i * GRID_SIZE, WINDOW_SIZE - MARGIN))def draw_pieces(board):for row in range(BOARD_SIZE):for col in range(BOARD_SIZE):if board[row][col] != 0:color = BLACK if board[row][col] == 1 else WHITEcenter = (MARGIN + col * GRID_SIZE,MARGIN + row * GRID_SIZE)pygame.draw.circle(screen, color, center, PIECE_SIZE)def get_grid_position(pos):x, y = pos# 计算最近的交叉点row = round((y - MARGIN) / GRID_SIZE)col = round((x - MARGIN) / GRID_SIZE)if 0 <= row < BOARD_SIZE and 0 <= col < BOARD_SIZE:return row, colreturn Nonedef main():game = GomokuGame()try:font = pygame.font.Font("C:\\Windows\\Fonts\\msyh.ttc", 36) # 微软雅黑except:try:font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 36) # 宋体except:font = pygame.font.SysFont("microsoft yahei", 36) # 使用系统字体while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN and not game.game_over:pos = pygame.mouse.get_pos()grid_pos = get_grid_position(pos)if grid_pos:row, col = grid_posgame.place_piece(row, col)# 绘制游戏界面draw_board()draw_pieces(game.board)# 显示游戏状态if game.game_over:winner_text = f"{'黑棋' if game.winner == 1 else '白棋'}胜利!"text_surface = font.render(winner_text, True, RED)text_rect = text_surface.get_rect(center=(WINDOW_SIZE//2, 20))screen.blit(text_surface, text_rect)else:current_player = "黑棋" if game.current_player == 1 else "白棋"text_surface = font.render(f"当前玩家: {current_player}", True, BLACK)text_rect = text_surface.get_rect(center=(WINDOW_SIZE//2, 20))screen.blit(text_surface, text_rect)pygame.display.flip()if __name__ == '__main__':main()
5、蜘蛛纸牌
import pygame
import random# Initialize Pygame
pygame.init()# Constants
WINDOW_WIDTH = 1200
WINDOW_HEIGHT = 800
CARD_WIDTH = 71
CARD_HEIGHT = 96
CARD_SPACING = 20
STACK_SPACING = 90# Colors
WHITE = (255, 255, 255)
GREEN = (0, 128, 0)
BLACK = (0, 0, 0)
RED = (255, 0, 0)# Initialize the window
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("蜘蛛纸牌")class Card:def __init__(self, suit, value):self.suit = suitself.value = valueself.face_up = Falseself.rect = pygame.Rect(0, 0, CARD_WIDTH, CARD_HEIGHT)self.selected = Falsedef draw(self, surface, x, y):self.rect.topleft = (x, y)if self.face_up:# Draw card facepygame.draw.rect(surface, WHITE, self.rect)pygame.draw.rect(surface, BLACK, self.rect, 1)# Draw card valuefont = pygame.font.Font(None, 36)if self.value == 1:value_text = 'A'elif self.value == 11:value_text = 'J'elif self.value == 12:value_text = 'Q'elif self.value == 13:value_text = 'K'else:value_text = str(self.value)text = font.render(value_text, True, BLACK)surface.blit(text, (x + 5, y + 5))# Draw suitsuit_font = pygame.font.Font(None, 36)suit_text = suit_font.render(self.suit, True, BLACK)surface.blit(suit_text, (x + 5, y + 25))# Draw center suitcenter_font = pygame.font.Font(None, 48)center_text = center_font.render(self.suit, True, BLACK)text_rect = center_text.get_rect(center=(x + CARD_WIDTH//2, y + CARD_HEIGHT//2))surface.blit(center_text, text_rect)if self.selected:pygame.draw.rect(surface, RED, self.rect, 2)else:# Draw card backpygame.draw.rect(surface, WHITE, self.rect)pygame.draw.rect(surface, BLACK, self.rect, 1)# Draw pattern on backfor i in range(4):pygame.draw.line(surface, BLACK, (x + 10 + i*15, y + 10),(x + 10 + i*15, y + CARD_HEIGHT - 10))class SpiderSolitaire:def __init__(self):self.reset_game()def reset_game(self):self.stacks = [[] for _ in range(10)] # 10 tableau pilesself.deck = []self.completed_stacks = []self.selected_cards = []self.selected_stack = None# Create deck (using only one suit for easier gameplay)suits = ['♠'] # Start with one suit for simplicityvalues = list(range(1, 14)) # 1-13for _ in range(8): # 8 decks of same suitfor value in values:self.deck.append(Card(suits[0], value))# Shuffle deckrandom.shuffle(self.deck)# Deal initial cardsself.deal_initial_cards()def deal_initial_cards(self):# Deal cards to tableau pilesfor i in range(4): # First 4 piles get 6 cardsfor _ in range(6):card = self.deck.pop()if _ == 5: # Last card face upcard.face_up = Trueself.stacks[i].append(card)for i in range(4, 10): # Last 6 piles get 5 cardsfor _ in range(5):card = self.deck.pop()if _ == 4: # Last card face upcard.face_up = Trueself.stacks[i].append(card)def draw(self):screen.fill(GREEN)# Draw tableau pilesfor i, stack in enumerate(self.stacks):x = 50 + i * STACK_SPACINGfor j, card in enumerate(stack):card.draw(screen, x, 50 + j * CARD_SPACING)# Draw deckif self.deck:x = WINDOW_WIDTH - CARD_WIDTH - 50y = WINDOW_HEIGHT - CARD_HEIGHT - 50pygame.draw.rect(screen, WHITE, (x, y, CARD_WIDTH, CARD_HEIGHT))pygame.draw.rect(screen, BLACK, (x, y, CARD_WIDTH, CARD_HEIGHT), 1)# Draw pattern on deck backfor i in range(4):pygame.draw.line(screen, BLACK, (x + 10 + i*15, y + 10),(x + 10 + i*15, y + CARD_HEIGHT - 10))pygame.display.flip()def handle_click(self, pos):x, y = pos# Check if clicked on tableau pilesfor i, stack in enumerate(self.stacks):for j in range(len(stack)-1, -1, -1): # 从上往下检查,这样可以点击到上面的牌card = stack[j]# 计算卡片的实际显示位置card_x = 50 + i * STACK_SPACINGcard_y = 50 + j * CARD_SPACINGcard_rect = pygame.Rect(card_x, card_y, CARD_WIDTH, CARD_HEIGHT)if card_rect.collidepoint(x, y) and card.face_up:self.select_cards(i, j)return# Check if clicked on deckdeck_x = WINDOW_WIDTH - CARD_WIDTH - 50deck_y = WINDOW_HEIGHT - CARD_HEIGHT - 50deck_rect = pygame.Rect(deck_x, deck_y, CARD_WIDTH, CARD_HEIGHT)if deck_rect.collidepoint(x, y) and self.deck:self.deal_cards()def select_cards(self, stack_index, card_index):# Clear previous selectionfor stack in self.stacks:for card in stack:card.selected = Falseif self.selected_stack is None:# Select cards if they form a valid sequencestack = self.stacks[stack_index]if self.is_valid_sequence(stack[card_index:]):self.selected_stack = stack_indexself.selected_cards = stack[card_index:]# Highlight selected cardsfor card in self.selected_cards:card.selected = Trueelse:# Try to move selected cards to new stackif self.can_move_cards(stack_index):self.move_cards(stack_index)self.selected_stack = Noneself.selected_cards = []def is_valid_sequence(self, cards):if not cards:return Falsefor i in range(len(cards)-1):if cards[i].value != cards[i+1].value + 1 or cards[i].suit != cards[i+1].suit:return Falsereturn Truedef can_move_cards(self, target_stack_index):if not self.selected_cards or not self.stacks[target_stack_index]:return Truetarget_card = self.stacks[target_stack_index][-1]return target_card.value == self.selected_cards[0].value + 1def move_cards(self, target_stack_index):# Remove cards from source stacksource_stack = self.stacks[self.selected_stack]start_index = len(source_stack) - len(self.selected_cards)self.stacks[target_stack_index].extend(source_stack[start_index:])self.stacks[self.selected_stack] = source_stack[:start_index]# Turn up top card of source stack if neededif self.stacks[self.selected_stack] and not self.stacks[self.selected_stack][-1].face_up:self.stacks[self.selected_stack][-1].face_up = True# Check for completed sequencesself.check_completed_sequences()def check_completed_sequences(self):for i, stack in enumerate(self.stacks):if len(stack) >= 13:# Check for complete sequence from K to Afor j in range(len(stack) - 12):sequence = stack[j:j+13]if (all(card.face_up for card in sequence) andall(card.suit == sequence[0].suit for card in sequence) andall(sequence[k].value == 13-k for k in range(13))):# Remove completed sequenceself.completed_stacks.append(sequence)self.stacks[i] = stack[:j] + stack[j+13:]if self.stacks[i] and not self.stacks[i][-1].face_up:self.stacks[i][-1].face_up = Truebreakdef deal_cards(self):if len(self.deck) >= 10:for i in range(10):card = self.deck.pop()card.face_up = Trueself.stacks[i].append(card)def main():game = SpiderSolitaire()running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.MOUSEBUTTONDOWN:if event.button == 1: # Left clickgame.handle_click(event.pos)elif event.type == pygame.KEYDOWN:if event.key == pygame.K_r: # Press 'R' to restartgame.reset_game()game.draw()pygame.quit()if __name__ == "__main__":main()