百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

六一儿童节快乐!Python记忆翻牌游戏

itomcoil 2025-06-30 16:46 2 浏览

游戏概述

记忆翻牌游戏是一种经典的益智游戏,玩家需要翻开卡片并记住它们的位置,找出所有匹配的卡片对。本教程将使用Python的Pygame库开发一个完整的记忆翻牌游戏。

开发环境搭建

1. 安装Python

  • Python官网:https://www.python.org/downloads/下载并安装最新版Python
  • 安装时勾选"Add Python to PATH"选项

2. 安装Pygame

pip install pygame

3. 中文字体准备

  • Windows系统自带中文字体(如simhei.ttf)
  • 或下载免费中文字体如文泉驿:https://wenq.org/字体

核心代码解析

1. 游戏初始化

import pygame
import random
import time
import os

# 初始化pygame
pygame.init()

# 屏幕设置
WIDTH, HEIGHT = 600, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("六一儿童节快乐 - 记忆翻牌游戏")

知识点

  • pygame.init(): 初始化所有pygame模块
  • set_mode(): 创建游戏窗口,参数为(宽度,高度)
  • set_caption(): 设置窗口标题

2. 中文字体处理

# 尝试加载中文字体
font_paths = [
    "C:/Windows/Fonts/simhei.ttf",  # Windows黑体
    "/System/Library/Fonts/STHeiti Medium.ttc",  # Mac黑体
    "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"  # Linux文泉驿
]

chinese_font = None
for path in font_paths:
    if os.path.exists(path):
        chinese_font = pygame.font.Font(path, 36)
        break

if chinese_font is None:
    chinese_font = pygame.font.SysFont(None, 36)

知识点

  • 跨平台字体路径处理
  • pygame.font.Font(): 从文件加载字体
  • os.path.exists(): 检查文件是否存在
  • 回退机制:找不到字体时使用系统默认字体

3. 游戏数据结构

def create_board():
    symbols = []
    for i in range(ROWS * COLS // 2):
        symbols.append(i)
        symbols.append(i)
    random.shuffle(symbols)
    
    board = []
    for row in range(ROWS):
        board_row = []
        for col in range(COLS):
            symbol = symbols.pop()
            board_row.append({
                'symbol': symbol,
                'color': COLORS[symbol % len(COLORS)],
                'flipped': False,
                'matched':
              False
            })
        board.append(board_row)
    return board

知识点

  • 二维数组表示游戏板
  • 每张卡片是一个字典,包含符号、颜色、是否翻开、是否匹配状态
  • random.shuffle(): 随机打乱列表顺序
  • 列表推导式创建游戏板

游戏流程图

完整代码

import pygame
import random
import time
import os

# 初始化pygame
pygame.init()

# 屏幕设置
WIDTH, HEIGHT = 600, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("六一儿童节快乐 - 记忆翻牌游戏")

# 尝试加载中文字体(使用系统自带字体或指定路径)
try:
    # Windows系统常见中文字体路径
    font_paths = [
        "C:/Windows/Fonts/simhei.ttf",  # 黑体
        "C:/Windows/Fonts/simkai.ttf",  # 楷体
        "C:/Windows/Fonts/simsun.ttc",  # 宋体
        "/System/Library/Fonts/STHeiti Medium.ttc",  # Mac系统黑体
        "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc"  # Linux文泉驿微米黑
    ]
    
    # 找到第一个可用的字体
    chinese_font = None
    for path in font_paths:
        if os.path.exists(path):
            chinese_font = pygame.font.Font(path, 36)
            break
    
    # 如果没有找到系统字体,使用默认字体(可能不支持中文)
    if chinese_font is None:
        chinese_font = pygame.font.SysFont(None, 36)
except:
    chinese_font = pygame.font.SysFont(None, 36)

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
COLORS = [BLUE, GREEN, RED, (255, 255, 0), (255, 0, 255), (0, 255, 255)]

# 游戏参数
ROWS, COLS = 4, 4
CARD_WIDTH = WIDTH // COLS - 10
CARD_HEIGHT = HEIGHT // ROWS - 10
CARD_MARGIN = 5

# 创建卡片
def create_board():
    symbols = []
    for i in range(ROWS * COLS // 2):
        symbols.append(i)
        symbols.append(i)
    random.shuffle(symbols)
    
    board = []
    for row in range(ROWS):
        board_row = []
        for col in range(COLS):
            symbol = symbols.pop()
            board_row.append({
                'symbol': symbol,
                'color': COLORS[symbol % len(COLORS)],
                'flipped': False,
                'matched': False
            })
        board.append(board_row)
    return board

# 绘制卡片
def draw_board(board):
    screen.fill(WHITE)
    for row in range(ROWS):
        for col in range(COLS):
            card = board[row][col]
            rect = pygame.Rect(
                col * (CARD_WIDTH + CARD_MARGIN) + CARD_MARGIN,
                row * (CARD_HEIGHT + CARD_MARGIN) + CARD_MARGIN,
                CARD_WIDTH,
                CARD_HEIGHT
            )
            
            if card['flipped'] or card['matched']:
                pygame.draw.rect(screen, card['color'], rect)
                pygame.draw.rect(screen, BLACK, rect, 2)
                text = chinese_font.render(str(card['symbol']), True, BLACK)
                text_rect = text.get_rect(center=rect.center)
                screen.blit(text, text_rect)
            else:
                pygame.draw.rect(screen, (200, 200, 200), rect)
                pygame.draw.rect(screen, BLACK, rect, 2)
    
    pygame.display.flip()

# 显示中文消息
def show_message(message, color, duration=2000):
    screen.fill(WHITE)
    text = chinese_font.render(message, True, color)
    text_rect = text.get_rect(center=(WIDTH//2, HEIGHT//2))
    screen.blit(text, text_rect)
    pygame.display.flip()
    pygame.time.delay(duration)

# 主游戏循环
def main():
    board = create_board()
    flipped_cards = []
    matched_pairs = 0
    total_pairs = ROWS * COLS // 2
    
    running = True
    show_message("六一儿童节快乐!", RED, 1500)
    show_message("点击卡片开始游戏", BLUE, 1500)
    
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            
            if event.type == pygame.MOUSEBUTTONDOWN:
                pos = pygame.mouse.get_pos()
                col = pos[0] // (CARD_WIDTH + CARD_MARGIN)
                row = pos[1] // (CARD_HEIGHT + CARD_MARGIN)
                
                if 0 <= row < ROWS and 0 <= col < COLS:
                    card = board[row][col]
                    if not card['flipped'] and not card['matched'] and len(flipped_cards) < 2:
                        card['flipped'] = True
                        flipped_cards.append((row, col))
        
        # 检查是否翻开了两张卡片
        if len(flipped_cards) == 2:
            draw_board(board)
            pygame.time.delay(500)  # 短暂延迟以便玩家看到
            
            (row1, col1), (row2, col2) = flipped_cards
            card1 = board[row1][col1]
            card2 = board[row2][col2]
            
            if card1['symbol'] == card2['symbol']:
                card1['matched'] = True
                card2['matched'] = True
                matched_pairs += 1
                
                # 检查游戏是否结束
                if matched_pairs == total_pairs:
                    show_message("恭喜你赢了!", RED)
                    board = create_board()
                    flipped_cards = []
                    matched_pairs = 0
            else:
                card1['flipped'] = False
                card2['flipped'] = False
            
            flipped_cards = []
        
        draw_board(board)
    
    pygame.quit()

if __name__ == "__main__":
    main()

扩展学习路线图

扩展方向详解

  1. 计分系统
  2. 根据尝试次数计算分数
  3. 添加计时功能
  4. 实现分数排行榜
  5. 难度调整
  6. 增加卡片行数和列数
  7. 添加卡片图案而不仅是数字
  8. 实现关卡系统
  9. 音效增强
  10. 添加卡片翻动音效
  11. 匹配成功音效
  12. 背景音乐
  13. 图形优化
  14. 使用图片替代简单色块
  15. 添加动画效果
  16. 实现主题皮肤切换

总结与进阶

关键知识点总结

  1. Pygame基础
  2. 游戏循环结构
  3. 事件处理机制
  4. 图形绘制方法
  5. 数据结构
  6. 二维数组表示游戏状态
  7. 字典存储卡片属性
  8. 列表操作(append, pop, shuffle)
  9. 中文处理
  10. 字体加载方法
  11. 跨平台路径处理
  12. 回退机制设计

进阶挑战

  1. 添加卡片图案(使用图片资源)
  2. 实现游戏暂停功能
  3. 添加"提示"功能(短暂显示所有卡片)
  4. 开发移动端版本(使用Kivy框架)

补充资源

推荐学习资料

  1. Pygame官方文档: https://www.pygame.org/docs/
  2. Python游戏开发书籍
  3. 《Python游戏编程快速上手》
  4. 《Making Games with Python & Pygame》
  5. 在线教程
  6. Pygame中文教程:https://eyehere.net/2011/python-pygame-novice-professional/

常见问题解答

Q: 游戏窗口无法显示中文怎么办? A: 1. 确保字体路径正确 2. 下载中文字体放入项目目录 3. 修改代码指向本地字体文件

Q: 如何调整游戏难度? A: 修改ROWS和COLS的值,例如改为6x6的网格

Q: 如何添加更多卡片图案? A: 1. 准备图片资源 2. 修改create_board()函数加载图片 3. 更新绘制逻辑


六一儿童节快乐,愿编程带给你童年的乐趣!


持续更新Python编程学习日志与技巧,敬请关注!


#编程# #学习# #在头条记录我的2025# #python#


相关推荐

第十章:优化设计与自动化工作流(优化设计是)

以下重点讲解优化设计、自动化脚本编写以及与其他工具(如Python、优化算法库)的集成,提升CFD仿真的工程应用效率。目标:掌握参数化扫描、优化算法集成和批量任务管理,实现从单次模拟到自动化设计探索的...

安装python语言,运行你的第一行代码

#01安装Python访问Python官方(https://www.python.org/),下载并安装最新版本的Python。确保安装过程中勾选“Addpython.exetoPAT...

Python安装(python安装的库在哪个文件夹)

Windows系统1.安装python1.1下载Python安装包打开官方网站:https://www.python.org/downloads/点击"DownloadPython3.1...

比pip快100倍的Python包安装工具(python2.7.5安装pip)

简介uv是一款开源的Python包安装工具,GitHubstar高达56k,以性能极快著称,具有以下特性(官方英文原文):Asingletooltoreplacepip,pip-tool...

【跟着豆包AI学Python】Python环境的安装,编写第一个程序

最近几年,人工智能越来越走进人们的日常生活,国内各大公司都推出了自己的AI助手,例如:阿里旗下的通义千问、百度旗下的文心一言、腾讯的腾讯元宝、深度求索的deepseek等,元宝就是字节跳动公司推出的A...

Python3+ 变量命名全攻略:PEP8 规范 + 官方禁忌...

Python3+变量命名规则与约定详解一、官方命名规则(必须遵守)1.合法字符集变量名只能包含:大小写字母(a-z,A-Z)数字(0-9)下划线(_)2.禁止数字开头合法:user_age,...

Python程序打包为EXE的全面指南:从入门到精通

引言在Python开发中,将程序打包成可执行文件(EXE)是分发应用程序的重要环节。通过打包,我们可以创建独立的可执行文件,让没有安装Python环境的用户也能运行我们的程序。本篇文章将详细介绍如何使...

别再纸上谈兵了!手把手教你安装GraalVM,让你的代码瞬间起飞!

各位老铁们,是不是每次看到我吹嘘GraalVM的各种神迹,心里都痒痒的?想让自己的Java程序秒启动?想让Python脚本跑得比平时快好几倍?想体验一把多语言无缝协作的快感?但一想到要下载、配置、敲命...

纠结坏了!从 Python 3.8 升级到 3.14 真有必要吗?

点赞、收藏、加关注,下次找我不迷路"我电脑里装的Python3.8,现在都出3.14了,要不要赶紧升级啊?会不会像手机系统更新一样,越升级越卡?"相信很多刚入门的朋友都有类...

win10下python3.13.3最新版本解释器的下载与安装

一、python3.13.3下载官方下载地址:https://www.python.org/1.浏览器访问https://www.python.org/这个地址,进入python的网站,点击【Dowl...

Python简介与开发环境搭建详细教程

1.1Python简介与开发环境搭建详细教程一、Python语言简介1.Python的核心特点2.Python的应用领域表1.1Python主要应用领域领域典型应用常用库Web开发网站后端D...

python开发小游戏案例(python游戏开发入门经典教程)

#头条创作挑战赛#假设你正在开发一个小型游戏,需要实现角色移动、障碍物生成、碰撞检测等功能。你可以使用Python和Pygame库来开发这个游戏。输入以下命令来安装Pygame:pipinstall...

Python编程:从入门到实践 第十一、二 章 武装飞船

假设我们有一个名为AnonymousSurvey的类,用于收集匿名调查的答案。该类包含以下方法:classAnonymousSurvey:def__init__(self,questi...

「Python系列」python几个重要模块的安装(二)

一、python的pygame的安装:安装地址:https://www.cnblogs.com/charliedaifu/p/9938542.htmlpyagme包下载地址:https://down...

python如何绘制消消乐小游戏(python字母消消乐)

要开发一款消消乐的小游戏界面,我们可以使用Python的pygame库。首先需要安装pygame库,然后创建一个窗口,加载游戏素材,处理游戏逻辑,以及绘制游戏界面。以下是一个简单的消消乐游戏界面实现:...