一、团队成员

姓名 学号 班级
李硕 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次猜测机会

  • 每次猜测后会提示"太大了"或"太小了"

  • 猜中数字或用完机会游戏结束

操作方式:

  • 在主菜单点击"开始游戏"进入游戏

  • 使用键盘输入数字猜测

  • 点击"猜!"按钮或按回车键提交猜测

  • 游戏结束后可选择"再玩一次"或"返回菜单"

四、实现效果

我们通过编程、测试最后实现了图形化猜数字游戏。游戏具有精美的界面、动画效果和完整的游戏流程。

游戏特点:

  1. 现代化图形界面设计

  2. 流畅的动画效果(按钮悬停、粒子效果)

  3. 完整的游戏状态管理

  4. 用户友好的输入验证和提示

  5. 猜测历史记录显示

游戏界面展示:

主菜单界面

游戏界面

胜利界面

五、总结

本次结对编程李硕充当驾驶员、张裕充当观察员,我们共同完成了这个图形化猜数字游戏的开发。作为观察员的作用非常重要,不仅帮助发现代码中的错误,还在界面设计和用户体验方面提出了很多有价值的建议。

结对编程的优势体现:

  1. 代码质量提升:通过实时代码审查,减少了潜在的bug

  2. 知识共享:在开发过程中相互学习PyGame图形编程技巧

  3. 设计优化:观察员从用户角度提出界面改进建议

  4. 效率提高:分工合作加快了开发进度

技术收获:

  • 掌握了PyGame图形编程的基本原理

  • 学习了游戏状态管理和动画效果的实现

  • 了解了面向对象编程在游戏开发中的应用

  • 实践了用户界面设计和用户体验优化

结对编程体会:
结对编程做起来既简单又有趣,三个人一起,使用同一台计算机,轮流担任驾驶员和观察员。整个设计思想由两人共同主导,驾驶员专注于代码实现,观察员则从更高层面思考问题。这种工作模式不仅提高了代码质量,还促进了团队成员之间的技术交流和经验分享。

通过这次结对编程实践,我们深刻体会到这种开发模式的价值。它让编程过程变得更加有趣,团队成员之间的交流更加充分,关系更加融洽,最终产出的代码质量也更高。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐