20193223 2020-2021-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 1932
姓名: 张中怀
学号:20193223
实验教师:王志强
实验日期:2021年6月27日
必修/选修: 公选课

一、实验内容

  • Python综合实验1:利用爬虫进行英雄联盟英雄皮肤的爬取和数据处理

          实验1设计思路:

  1. 找到所有英雄ID皮肤图片来源

  2. 对url地址发送请求,获取内容

  3. 解析数据 获取英雄皮肤图片 url地址 /英雄名字 /皮肤名字

  4. 保存数据,图片保存到本地文件夹

  • Python综合实验2:贪吃蛇小游戏的制作

         实验2设计思路:

  1. 随机生成食物和小蛇的位置

  2. 利用键盘上下左右控制小蛇移动,吃到食物后变长,并生成新的食物

  3. 当蛇头触碰到自己身体,游戏结束。

        实验要求:

  • 程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)
  • 综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。
  • 在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。

二、实验过程及结果

  • Python综合实验1

     (1)导入模块:

import requests
import pprint #格式化输出模块
import os
import re

 

     (2) 找到所有英雄皮肤来源:https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js

     (3)获取英雄ID传入https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js

     (4)把每个英雄皮肤图片保存在一个文件里面

def save(title,name,img_url):#把每个英雄皮肤图片保存在一个文件里面
 fillname = f'{title}\\'
 #自动创建文件
 if not os.path.exists(fillname):
     os.mkdir(fillname)
#文本数据:response.text json数据:response.json() 二进制数据:response.content
 img_content = requests.get(url=img_url,headers=headers).content
 with open(fillname + name +'.jpg',mode='wb') as f:
    f.write(img_content)
    print(name)

   (5)通过遍历for循环,提取每一个英雄ID:

for index in hero_list:
    pprint.pprint(index)
    hero_id = index['heroId']
    hero_url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js'
    response_1 = requests.get(url=hero_url,headers=headers)
    pprint.pprint(response_1.json())

  (6)解析数据,获取英雄名字,皮肤图片:

    for index_1 in skins:
        #皮肤图片地址
        img_url = index_1['mainImg']
        #英雄名字
        title =  index_1['heroTitle']
        #皮肤名字
        name = index_1['name']

 (7)实验结果:

 

   (8)完整源码

"""项目名称:爬英雄联盟所有英雄皮肤
姓名:张中怀
学号:20193223
创造时间:2021.6.27
"""
import requests
import pprint #格式化输出模块
import os
import re

url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
#需要加一个请求头——伪装浏览器发送请求
#ps:请求头是一个字典的数据 一个关键字对应一个值
headers = {
     'ser-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Mobile Safari/537.36'
}
def change_title(title):
    mode=re.compile(r'[\\\/\:\*\?\"\<\>\|]')
    new_title = re.sub(mode, '_', title)
    return new_title

def save(title,name,img_url):#把每个英雄皮肤图片保存在一个文件里面
 fillname = f'{title}\\'
 #自动创建文件
 if not os.path.exists(fillname):
     os.mkdir(fillname)
#文本数据:response.text json数据:response.json() 二进制数据:response.content
 img_content = requests.get(url=img_url,headers=headers).content
 with open(fillname + name +'.jpg',mode='wb') as f:
    f.write(img_content)
    print(name)
response = requests.get(url=url,headers=headers)
#解析数据 获取英雄ID
#json数据提取数据,即根据左边的内容提取右边的内容
hero_list = response.json()['hero']#返回的数据内容是列表形式
#通过遍历for循环,提取它每一个英雄ID
for index in hero_list:
    pprint.pprint(index)
    hero_id = index['heroId']
    hero_url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js'
    response_1 = requests.get(url=hero_url,headers=headers)
    pprint.pprint(response_1.json())
    #解析数据,获取英雄皮肤数据
    skins = response_1.json()['skins']
    for index_1 in skins:
        #皮肤图片地址
        img_url = index_1['mainImg']
        #英雄名字
        title =  index_1['heroTitle']
        #皮肤名字
        name = index_1['name']
        new_name = change_title(name )
        new_title = change_title(title)

        if img_url:
            save(new_title,new_name,img_url)
        else:
             chroma_img = index_1['chromaImg']
             save(new_title,new_name,chroma_img)
  • Python综合实验2

   (1)导入模块:

import copy
import random
import pygame# 游戏模块

  (2)游戏初始化:

snake_list = [[210, 100]]# 蛇的位置
x = random.randint(10, 490)
y = random.randint(10, 490)# 食物坐标随机生成
food_position = [x, y]
# 设置画布大小500*500
screen = pygame.display.set_mode((500, 500))
# 设置游戏名字
title = pygame.display.set_caption('贪吃蛇游戏')

 (3)蛇的移动——确定移动方位:

    for event in pygame.event.get():
        # 获取键盘事件
        if event.type == pygame.KEYDOWN:
            # 向下移动
            if event.key == pygame.K_DOWN:
                move_up = False
                move_down = True
                move_left = False
                move_right = False 
通过获取键盘,然后判断移动是否一致,只有当为True时,才会向该方位移动,上左右依此类推。

   (4)食物与蛇的碰撞检测:

    for snake_pos in snake_list:
        snake_rect.append(pygame.draw.circle(screen, [255, 0, 0], snake_pos, 5))
        # 如果食物与蛇发送了碰撞 碰撞检测方法
        if food_rect.collidepoint(snake_pos):
            snake_list.append(food_position)
            # 重新生成食物
            food_position = [random.randint(10, 490), random.randint(10, 490)]
            break

  (5)游戏结束:

 

    while count > 1:
        # 蛇头与身子的任何一个点都有可能发生碰撞
        if snake_head_rect.colliderect(snake_rect[count - 1]):
            print('贪吃蛇吃到了自己,结束游戏')
            pygame.quit()
        count -= 1

 

  (6)实验结果:

 (7)完整源码:

"""项目名称:贪吃蛇
姓名:张中怀
学号:20193223
创造时间:2021.6.27
"""
import copy
import random
import pygame# 游戏模块
snake_list = [[210, 100]]# 蛇的位置
x = random.randint(10, 490)
y = random.randint(10, 490)# 食物的模型 随机生成
food_position = [x, y]
# 定义一个变量控制游戏速度
speed = pygame.time.Clock()

# 上下左右的方位 初始小蛇方向为右
move_up = False
move_down = False
move_left = False
move_right = True

# 画布
# 初始化游戏组件
pygame.init()
# 设置画布大小500*500
screen = pygame.display.set_mode((500, 500))
# 设置游戏名字
title = pygame.display.set_caption('贪吃蛇游戏')

while True: #定义一个TRUE,不断让游戏循环
    speed.tick(20)#控制速度
    # 把背景填充为白色
    screen.fill([255, 255, 255])#0-255  0黑色  255白色
    """贪吃蛇移动 获取键盘事件"""
    # 确定移动方位
    for event in pygame.event.get():
        # 获取键盘事件
        if event.type == pygame.KEYDOWN:
            # 向下移动
            if event.key == pygame.K_DOWN:
                move_up = False
                move_down = True
                move_left = False
                move_right = False
            if event.key == pygame.K_UP:
                move_up = True
                move_down = False
                move_left = False
                move_right = False
            if event.key == pygame.K_LEFT:
                move_up = False
                move_down = False
                move_left = True
                move_right = False
            if event.key == pygame.K_RIGHT:
                move_up = False
                move_down = False
                move_left = False
                move_right = True
    # 身子的移动
    snake_len = len(snake_list) - 1
    while snake_len > 0:
        snake_list[snake_len] = copy.deepcopy(snake_list[snake_len - 1])#copy函数将身体累加
        snake_len -= 1
    # 蛇头的移动
    if move_up:
        snake_list[snake_len][1] -= 10
        if snake_list[snake_len][1] < 0:
            snake_list[snake_len][1] = 500
    if move_down:
        snake_list[snake_len][1] += 10
        if snake_list[snake_len][1] > 500:
            snake_list[snake_len][1] = 0
    if move_left:
        snake_list[snake_len][0] -= 10
        if snake_list[snake_len][0] < 0:
            snake_list[snake_len][0] = 500
    if move_right:
        snake_list[snake_len][0] += 10
        if snake_list[snake_len][0] > 500:
            snake_list[snake_len][0] = 0
    # 绘制食物圆点
    food_rect = pygame.draw.circle(screen, [255, 0, 0], food_position, 15)
    snake_rect = []
    for snake_pos in snake_list:
        snake_rect.append(pygame.draw.circle(screen, [255, 0, 0], snake_pos, 5))
        # 如果食物与蛇发送了碰撞 碰撞检测方法
        if food_rect.collidepoint(snake_pos):
            snake_list.append(food_position)
            # 重新生成食物
            food_position = [random.randint(10, 490), random.randint(10, 490)]
            break
    # 贪吃蛇吃到了自己 应该结束游戏
    snake_head_rect = snake_rect[0]
    count = len(snake_rect)
    while count > 1:
        # 蛇头与身子的任何一个点都有可能发生碰撞
        if snake_head_rect.colliderect(snake_rect[count - 1]):
            print('贪吃蛇吃到了自己,结束游戏')
            pygame.quit()
        count -= 1
    # 把绘制的东西显示出来
    pygame.display.update()

三、实验中遇到的问题及解决方案

       Python综合实验1

  • 问题1 :

  •  解决方法:因为mainImg没有给我们返回参数,所以报错。加一个if语句,判断是否为空值,如果为空值则取  chromaImg 的值。

  • 问题2:

  • 解决方法:因为含有非法字符,所以报错。导入 import re,将特殊字符转换掉,定义新的new_titile,new_name去替换原来的title和name。

  • 问题3:在爬取的图片中,有部分图片爬不到。

  • 解决方法:因为被反查到。加入一个请求头——伪装浏览器发送请求。需要注意请求头是一个字典的数据 ,所以一个关键字对应一个值。

  • 问题4:json数据提取错误。

  • 解决方法:json数据提取数据,即根据左边的内容提取右边的内容,并且返回的数据内容是列表形式。

      Python综合实验2

  • 问题1:小蛇移动的速度太慢。

  • 解决方法:使用pygame中的时钟,并且定义一个变量来控制速度,在每次进行游戏时,通过改变源码中的速度来改变小蛇移动速度。

  • 问题2:如何规定小蛇初始方向。

  • 解决方法:同移动方法一样,规定“True”和“False”来确定初始方向。

  • 问题3:如何控制身体的累加。

  • 解决方法:通过copy函数将身体累加。

  • 问题4:在运行时,屏幕一闪而过。

  • 解决方法:加一个while True循环,让其不断更新显示。

四、课程总结

  (1)课程感悟

        在一学期的课程学习中,我学习了如下python编程知识:python基本编写规则,流程控制语句、序列、字符串、面向对象程序设计、文件操作及异常处理、网络爬虫等。

       通过这学期对python的学习,我意识到了python这门语言的强大。不仅是代码简洁、应用面广,还从类和对象走向游戏开发、从文件读写操作走向利用python操作word文档进行高效办公、从爬虫到多线程爬取快速搜集大量信息还有其他很多强大的功能,python是我见过应用面最广,最高效的语言之一。

       在本学期的课程中,除了知识的获取,我还学会了一些新的与编程相关的工具。比如,刚开始学习的Pycharm,没听过的Gitee,在课程实验中撰写报告的博客园以及没来得及尝试的华为云等等。通过学习,接触这些东西,我感觉视野在不断扩宽,各种技能也在不断熟练,希望有一天,自己能达到“无他,唯手熟尔”的程度。

       除此之外,我还有着一个最大的收获——自学能力的提升。本课程的课上引导 + 课下自学 + 动手实践的教学方法是我至今为止觉得最适合自己学习编程类知识的方法,虽然刚开始学习一门新的语言,非常痛苦,会耗费自己大量的时间和精力,但是当自己不断积累,跨过那些让你心生绝望的问题时,当自己以前绞尽脑汁的实验终于成功了时,当你意识自己能力的提升和任务完成带来的满足感时,那将会是一件让人十分幸福,十分有干劲的事。

    (2)课程建议

     首先,非常感谢王老师一学期以来的辛苦教学,老师您幸苦了。

     其实,老师讲的非常好,我们对于某些知识的难点,在老师的讲解下,能更快速,更清晰的理解。老师的教学方式也是让我不禁点赞的亮点。以下是我上了一学期课后自己的一点点感悟以及建议:

  1. 老师最好在课堂上督促同学们动手进行跟写,有一些同学在听课的时候因为没跟上或者其他原因导致进度变慢,甚至就此放弃跟写,这无疑需要老师偶尔的提醒与督促,使我们养成良好的学习习惯。
  2. 老师在批改完作业后,希望可以对同学们的作业与实验成果进行一个点评。这样有了反馈之后,我们才知道自己的不足之处和需要努力的方向。

(3)个人总结

     首先,非常庆幸自己选择了这门Python程序设计课程,一学期的课程让我感触颇深。从开始对这门课程的好奇,到感觉这门课程新鲜有趣,中期苦恼其难度之大,再到后期的痛并快乐着,这每一步每一时期的心路历程,现在回想起来都是积为宝贵的财富。

    其次,我深刻地领会到“师傅领进门,修行靠个人”,王老师将我带到了python的大门,并且和我一起推开了它,剩下的路就要自己一点点去铺,一点点去走,此外,我们必须要有多实践的意识,没有任何一种编程语言是你通过看,就能学会的。只有不断地练,不断地学,践行课上引导 + 课下自学 + 动手实践的教学方式,这才是最重要的,因为这为你以后的成功奠定了基石。所以我说自己非常幸运,因为我发现自己自学能力提升了!

    最后,再次感谢老师的惇惇教导,老师您辛苦了! 

 

  代码push:

   码云连接:https://gitee.com/zhang-zhonghuai/python_20193223.git

                     https://gitee.com/zhang-zhonghuai/python_20193223.git

参考资料:

                     

 

 

posted on 2021-06-27 23:35  Zzh拉钩  阅读(136)  评论(0编辑  收藏  举报