Python 写的几个经典游戏 新年放烟花、 贪吃蛇、俄罗斯方块、超级玛丽、五子棋、蜘蛛纸牌

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Typing: 实战应用指南

文章目录 1. 什么是 Python Typing&#xff1f;2. 实战案例&#xff1a;构建一个用户管理系统2.1 项目描述2.2 代码实现 3. 类型检查工具&#xff1a;MyPy4. 常见的 typing 用法5. 总结 在 Python 中&#xff0c;静态类型检查越来越受到开发者的重视。typing 模块提供了一种方式…

14-8C++STL的queue容器

一、queue容器 (1)queue容器的简介 queue为队列容器&#xff0c;“先进先出”的容器 (2)queue对象的构造 queue<T>q; queue<int>que Int;//存放一个int的queue容器 queue<string>queString;//存放一个string的queue容器 (3)queue容器的push()与pop()方…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

PyCharm接入DeepSeek实现AI编程

目录 效果演示 创建API key 在PyCharm中下载CodeGPT插件 配置Continue DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于开发高性能、低成本的 AI 模型。DeepSeek-V3 是 DeepSeek 公司推出的最新一代 AI 模型。其前身是 DeepSeek-V2.5&#xff0c;经过持续的…

C语言指针专题一 -- 指针基础原理

目录 1. 指针概念 地址和变量 指针 2. 指针的声明与初始化 3. 指针的使用 指针访问 指针的运算 指针与数组 指针与函数 4. 编程实例 5. 指针的常见陷阱与防御 6. 总结 1. 指针概念 地址和变量 在C语言中&#xff0c;地址和变量是两个基本但非常重要的概念。 1. 变…

【Python】已解决:ModuleNotFoundError: No module named ‘cv2’

个人简介&#xff1a;某不知名博主&#xff0c;致力于全栈领域的优质博客分享 | 用最优质的内容带来最舒适的阅读体验&#xff01;文末获取免费IT学习资料&#xff01; &#x1f345; 文末获取更多信息 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅收藏 &#x…

从0开始,来看看怎么去linux排查Java程序故障

一&#xff0c;前提准备 最基本前提&#xff1a;你需要有liunx环境&#xff0c;如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后&#xff0c;你还需要安装jdk和配置环境变量 1. 安装JDK&#xff08;以OpenJDK 17为例&#xff09; 下载JDK…

设计模式-建造者模式、原型模式

目录 建造者模式 定义 类图 优缺点 角色 建造者模式和工厂模式比较 使用案例 原型模式 定义 类图 优缺点 应用场景 应用类型 浅克隆 深克隆 建造者模式 定义 将一个复杂的对象的构造与它的表示分离&#xff0c;使同样的构建过程可以创建不同的表示&#xff0c;…

1 HDFS

1 HDFS 1. HDFS概述2. HDFS架构3. HDFS的特性4. HDFS 的命令行使用5. hdfs的高级使用命令6. HDFS 的 block 块和副本机制6.1 抽象为block块的好处6.2 块缓存6.3 hdfs的文件权限验证6.4 hdfs的副本因子 7. HDFS 文件写入过程&#xff08;非常重要&#xff09;7.1 网络拓扑概念7.…

75-《倒提壶》

倒提壶 倒提壶&#xff08;学名&#xff1a;Cynoglossum amabile Stapf et Drumm.&#xff09;&#xff1a;紫草科&#xff0c;琉璃草属多年生草本植物&#xff0c;高可达60厘米。茎密生贴伏短柔毛。基生叶&#xff0c;长圆状披针形或披针形&#xff0c;茎生叶长圆形或披针形&a…

第一个3D程序!

运行效果 CPP #include <iostream> #include <fstream> #include <string> #include <cmath>#include <GL/glew.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/…

简要介绍C语言/C++的三目运算符

三元运算符是C语言和C中的一种简洁的条件运算符&#xff0c;它的形式为&#xff1a; 条件表达式 ? 表达式1 : 表达式2; 三元运算符的含义 条件表达式&#xff1a;这是一个布尔表达式&#xff0c;通常是一个比较操作&#xff08;如 >、<、 等&#xff09;。 表达式1&am…

本地部署DeepSeekp R1教程

目录 一.打开ollama官网&#xff0c;下载安装 1.下载完成双击安装程序 2.winr 输入cmd打开命令行输入命令 查看是否安装成功 二.部署DeepSeek R1模型 1. 下载模型&#xff1a;终端输入 (根据你的显存大小选择版本&#xff0c;16g就可以选择14b/32b)**电脑配置很低的话选…

事务04之死锁,锁底层和隔离机制原理

死锁和事务底层原理 文章目录 死锁和事务底层原理一&#xff1a;MySQL中的死锁现象1&#xff1a;何为死锁1.1&#xff1a;死锁的概念1.2&#xff1a;死锁产生的四个必要条件&#xff1a; 2&#xff1a;MySQL的死锁2.1&#xff1a;死锁的触发2.2&#xff1a;MySQL的死锁如何解决…

Fiddler(一) - Fiddler简介_fiddler软件

文章目录 一、为什么选择Fiddler作为抓包工具? 二、什么是Fiddler?三、Fiddler使用界面简介四、延伸阅读 一、为什么选择Fiddler作为抓包工具? 抓包工具有很多&#xff0c;小到最常用的web调试工具firebug&#xff0c;大到通用性强大的抓包工具wireshark。为什么使用fid…

RabbitMQ模块新增消息转换器

文章目录 1.目录结构2.代码1.pom.xml 排除logging2.RabbitMQConfig.java3.RabbitMQAutoConfiguration.java 1.目录结构 2.代码 1.pom.xml 排除logging <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/PO…

win11 sourcetree安装问题

win11 sourcetree安装出现msys-2.0.dll 问题&#xff0c;需要从win10的以下路径复制出 msys-2.0.dll来加入到win11中 C:\Users\kz121468\AppData\Local\Atlassian\SourceTree\git_local\usr\bin\ 复制到 win11的 C:\Users\kz121468\AppData\Local\Atlassian\SourceTree\git_lo…

Qt事件处理:理解处理器、过滤器与事件系统

1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中&#xff0c;所有事件都继承自 QEvent &#xff0c;并且每个事件都有特定的标识符&#xff0c;如&#xff1a;Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息&#xff…

一文读懂 Faiss:开启高维向量高效检索的大门

一、引言 在大数据与人工智能蓬勃发展的当下&#xff0c;高维向量数据如潮水般涌现。无论是图像、音频、文本&#xff0c;还是生物信息领域&#xff0c;都离不开高维向量来精准刻画数据特征。然而&#xff0c;在海量的高维向量数据中进行快速、准确的相似性搜索&#xff0c;却…

Openfga 授权模型搭建

1.根据项目去启动 配置一个 openfga 服务器 先创建一个 config.yaml文件 cd /opt/openFGA/conf touch ./config.yaml 怎么配置&#xff1f; 根据官网来看 openfga/.config-schema.json at main openfga/openfga GitHub 这里讲述详细的每一个配置每一个类型 这些配置有…