软工结对编程作业
结对编程(Pair Programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。这样使得驾驶者可以集中全部注意力在完成当前任务的"战术"方面。观察员当
一、团队成员
| 姓名 | 学号 | 班级 |
|---|---|---|
| 李硕 | 202305050530 | 23计科五班 |
| 张裕 | 202305050547 | 23计科五班 |
| 齐鹏飞 | 202305050519 | 23计科五班 |
二、结对编程介绍
结对编程(Pair Programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。
在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。这样使得驾驶者可以集中全部注意力在完成当前任务的"战术"方面。观察员当作安全网和指南。结对编程对开发程序有很多好处,比如增加纪律性,写出更好的代码等。
三、Python实现图形化猜数字游戏
(一)、项目分析
游戏需求分析:
-
需要实现一个图形化的猜数字游戏
-
游戏应包含完整的用户界面和交互体验
-
需要实现游戏逻辑、用户输入验证、动画效果等功能
-
支持游戏状态管理(开始、进行中、胜利、失败)
技术架构设计:
-
使用PyGame库实现图形界面
-
采用面向对象编程思想设计游戏结构
-
模块化设计:游戏核心、UI组件、动画效果分离
类结构设计:
-
NumberGuessingGame:主游戏类,负责游戏流程控制 -
Particle:粒子效果类,负责游戏中的动画效果 -
AnimatedButton:动画按钮类,负责用户交互按钮
(二)、代码实现
1. 游戏主类(NumberGuessingGame)
python
import pygame
import sys
import random
import math
class NumberGuessingGame:
def __init__(self):
# 初始化游戏窗口和参数
self.screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("高级猜数字游戏 - 结对编程示例")
self.clock = pygame.time.Clock()
# 游戏状态变量
self.secret_number = None
self.attempts = 0
self.game_state = "menu" # 四种状态:menu, playing, win, lose
self.user_input = ""
self.message = ""
self.guess_history = []
self.particles = []
# 创建UI元素
self.start_button = AnimatedButton(300, 300, 200, 60, "开始游戏")
self.guess_button = AnimatedButton(350, 450, 100, 50, "猜!")
self.restart_button = AnimatedButton(300, 400, 200, 60, "再玩一次")
self.menu_button = AnimatedButton(300, 480, 200, 60, "返回菜单")
def generate_secret_number(self):
"""生成1-100之间的随机数"""
self.secret_number = random.randint(1, 100)
return self.secret_number
def check_guess(self, guess):
"""检查用户猜测结果"""
try:
guess_num = int(guess)
if guess_num < 1 or guess_num > 100:
return "invalid"
self.attempts += 1
self.guess_history.append(guess_num)
if guess_num == self.secret_number:
self.create_particles(400, 200, (255, 105, 97), 30)
return "correct"
elif guess_num < self.secret_number:
return "too_low"
else:
return "too_high"
except ValueError:
return "invalid"
2. 粒子效果类(Particle)
python
class Particle:
"""粒子效果类,用于游戏中的动画反馈"""
def __init__(self, x, y, color):
self.x = x
self.y = y
self.color = color
self.size = random.randint(2, 6)
self.speed_x = random.uniform(-3, 3)
self.speed_y = random.uniform(-3, 3)
self.life = 100
def update(self):
"""更新粒子状态"""
self.x += self.speed_x
self.y += self.speed_y
self.life -= 2
self.size *= 0.95
def draw(self, screen):
"""绘制粒子"""
alpha = min(255, self.life * 2.55)
color = (*self.color[:3], int(alpha))
pygame.draw.circle(screen, color, (int(self.x), int(self.y)), int(self.size))
3. 动画按钮类(AnimatedButton)
python
class AnimatedButton:
"""带动画效果的按钮类"""
def __init__(self, x, y, width, height, text, color=(70, 130, 180), hover_color=(100, 200, 195)):
self.rect = pygame.Rect(x, y, width, height)
self.text = text
self.color = color
self.hover_color = hover_color
self.current_color = color
self.is_hovered = False
self.animation_progress = 0
def update(self, mouse_pos):
"""更新按钮状态和动画"""
was_hovered = self.is_hovered
self.is_hovered = self.rect.collidepoint(mouse_pos)
# 处理悬停状态变化
if self.is_hovered and not was_hovered:
self.animation_progress = 0
# 更新动画进度
if self.is_hovered:
self.animation_progress = min(1.0, self.animation_progress + 0.1)
else:
self.animation_progress = max(0.0, self.animation_progress - 0.1)
# 颜色插值
r = int(self.color[0] + (self.hover_color[0] - self.color[0]) * self.animation_progress)
g = int(self.color[1] + (self.hover_color[1] - self.color[1]) * self.animation_progress)
b = int(self.color[2] + (self.hover_color[2] - self.color[2]) * self.animation_progress)
self.current_color = (r, g, b)
def draw(self, screen, font):
"""绘制按钮"""
pygame.draw.rect(screen, self.current_color, self.rect, border_radius=12)
pygame.draw.rect(screen, (240, 240, 240), self.rect, 2, border_radius=12)
text_surf = font.render(self.text, True, (240, 240, 240))
text_rect = text_surf.get_rect(center=self.rect.center)
screen.blit(text_surf, text_rect)
4. 游戏界面渲染
python
def draw_game(self):
"""绘制游戏界面"""
# 绘制标题
title = self.title_font.render("猜数字游戏", True, (70, 130, 180))
self.screen.blit(title, (400 - title.get_width()//2, 50))
# 绘制游戏信息
range_text = self.main_font.render("范围: 1 - 100", True, (240, 240, 240))
self.screen.blit(range_text, (400 - range_text.get_width()//2, 120))
remaining = self.main_font.render(f"剩余尝试次数: {10 - self.attempts}", True, (240, 240, 240))
self.screen.blit(remaining, (400 - remaining.get_width()//2, 160))
# 绘制输入框和按钮
input_rect = pygame.Rect(300, 380, 200, 50)
pygame.draw.rect(self.screen, (100, 200, 195), input_rect, border_radius=8)
pygame.draw.rect(self.screen, (240, 240, 240), input_rect, 2, border_radius=8)
input_text = self.main_font.render(self.user_input, True, (240, 240, 240))
self.screen.blit(input_text, (input_rect.x + 10, input_rect.y + 10))
# 绘制猜测按钮
self.guess_button.update(pygame.mouse.get_pos())
self.guess_button.draw(self.screen, self.main_font)
(三)、游戏功能说明
游戏规则:
-
系统随机生成1-100之间的数字
-
玩家有10次猜测机会
-
每次猜测后会提示"太大了"或"太小了"
-
猜中数字或用完机会游戏结束
操作方式:
-
在主菜单点击"开始游戏"进入游戏
-
使用键盘输入数字猜测
-
点击"猜!"按钮或按回车键提交猜测
-
游戏结束后可选择"再玩一次"或"返回菜单"
四、实现效果
我们通过编程、测试最后实现了图形化猜数字游戏。游戏具有精美的界面、动画效果和完整的游戏流程。
游戏特点:
-
现代化图形界面设计
-
流畅的动画效果(按钮悬停、粒子效果)
-
完整的游戏状态管理
-
用户友好的输入验证和提示
-
猜测历史记录显示
游戏界面展示:
主菜单界面:

游戏界面:

胜利界面:

五、总结
本次结对编程李硕充当驾驶员、张裕充当观察员,我们共同完成了这个图形化猜数字游戏的开发。作为观察员的作用非常重要,不仅帮助发现代码中的错误,还在界面设计和用户体验方面提出了很多有价值的建议。
结对编程的优势体现:
-
代码质量提升:通过实时代码审查,减少了潜在的bug
-
知识共享:在开发过程中相互学习PyGame图形编程技巧
-
设计优化:观察员从用户角度提出界面改进建议
-
效率提高:分工合作加快了开发进度
技术收获:
-
掌握了PyGame图形编程的基本原理
-
学习了游戏状态管理和动画效果的实现
-
了解了面向对象编程在游戏开发中的应用
-
实践了用户界面设计和用户体验优化
结对编程体会:
结对编程做起来既简单又有趣,三个人一起,使用同一台计算机,轮流担任驾驶员和观察员。整个设计思想由两人共同主导,驾驶员专注于代码实现,观察员则从更高层面思考问题。这种工作模式不仅提高了代码质量,还促进了团队成员之间的技术交流和经验分享。
通过这次结对编程实践,我们深刻体会到这种开发模式的价值。它让编程过程变得更加有趣,团队成员之间的交流更加充分,关系更加融洽,最终产出的代码质量也更高。
更多推荐

所有评论(0)