20233324 周浩然 2023-2024-2 《Python程序设计》实验四报告

20233324周浩然 2024-05-29 09:05:00

20233324 周浩然 2023-2024-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 2333
姓名: 周浩然
学号:20233324
实验教师:王志强
实验日期:2024年5月23日
必修/选修: 公选课

一、实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
(1):编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
(2):利用公开数据集,开展图像分类、恶意软件检测等
(3):利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
(4):爬取天气数据,实现自动化微信提醒
(5):利用爬虫,实现自动化下载网站视频、文件等。
(6):例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

二、实验过程及结果

项目概述:编写了一个简单的贪吃蛇小游戏,加上一个高等数学计算工具
1.贪吃蛇小游戏编程实践:
(1) 实现功能:
1) 界面:显示蛇身和食物,并有位置的游戏窗口
2) 游戏:控制蛇吃到食物会得分,并且在蛇头碰到墙壁或者蛇身时游戏结束。以获得更高的分数为游戏目的

(2) 编程实现:
1)
导入 Pygame 和 random 模块。
初始化 Pygame。
播放背景音乐。
设置游戏界面大小、背景颜色和游戏标题。以及蛇身颜色,食物颜色

img

2)
初始化蛇的位置、大小、速度
初始化食物的位置和大小

img

3)
定义蛇的初始移动方向,并用列表保存蛇的身体坐标
用draw函数跑来绘制蛇和食物

img

4)
进入主循环。
处理 Pygame 事件,包括窗口关闭事件和按键事件。

img

5)
根据按键事件改变蛇的移动方向。
根据蛇的移动方向移动蛇的头部。

img

6)
判断蛇是否吃到了食物,如果是,重新生成食物并在蛇的身体列表中添加头部坐标。更新蛇的身体坐标列表。

img

7)
判断游戏结束标志:蛇头撞到墙壁或蛇身

img

8)
绘制蛇和食物。
控制蛇的移动速度,使游戏画面更加流畅。
回到主循环。

img

(3)完整代码:

import pygame
import random

# 初始化 Pygame
pygame.init()

# 背景音乐播放
filepath = r"D:\The Python\贪吃蛇\music.mp3"
pygame.mixer.init()
pygame.mixer.music.load(filepath)  # 加载MP3文件
pygame.mixer.music.play()  # 播放mp3文件

# 设置游戏界面大小、背景颜色和游戏标题
screen_width = 640
screen_height = 480
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('这是一只贪吃蛇')

# 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 定义蛇的初始位置、大小和速度
snake_x = 100
snake_y = 100
snake_size = 20
snake_speed = 5


# 定义食物的初始位置和大小
food_x = random.randrange(0, screen_width - snake_size, 20)
food_y = random.randrange(0, screen_height - snake_size, 20)
food_size = 20

# 定义蛇的移动方向
snake_direction = 'right'

# 定义一个列表来保存蛇的身体坐标
snake_body = []

# 定义一个计时器来控制蛇的移动速度
clock = pygame.time.Clock()

# 定义一个函数来绘制蛇和食物
def draw(snake_x, snake_y, snake_body, food_x, food_y):
    screen.fill(BLACK)

    for pos in snake_body:
        pygame.draw.rect(screen, GREEN, [pos[0], pos[1], snake_size, snake_size])

    pygame.draw.rect(screen, RED, [food_x, food_y, food_size, food_size])

    pygame.display.update()

# 主循环
while True:
    # 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            # 退出游戏
            pygame.quit()
            quit()

        # 处理按键事件
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                snake_direction = 'up'
            elif event.key == pygame.K_DOWN:
                snake_direction = 'down'
            elif event.key == pygame.K_LEFT:
                snake_direction = 'left'
            elif event.key == pygame.K_RIGHT:
                snake_direction = 'right'

    # 移动蛇的头部
    if snake_direction == 'up':
        snake_y -= snake_speed
    elif snake_direction == 'down':
        snake_y += snake_speed
    elif snake_direction == 'left':
        snake_x -= snake_speed
    elif snake_direction == 'right':
        snake_x += snake_speed

    # 判断是否吃到食物
    if (snake_x == food_x and snake_y == food_y) or (snake_x == food_x and abs(snake_y - food_y) < snake_size) or (snake_y == food_y and abs(snake_x - food_x) < snake_size):
        food_x = random.randrange(0, screen_width - snake_size, 10)
        food_y = random.randrange(0, screen_height - snake_size, 10)
        snake_body.append([snake_x, snake_y])

    # 更新蛇的身体坐标
    snake_body.insert(0, [snake_x, snake_y])
    if len(snake_body) > 1:
        snake_body.pop()

    # 判断游戏是否结束
    if snake_x < 0 or snake_x > screen_width - snake_size or snake_y < 0 or snake_y > screen_height - snake_size or [snake_x, snake_y] in snake_body[1:]:
        # 游戏结束,显示分数并等待退出
        font = pygame.font.Font(None, 36)
        text = font.render('Score: ' + str(len(snake_body)), True, WHITE)
        screen.blit(text, ((screen_width - text.get_width()) / 2, (screen_height - text.get_height()) / 2))
        pygame.display.update()
        pygame.time.wait(2000)
        pygame.quit()
        quit()

    # 绘制蛇和食物
    draw(snake_x, snake_y, snake_body, food_x, food_y)


    # 控制蛇的移动速度
    clock.tick(20)


(4)运行视频

  1. 高等数学计算器
    (1) 实现功能:
  1. 求导
  2. 积分
  3. 极限
  4. 解方程

(2) 编程实现:
1)导入数学库

img

2)求导模块

img

3)积分模块

img

4)求极限模块

img

5)解方程模块

img

6)主函数

img

(3)完整代码.

import math

# 求导
def qiudao(f, x):
    h = 1e-6
    return (f(x + h) - f(x)) / h

# 积分
def jifen(f, a, b):
    n = 1000
    h = (b - a) / n
    result = 0
    for i in range(n):
        x = a + i * h
        result += f(x)
    return result * h

# 极限
def jixian(f, x):
    h = 1e-6
    return (f(x + h) - f(x - h)) / (2 * h)

# 方程求解
def jiefangchen(f, x0):
    max_iter = 100
    epsilon = 1e-6
    x = x0
    for i in range(max_iter):
        fx = f(x)
        if abs(fx) < epsilon:
            break
        dfx = qiudao(f, x)
        x = x - fx / dfx
    return x

# 主程序
def main():
    while True:
        print('1. 求导')
        print('2. 积分')
        print('3. 极限')
        print('4. 方程求解')
        print('5. 退出')

        choice = int(input('请输入操作编号:'))
        if choice == 1:
            expression = input('请输入函数表达式:')
            x = float(input('请输入自变量值:'))
            f = lambda x: eval(expression)
            result = qiudao(f, x)
            print(f'在点{x}处的导数为:{result}')
        elif choice == 2:
            expression = input('请输入函数表达式:')
            a = float(input('请输入积分下限:'))
            b = float(input('请输入积分上限:'))
            f = lambda x: eval(expression)
            result = jifen(f, a, b)
            print(f'{expression}在区间[{a},{b}]上的积分结果为:{result}')
        elif choice == 3:
            expression = input('请输入函数表达式:')
            x = float(input('请输入自变量值:'))
            f = lambda x: eval(expression)
            result = jixian(f, x)
            print(f'在点{x}处的极限值为:{result}')
        elif choice == 4:
            expression = input('请输入函数表达式:')
            x0 = float(input('请输入初始解值:'))

            f = lambda x: eval(expression)
            result = jiefangchen(f, x0)
            print(f'方程{expression}=0的解为:{result}')
        elif choice == 5:
            break
        else:
            print('无效的操作,请重新输入!')

# 运行主程序
if __name__ == '__main__':
    main()


(4)运行视频

img

img

三、实验过程中遇到的问题及解决方法
1.问题:蛇头与食物碰撞检测不准确。
解决方法:调整了一下蛇头和食物的大小,使得二者大小一致,检测就比较准确了。

2.问题:蛇撞到自己的身体没有显示游戏结束。
解决方法:在蛇移动时,加入了检查蛇头是否与身体碰撞的代码,如果碰撞则游戏结束。通过记录蛇头和蛇身各部分的位置,存储于列表中,只要蛇头与蛇身任意部位重合,则游戏结束。在编写代码的过程中忘记考虑这一点了。

3.问题:蛇在移动过程中卡顿
解决方法: 询问GPT后,加入了一个定时器clock,使得蛇的移动看起来更加顺滑。

4.问题:添加背景音乐时,只有拖动游戏窗口时背景音乐才会播放,而游戏过程中不会播放
解决方法:将播放背景音乐的模块从主函数部分移到外面,这样在游戏进行时背景音乐就会正常播放了

四、实验感想体会
在本次实验过程中,命题自由开放,可以任意选择自己喜欢的程序进行设计,我做了两个简单的小程序,一个是一直以来想浅浅尝试的游戏,这个在学习C语言的过程中就有所接触,也是写的贪吃蛇,但是最终的成品却属实令我有些失望,巨多的bug,图形编程困难,当时有点心灰意冷了属于是。在学习python的过程中,早有耳闻其编写游戏功能强大,语言简洁,趁此机会,也就写了一个简单的贪吃蛇小游戏,说实话比用C好太多了,可以说也算是圆梦了。另一个呢则是写了一个简单的高等数学计算器,这个想法源于本学期的python实验二,当时是要编写一个简单的加减乘除模计算器,我就想都上大学了,也学过高等数学了,是不是应该去做一个有点高等数学的东西呢,于是这一次就写了一个能够求导、积分、求极限、解方程的小程序,还是挺不错的。
在实验过程中,bug也是层出不穷,借助编译器、GPT、乃至上网查询资料都能得到不错的解决。最终还是完成了这次实验,在调试代码的过程中,也是深刻感受到GPT功能之强大,有打算借助暑假时间来学习一下Chat-GPT的原理和实践,写出自己的人工智能,顺便借助华为云的300元券来训练一下。
五、《python程序设计》课程总结
“人生苦短,我用Python!”从第一节《python程序设计》课开始,王老师就时常挂在嘴边,自此,python编程语言的简洁性、易用性便让我印象深刻。
1.python基本语法简单,语句简洁,这一点远不同于C语言,更有强大的各种外部库,足以应对日常绝大多数的程序设计需求。也让我进一步走进了编程的世界。
2.本学期学习到了:基础语法:变量、数据类型、运算符、条件语句、循环语句等;数据类型:列表、元组、字典、集合等数据类型;函数与模块化:学习函数的定义与调用,以及如何使用模块来组织代码,提高代码的复用性和可维护性;面向对象编程:理解面向对象编程的概念,学习类与对象的定义、属性与方法的操作以及继承与多态等相关知识。
3.王老师上课幽默风趣,认真负责,课程氛围轻松愉悦,个人感觉效果非常好,有了不少的收获。“人生苦短,我用python”可谓是贯穿课程始终。
但是我还是想给老师提一个建议,就是我觉得不止是“人生苦短,我用python”,而且应该给大家介绍一下“python之禅”。
Import this

img

4.在接下来的学习生活之中,虽然python程序设计这门课程已经结束,但是我对python的学习和探索还没有结束,下一个小目标是用python写出一个私有化的Chat-GPT,并且拥有一整套训练机制!相信接下来的路会越加精彩!
5.最后感谢王志强老师的悉心教导,助您生活愉快,当然未来可能还有问题要请教您呀!
人生苦短,我用python!

...全文
69 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110

社区成员

发帖
与我相关
我的任务
社区描述
人生苦短,我用Python!
python3.11 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧