实验四Python综合实践

 

《Python程序设计》综合实践报告
——Flappy Bird游戏开发与华为云排行榜集成

第一章 项目概述

1.1 项目名称

Flappy Bird游戏开发与华为云排行榜集成

1.2 项目背景

本实践基于经典Flappy Bird游戏,使用Python Pygame框架进行开发,并深度集成华为云服务,实现游戏分数的云端存储和全球实时排行榜功能。

1.3 开发环境

项目 配置
开发语言 Python 3.8
游戏框架 Pygame 2.0
云服务器 华为云 ECS(1核1GB)
数据库 MySQL 8.0
Web框架 Flask
HTTP请求 Requests
操作系统 Windows 11 / Ubuntu 20.04

1.4 课程知识应用总览

课程章节 知识点 在本项目中的应用
第1章 初识Python Python简介、特点 选择Python作为开发语言
第2章 Python语法 基础语法、数据类型 游戏代码整体结构
第3章 流程控制语句 if、for、while循环 游戏主循环、碰撞检测
第4章 序列 列表、元组 存储小鸟状态、陨石列表
第5章 字符串 字符串处理 玩家名编辑、API请求
第6章 函数 函数定义与调用 游戏各个功能模块
第7章 面向对象 类与对象 Bird、Pipeline、Meteor等类
第8章 模块 import导入 pygame、requests等模块
第9章 异常处理 try-except API请求异常捕获
第10章 文件操作 文件读写 本地最高分保存
第11章 数据库操作 SQL语句 MySQL数据存储
第12章 GUI编程 Pygame 游戏图形界面
第13章 Pygame游戏编程 精灵、碰撞检测、动画 完整游戏实现
第14章 网络爬虫 requests库 华为云API调用
第15章 Web编程 Flask框架 API服务开发
第16章 Web框架 路由、JSON RESTful API
第17章 Socket编程 HTTP协议 游戏与云端通信

1.5 各章节知识点代码示例

第2章 基础语法

score = 100           # 整数
player_name = "Player" # 字符串
speed = 2.5           # 浮点数
is_dead = False       # 布尔值

第3章 流程控制

while True:  # 游戏主循环
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    if bird.birdY > HEIGHT:
        game_over()

第4章 序列

self.meteors = []                    # 列表存储陨石
points = [(cx, cy-10), (cx+15, cy)]  # 元组存储坐标

第5章 字符串

player_name += "123"                 # 字符串拼接
url = f"{API}/api/upload"            # f-string格式化
display_text = f"得分: {score}"       # 显示格式化

第6章 函数

def upload_score_to_cloud(username, score):
    try:
        response = requests.post(...)
        return True
    except:
        return False

第7章 面向对象

class Bird:
    def __init__(self):
        self.x = 100
        self.y = HEIGHT // 2
        self.hat_mode = False
    def jump(self):
        self.jumpSpeed = 8
    def activate_hat(self):
        self.hat_mode = True
        self.hat_timer = 600  # 10秒无敌

第8章 模块导入

import pygame
import sys
import random
import requests
from flask import Flask

第9章 异常处理

try:
    response = requests.get(url, timeout=3)
except requests.exceptions.Timeout:
    print("请求超时")
except Exception as e:
    print(f"错误: {e}")

第10章 文件操作

def get_high_score():
    try:
        with open("highscore.txt", "r") as f:
            return int(f.read())
    except:
        return 0
def save_high_score(score):
    with open("highscore.txt", "w") as f:
        f.write(str(score))

第11章 数据库操作

cursor.execute("""
    SELECT u.username, u.country, MAX(s.score) as best_score
    FROM scores s
    JOIN users u ON s.user_id = u.user_id
    GROUP BY u.user_id
    ORDER BY best_score DESC
    LIMIT 50
""")

第12-13章 GUI与Pygame游戏编程

pygame.init()
screen = pygame.display.set_mode((400, 650))
if bird_rect.colliderect(pipe_rect):
    game_over()
self.anim_counter += 1
if self.anim_counter > 10:
    self.status = 1 - self.status

第14章 网络爬虫

def upload_score_to_cloud(username, score, mode):
    response = requests.post(
        f"{CLOUD_API}/api/upload",
        json={"username": username, "score": score, "mode": mode},
        timeout=3
    )
    return response.json()
def get_cloud_ranking(limit=10):
    response = requests.get(f"{CLOUD_API}/api/ranking", timeout=3)
    data = response.json()
    return data.get("data", [])[:limit]

第15-16章 Web编程

from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/api/ranking')
def get_ranking():
    ranking = db.get_global_ranking()
    return jsonify({'success': True, 'data': ranking})
@app.route('/api/upload', methods=['POST'])
def upload_score():
    data = request.json
    result = db.upload_score(data['username'], data['score'])
    return jsonify(result)

第二章 需求分析

2.1 功能需求

编号 功能模块 需求描述 优先级
F1 游戏核心玩法 实现小鸟飞行、重力下落、管道碰撞检测
F2 经典模式 传统玩法,穿越管道得分
F3 雷电模式 金色管道+雨天+随机雷电攻击特效
F4 陨石模式 躲避陨石,连击系统,难度随分数递增
F5 无敌帽子 按X键开启10秒无敌状态,免疫所有伤害
F6 加速特效 Shift键开启速度加成
F7 全球排行榜 游戏结束时上传分数并展示Top 5
F8 玩家名编辑 支持自定义玩家名
F9 本地最高分 本地文件保存历史最高分
F10 华为云集成 使用代金券购买ECS,部署数据库和API

2.2 非功能需求

需求 指标
游戏流畅度 60帧/秒
API响应时间 ≤3秒
系统可用性 7×24小时
并发支持 支持多用户同时上传分数

2.3 用户需求分析

  • 普通玩家:体验三种游戏模式,挑战高分
  • 竞技玩家:参与全球排行榜竞争
  • 课程学生:学习云服务部署和API开发

第三章 系统设计

3.1 系统总体架构

┌─────────────────────────────────────────────────────────────┐
│                        客户端(PC)                          │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              Flappy Bird 游戏 (Pygame)               │   │
│  │  ┌────────┐ ┌────────┐ ┌────────┐ ┌──────────────┐ │   │
│  │  │经典模式│ │雷电模式│ │陨石模式│ │无敌/加速特效 │ │   │
│  │  └───┬────┘ └───┬────┘ └───┬────┘ └──────┬───────┘ │   │
│  └──────┼──────────┼──────────┼──────────────┼─────────┘   │
│         │          │          │              │             │
│         └──────────┴────┬─────┴──────────────┘             │
│                         │ HTTP请求                          │
└─────────────────────────┼───────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────┐
│                      华为云服务器                            │
│  ┌─────────────────────────────────────────────────────┐   │
│  │           Flask API 服务 (端口 5000)                 │   │
│  │  ┌───────────────┐      ┌───────────────┐           │   │
│  │  │ /api/upload   │      │ /api/ranking  │           │   │
│  │  │ POST上传分数   │      │ GET获取排行榜 │           │   │
│  │  └───────┬───────┘      └───────┬───────┘           │   │
│  └──────────┼──────────────────────┼───────────────────┘   │
│             │                      │                       │
│             ▼                      ▼                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              MySQL 数据库                            │   │
│  │  ┌─────────────────┐    ┌─────────────────┐         │   │
│  │  │    users 表     │    │   scores 表     │         │   │
│  │  │ - user_id (PK)  │◄───│ - user_id (FK)  │         │   │
│  │  │ - username      │    │ - score         │         │   │
│  │  │ - country       │    │ - mode          │         │   │
│  │  │ - created_at    │    │ - play_time     │         │   │
│  │  └─────────────────┘    └─────────────────┘         │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │         Python HTTP 服务 (端口 8080)                 │   │
│  │            ranking.html 排行榜可视化网页              │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

3.2 数据库设计

3.2.1 用户表 (users)

字段 类型 约束 说明
user_id INT PRIMARY KEY AUTO_INCREMENT 用户唯一标识
username VARCHAR(50) NOT NULL UNIQUE 玩家名称
country VARCHAR(50) DEFAULT '中国' 国家/地区
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 注册时间

3.2.2 分数表 (scores)

字段 类型 约束 说明
score_id INT PRIMARY KEY AUTO_INCREMENT 分数记录ID
user_id INT FOREIGN KEY 关联用户ID
score INT NOT NULL 得分
mode VARCHAR(20) DEFAULT 'classic' 游戏模式
play_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP 游戏时间

索引设计: idx_score对score字段降序索引,优化排行榜查询

3.3 API接口设计

接口 方法 功能 请求格式 响应格式
/api/ranking GET 获取全球排行榜 JSON
/api/upload POST 上传游戏分数 JSON JSON
/ GET API健康检查 JSON

请求示例:

POST /api/upload
{"username": "Player", "score": 100, "mode": "classic"}

响应示例:

{"success": true, "message": "分数已上传!"}

第四章 核心功能实现

4.1 三种游戏模式实现

# 经典模式
def draw_game_classic():
    up, down = pipe.draw(screen, False)
    bird.draw(screen)
    bird.update()
# 雷电模式(金色管道+雨天+闪电)
def draw_game_thunder():
    up, down = pipe.draw(screen, True)
    rain_mgr.draw(screen)
    lightning.draw(screen)
    bird.draw(screen)
# 陨石模式(躲避陨石+连击)
def draw_game_meteor():
    meteor_mgr.update()
    meteor_mgr.draw(screen)
    bird.draw(screen)

4.2 游戏大厅界面实现

def draw_lobby(pos):
    name_rect = pygame.Rect(WIDTH//2 - 60, 280, 150, 45)
    if editing_name:
        pygame.draw.rect(screen, WHITE, name_rect)
        name_surface = font_input.render(player_name + "|", True, BLACK)
    else:
        pygame.draw.rect(screen, HUAWEI_BLUE, name_rect, 2)
        name_surface = font_mid.render(player_name, True, YELLOW)
    classic_btn.draw(screen, font_button)
    thunder_btn.draw(screen, font_button)
    meteor_btn.draw(screen, font_button)

第五章 华为云部署的曲折探索

5.1 第一阶段:走错路——选择云数据库

尝试1:Flexus云数据库RDS 价格:¥200/月,¥300代金券只够用1.5个月

尝试2:GaussDB 价格:¥5.55/小时 = ¥4000/月,¥300代金券只够用2小时

❌ 教训:买云服务前必须看清楚计费方式!

5.2 第二阶段:正确选择——购买ECS

最终选择:s6.small.1 (1核1GB),¥0.17/小时,¥300可用约60天

配置项 选择
计费模式 按需计费
规格 s6.small.1 (1核1GB)
镜像 Ubuntu 20.04
系统盘 40GB
带宽 1Mbit/s

5.3 第三阶段:购买过程中的问题

问题1:账号欠费无法购买 显示:您的账号已欠费,无法正常购买 解决:充值¥1.01还清欠费

问题2:虚拟私有云不会填 解决:选择 vpc-default → 自动出现 subnet-default

问题3:登录凭证不会选 解决:从"密钥对"改为"密码"方式

5.4 第四阶段:环境部署过程

步骤1:SSH连接服务器

ssh root@124.70.105.142

步骤2:安装MySQL

apt update
apt install mysql-server -y

步骤3:安装Python环境

apt install python3 python3-pip -y
pip3 install flask flask-cors pymysql requests

步骤4:创建数据库

CREATE DATABASE flappy_bird;
USE flappy_bird;
CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    country VARCHAR(50) DEFAULT '中国',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE scores (
    score_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    score INT NOT NULL,
    mode VARCHAR(20) DEFAULT 'classic',
    play_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);
CREATE INDEX idx_score ON scores(score DESC);

步骤5:编写API服务 由于nano编辑时Python缩进总出错,改用cat命令一次性写入成功。

步骤6:开放端口

端口 用途 问题与解决
22 SSH连接 默认已开放
5000 API服务 端口格式填错(写了TCP,5000,),改为5000
8080 网页服务 同样问题,改为8080

5.5 第五阶段:排行榜网页部署

cd /root
nohup python3 -m http.server 8080 > web.log 2>&1 &

创建桌面快捷方式 rank.bat

@echo off
start http://124.70.105.142:8080/ranking.html

5.6 部署问题总结

问题 原因 解决方案 耗时
账号欠费 欠费¥1.01 充值还清 5分钟
选错GaussDB 不了解计费 改用ECS自建 30分钟
虚拟私有云不会填 界面不熟悉 选择vpc-default 10分钟
登录凭证选错 默认密钥对 改成密码方式 5分钟
端口格式填错 写了TCP,5000 改成5000 10分钟
端口打不开 未添加安全组规则 添加入方向规则 15分钟
API代码缩进错误 手动编辑出错 用cat命令写入 20分钟

5.7 最终部署成果

服务 地址 状态
ECS云服务器 124.70.105.142 ✅ 运行中
API服务 http://124.70.105.142:5000 ✅ 正常
排行榜网页 http://124.70.105.142:8080/ranking.html ✅ 正常
rank.bat 桌面快捷方式 ✅ 一键打开

第六章 运行结果

6.1 API测试结果

curl http://124.70.105.142:5000/
# 返回: {"message":"Flappy Bird API Running!","status":"ok"}
curl http://124.70.105.142:5000/api/ranking
# 返回: {"success":true,"data":[{"rank":1,"username":"Player","score":17}]}

6.2 排行榜网页

打开 http://124.70.105.142:8080/ranking.html 显示:

排名 玩家 国家 最高分
🥇 第1名 Player 中国 17分
🥈 第2名 jack 中国 3分
🥉 第3名 john 中国 2分

6.3 游戏运行结果

模式 运行状态 说明
经典模式 ✅ 正常 绿色管道,传统玩法
雷电模式 ✅ 正常 金色管道、雨天、闪电预警
陨石模式 ✅ 正常 陨石降落、连击计数
无敌帽子 ✅ 正常 按X键,10秒无敌,显示倒计时
加速特效 ✅ 正常 按Shift键,速度翻倍

6.4 游戏界面说明

游戏大厅: 蓝色框显示玩家名点击可编辑,三个模式按钮,华为云连接状态显示

游戏结束界面: 显示本次得分、玩家名、全球排行榜Top 5

第七章 功能清单

序号 功能 实现状态 对应知识点
1 经典模式 Pygame游戏编程
2 雷电模式 类与对象、事件处理
3 陨石模式 列表操作、随机数
4 无敌帽子(X键) 键盘事件、计时器
5 加速特效(Shift键) 速度控制
6 全球排行榜 网络请求、JSON解析
7 华为云API集成 Web编程、数据库操作
8 玩家名编辑 字符串处理、鼠标事件
9 本地最高分 文件操作
10 网页排行榜 HTML/CSS/JavaScript

功能总数:10个(超过要求的5个)

第八章 课程总结与感想

8.1 全课知识回顾

课程阶段 学习内容 掌握程度 本项目应用
第1-2章 Python基础语法 熟练掌握 游戏整体代码结构
第3-6章 流程控制、序列、函数 熟练掌握 游戏主循环、模块化设计
第7章 面向对象编程 熟练掌握 Bird、Pipeline等类设计
第8-10章 模块、异常、文件 熟练掌握 导入库、异常捕获、保存最高分
第11章 数据库操作 掌握 MySQL存储分数
第12-13章 GUI、Pygame编程 深入应用 完整游戏实现
第14章 网络爬虫 掌握 华为云API调用
第15-16章 Web编程 深入应用 API服务开发
第17章 Socket编程 了解 HTTP通信

8.2 实践中的困难与解决

问题 原因 解决方案 耗时
账号欠费 欠费¥1.01 充值还清 5分钟
选错GaussDB 不了解计费 改用ECS自建 30分钟
虚拟私有云不会填 界面不熟悉 选择vpc-default 10分钟
登录凭证选错 默认密钥对 改成密码方式 5分钟
端口格式填错 写了TCP,5000 改成5000 10分钟
端口打不开 未添加安全组规则 添加入方向规则 15分钟
API代码缩进错误 手动编辑出错 用cat命令写入 20分钟

8.3 实践收获

  • Python综合应用能力:将课程所学知识完整应用到实际项目中
  • 云服务部署能力:学会了使用华为云ECS部署Web服务
  • 问题解决能力:遇到问题时能独立分析并解决
  • 全栈开发意识:从游戏前端到云端后端,完整理解应用开发流程
  • 代金券使用经验:了解了华为云代金券的正确使用方法

8.4 课程建议

一学期的课下来,我提几个不成熟的小建议:
一是课堂随机提问能不能改成举手回答?不是不想回答问题,是突然被点到真的会大脑空白,明明会的也说不出。改成举手的话,想回答的同学有更多机会,老师也不用担心冷场。
二是课程刚开始的时候,能不能给我们看看往届优秀作业的“满分模板”?让我们知道好的项目长什么样,心里有个谱,知道自己努力的方向。
三是课后可以多分享一些实战项目的素材和常用库的文档,像requests、BeautifulSoup、flask这些,光靠课上讲感觉不够,课后自己折腾的时候有份好文档能救命。
最后,感谢王老师一学期的悉心教导。您的课堂轻松幽默,“蛋炒饭”和“盖浇饭”的比喻我会记一辈子。这门课是我大学期间最充实的课程之一,没有“之一”可能也可以争一争。
下学期我打算继续学Python,可能往数据分析或者Web开发方向走。不管走哪条路,这学期打下的基础都会是最宝贵的财富。希望以后自己也能炒出一盘让老师满意的“蛋炒饭”。

8.5 总结

本次综合实践让我将课堂所学知识真正应用到实际项目中。从Python游戏开发,到华为云服务器购买,再到数据库部署、API开发、网页展示,我体验了完整的软件开发流程。特别是华为云部署环节遇到的各种问题,让我深刻理解了云服务的正确使用方法。

看着自己的分数出现在全球排行榜上,那种成就感是无可替代的。这次实践不仅提升了我的技术能力,更锻炼了解决问题的能力。通过这个项目,我对Python程序设计有了更深刻的理解,对未来的职业发展充满信心。

课程总结与感想 ### 我的Python学习之路

这学期跟着王老师学Python,回想起来,真的感觉幸运又充实,幸运的是遇见了幽默风趣而又有真本事硬技术的王老师,充实是因为跟着王老师学到了很多编程知识。说实话,学期初我对于python是很抵触害怕的,到现在居然能自己鼓捣出一个能玩的游戏,还能把分数传上云端,这种感觉,真的是无语言表了(实则词语匮乏哈哈哈)。刚开课那会儿,我对Python的印象就停留在“听说很简单”这几个字上。王老师用“蛋炒饭”和“盖浇饭”比喻Python和C语言的区别,我一下子就记住了。Python就像蛋炒饭,写完就能炒(运行),不用提前“焖饭”(编译);C语言像盖浇饭,得先把饭蒸好(编译),再浇上菜。这个比喻太形象了,以至于我现在看到Python就会想到蛋炒饭。第2章的基础语法,我跟着老师敲代码,看着程序能正常运行,那种感觉挺奇妙的。原来让电脑听话也不难嘛。变量就像饭盒里的格子,各种数据分类放好;运算符就是炒菜时加的盐和糖,不多不少刚刚好。第3章的流程控制,是我第一次觉得编程有点意思。if-elif-else就像做选择题,“如果盐放少了就加盐,否则如果糖放少了就加糖,否则出锅”。for和while循环就像是重复翻炒,直到食材熟透。老师课堂上带我们做的猜数字游戏,我用单步调试偷偷看到了答案数字,那种感觉就像提前知道了菜谱里的秘密配方——原来调试器还能这么玩!第4章的序列,我学的有点头大。列表、元组、字典、集合,刚开始分不清谁是谁。列表像购物清单,可以随便改;元组像刻在石头上的字,不能动;字典像通讯录,一个名字对应一个号码;集合像调料盒,里面的调料都不重复。后来慢慢理解了:列表用[],元组用(),字典用{}带冒号,集合用{}不带冒号。王老师说“元组是不可变的列表”,我突然就通了。第5章字符串切片是我觉得最神奇的,[::-1]一行代码就能把字符串倒过来,这要是在C语言里得写好几行。第7章面向对象,是我学习的一个坎。类是什么?对象是什么?老师说“类是菜谱,对象是根据菜谱炒出来的蛋炒饭”,我一下就懂了。菜谱(类)定义了怎么做,但真正能吃的是炒出来的饭(对象)。封装就是把炒菜过程藏在后厨,客人只管吃;继承就是在蛋炒饭的基础上开发海鲜炒饭、腊肉炒饭,不用重新发明轮子;多态就是不管什么炒饭,端上桌都能吃。说实话,刚开始写类的时候,我觉得有点多此一举。但项目做大了才发现,把小鸟、管道、陨石都封装成类,代码清晰多了,改一个地方其他地方自动跟着变,舒服!第9章的异常处理,让我学会了给程序穿上防弹衣。以前我写的代码,一出错就崩溃,红字满屏跑,心态也跟着崩。try-except就像是炒菜时的备菜——万一盐放多了,加点糖救一下;万一糊锅了,赶紧关火重来。虽然王老师说这是提升代码健壮性,但说实话,try-except写多了真的有点窒息,感觉像在给代码穿三层防弹衣。文件操作倒是挺实用。以前写的程序一关就没了,现在能存到硬盘里,下次打开还在。这就像做好的蛋炒饭放进冰箱,明天热一下还能吃。(我这样理解对吧王老师)课程后期接触了网络爬虫和Web编程,说实话这块我学的有点懵。用requests库去网上抓数据,就像去别人家厨房借调料,得讲规矩(遵守robots协议)。Socket编程更是让我头疼,和同学做实验的时候,客户端死活收不到服务端的消息,折腾了一晚上。但当两个程序终于成功通信的那一刻,那种感觉就像第一次成功做出蛋炒饭——虽然卖相一般,但能吃!最后的综合实践,我做了一个Flappy Bird游戏,还接了华为云排行榜。从分析、设计到编码、调试,再到部署上线,完整走了一遍。游戏里有经典模式、雷电模式、陨石模式,还能按X键开无敌帽子、按Shift键加速。当我把分数传到云端,在网页上看到自己的排名时,那种成就感,就像是炒出了一盘色香味俱全的蛋炒饭,还拍了照发朋友圈。

程序游戏正常运行视频:

点击观看游戏演示

posted @ 2026-06-15 13:05  六月的雨天  阅读(7)  评论(0)    收藏  举报