软件工程第二次作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2024 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253 |
这个作业的目标 | 使用Python编写一个风格类似“羊了个羊”的消除类小游戏,完成游戏的基本功能和交互;进一步学会利用AIGC帮助开发 |
学号 | 052101418 |
R了个R小游戏
项目地址
项目目录
├── README.md # 项目说明
├── code # 主要代码
│ ├── __pycache__ # 字节码(可忽略)
│ │ ├── constants.cpython-312.pyc
│ │ ├── game.cpython-312.pyc
│ │ ├── menu.cpython-312.pyc
│ │ ├── rank.cpython-312.pyc
│ │ └── test_game.cpython-312.pyc
│ ├── constants.py # 有关常量
│ ├── game.py # 游戏阶段处理
│ ├── main.py # 游戏主循环
│ ├── menu.py # 菜单相关
│ ├── rank.py # 排行榜
│ └── test_game.py # 单测
├── data # 排行榜数据
│ └── leaderboard.json
└── images # 所用图片
├── animal_1.png
├── animal_2.png
├── animal_3.png
├── animal_4.png
├── animal_5.png
├── animal_6.png
├── animal_7.png
├── background.png
├── failure_background.png
├── rank_background.png
└── success_background.png
前端界面展示
-
主菜单
-
输入玩家昵称界面
-
难度选择界面
-
游戏通关界面
-
游戏失败界面
-
排行榜显示
主要实现功能及部分代码
- 方块的随机堆叠
使用pygame.shuttle()打乱每个位置的图片
def create_stacked_board(self):
num_tiles = ROWS * COLS
available_patterns = self.patterns * (num_tiles // len(self.patterns)) # 创建足够多的卡牌图案
random.shuffle(available_patterns) # 打乱图案顺序
board_layers = [[[] for _ in range(COLS)] for _ in range(ROWS)]
for _ in range(ROWS * COLS * 2): # 为每个格子生成图案
row = random.randint(0, ROWS - 1)
col = random.randint(0, COLS - 1)
if len(board_layers[row][col]) < 3 and available_patterns:
pattern = available_patterns.pop() # 每次取出一个图案
board_layers[row][col].append((pattern, random.randint(-10, 10), random.randint(-10, 10))) # 增大偏移量
return board_layers
-
倒计时功能
- 设置游戏倒计时,倒计时结束还未消除所有方块则失败。
- 根据难度的设置倒计时不同。
-
排行榜功能
- 清空功能:可以清空排行榜中的所有数据。
- 显示排行榜:在游戏界面中显示排行榜的前六名玩家及其成绩。(多于6则根据时间和难度进行覆盖)
# leaderboard.py
import json
import os
class Leaderboard:
def __init__(self, filename='../data/leaderboard.json'):
self.filename = filename
self.load()
def load(self):
if os.path.exists(self.filename):
with open(self.filename, 'r') as file:
self.data = json.load(file)
else:
self.data = []
def save(self):
with open(self.filename, 'w') as file:
json.dump(self.data, file, indent=4)
def clear(self):
self.data = []
def add_entry(self, name, time, difficulty):
difficulty_priority = {'normal': 0, 'easy': 1}
self.data.append({'name': name, 'time': time, 'difficulty': difficulty})
self.data.sort(key=lambda x: (difficulty_priority[x['difficulty']], x['time']))
self.data = self.data[:6] # 只保留前6条记录
self.save()
self.load() # 重新加载数据
def get_top_entries(self, limit=6):
self.load() # 获取排行榜时加载最新数据
return self.data[:limit]
- 难度设置
- 选择难度:玩家可以在游戏开始前选择不同的难度(如简单和普通)。
- 难度影响:不同的难度会影响游戏的时间限制和其他游戏参数(如槽位上限,easy难度为7个卡槽;normal难度为6个卡槽)。
单元测试
单元测试包括以下几个测试用例:
测试游戏初始化:确保游戏在初始化时设置了正确的难度,并且游戏状态为未成功和未结束。
测试菜单初始化:确保菜单在初始化时选择了默认难度,并且玩家名称为空。
测试排行榜初始化:确保排行榜数据是一个列表。
测试添加排行榜条目:确保添加条目后排行榜数据长度增加,并且最后一个条目是新添加的条目。
测试菜单事件处理:确保菜单事件处理返回正确的状态。
测试结果:
该单元测试能够检查游戏的所有类初始化,如游戏,菜单,排行榜,菜单按钮的测试。不足是具体的游戏测试还是需要游玩测试。
AIGC表格
子任务 | 借助何种AIGC技术,实现了什么功能 | 效果如何 |
---|---|---|
游戏背景设计 | 利用图像生成模型(如Stable Diffusion、DALL-E)生成游戏背景图片 | 游戏背景更丰富多样,缩短设计时间,不过有时候生成的图片一言难尽 |
游戏难度设计 | 利用Copilot进行游戏难度调整 | 提高游戏的趣味性和多样性,节省人力 |
游戏测试与反馈分析 | 利用GPT4自动生成单元测试代码 | 提高测试效率,快速定位问题,优化游戏质量 |
游戏失败/成功画面生成 | 使用图像生成模型如DALL-E生成游戏失败或成功画面 | 整体来说还行(DALL-E不错),其他生成模型生成的图片看不下去 |
游戏排行榜设计 | 借助Copilot生成排行榜相关代码,根据难度和完成时间排序 | 实现了功能,提升游戏竞技性,只需要更改部分代码 |
AIGC技术的优缺点
优点:
- 提高开发效率:自动生成图像、代码等,减少人力投入。
- 丰富多样性:可以快速生成多种风格,提高游戏内容的丰富性。
缺点:
- 创意受限:AIGC生成的内容可能缺乏人类创造力的独特性。
- 质量参差不齐:自动生成的内容质量不稳定,一般需要手动调整。
- 复杂交互难实现:对于复杂的游戏机制和交互,仅靠AIGC目前难以实现。
适合用在:
- 背景生成、音效制作(未完成)等艺术性较强的任务。
- 玩家行为分析、关卡难度调整等数据驱动的优化。
不适合用在:
- 复杂的游戏机制设计和实现。
- 需要高度创意和个性化的游戏内容。
PSP表格
活动 | 预估时间 (小时) | 实际时间 (小时) | 备注 |
---|---|---|---|
需求分析 | 2 | 2.5 | 确定游戏功能和用户需求 |
设计 | 3 | 3.5 | 设计游戏架构和界面 |
计划 | 1 | 1 | 制定开发计划和时间表 |
编码 | 8 | 9 | 编写游戏基础代码,包括主菜单、游戏逻辑、排行榜等 |
测试 | 3 | 3 | 测试游戏基本功能,修复bug |
集成 | 2 | 2 | 将menu,game,rank个模块集成到main模块中,确保整体功能正常 |
代码评审 | 2 | 2 | 进行代码审查,确保代码质量 |
用户评审 | 1 | 1 | 邀请用户(自己)进行试玩,收集反馈 |
总结 | 1 | 1 | 总结开发过程,记录经验教训 |
文档编写 | 1 | 1 | 编写项目文档,包括用户手册和开发文档 |
总计
活动 | 预估时间 (小时) | 实际时间 (小时) | 备注 |
---|---|---|---|
总计 | 24 | 25 | 总开发时间 |