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

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

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

游戏概述

记忆翻牌游戏是一种经典的益智游戏,玩家需要翻开卡片并记住它们的位置,找出所有匹配的卡片对。本教程将使用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#


相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...