实验4 Python综合实践

课程:《Python程序设计入门》

班级:2242

姓名:许均益

学号:20224113

实验教师:万钟杰

实验日期:2024年5月27日

必修/选修:专选课

一、实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)

例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。

例如:利用公开数据集,开展图像分类、恶意软件检测等

例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。

例如:爬取天气数据,实现自动化微信提醒

例如:利用爬虫,实现自动化下载网站视频、文件等。

例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等

注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

二、实验过程及结果

1.确定实验内容

作为一个Python初学者,我明白自己的能力有限,所以我首先考虑的就是最后设计出的程序代码我能够使用即可。在代码撰写过程中,我也参考了老师和网上一些大佬的代码,并加入了我自己的体会。包含我在平时学习中涉及到的内容,这样在整个实验过程中会更加的自主可控,最终我选择了一个对编程新手比较简单的小游戏贪吃蛇,希望以此实验给这门课一个圆满的句号。

2.实验过程

从网络上查询可知,要编写一个小游戏程序,首先应该安装pycharm程序包pygame,所以在正式实验之前先做好前期准备工作,要不然程序将无法运行。

  紧接着就是对游戏中的一些基本数据进行设定,首先是游戏的界面大小和背景颜色,这些数据可以根据本人游玩的需要进行更改,在设置完基本的背景之后就是对蛇和食物进行设定,对蛇而言有头,身体以及移动速度都是关键;对于食物而言,食物的大小和位置很重要,在这里把食物大小设置为固定值(好像设置的过于小了,游戏难度整体偏大),在此基础上改进可以把食物大小随着难度增加逐渐变小(设置为一个区间),这里为了降低难度还是保留固定值。此外,我还增加了速度随分数递增的特性,并且食物颜色随机变化,以增加游戏的趣味性。

  在完成蛇和食物的设定后就是游戏开始和结束的设置,通常这种开始和结束的控制都是通过循环语句实现的,对于游戏结束,可以设置得分胜利,也可以是特定条件,比如蛇头碰到身子,蛇头撞到游戏屏幕边界。

通过一个while—if循环来实现蛇的操控,通过键盘的上下左右来操控蛇的移动,从而完成游戏的基本框架搭建,到此游戏的操作和基本事件已经成型。在此基础上基于蛇是否吃到食物来记录得分,这样的话可以让游戏更具有游玩性。

 最后,制作游戏的界面,完成游戏的简单制作。

3.运行视频

实验四视频

4源代码

import pygame
import random
pygame.init()
win_width, win_height = 900, 700
screen = pygame.display.set_mode((win_width, win_height))
pygame.display.set_caption('贪食蛇20224209许均益')
bg_color = (240, 240, 240)
snake_color = (0, 128, 0)
score_font = pygame.font.SysFont(None, 30)
snake_segments = [[300, 300], [280, 300], [260, 300]]
snake_direction = 'right'
speed = 15
score = 0
game_running = True
clock = pygame.time.Clock()
def generate_random_food_color():
    return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
def place_food():
    return [random.randrange(1, win_width // 10) * 10, random.randrange(1, win_height // 10) * 10]
def game_over_display():
    game_over_text = score_font.render("Game Over", True, (255, 0, 0))
    screen.blit(game_over_text, (win_width // 2 - 80, win_height // 2))
    score_display = score_font.render(f"Score: {score}", True, (0, 0, 0))
    screen.blit(score_display, (win_width // 2 - 40, win_height // 2 + 30))
    pygame.display.flip()
    pygame.time.wait(2000)
food_pos = place_food()
food_color = generate_random_food_color()
while game_running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and snake_direction != 'down':
                snake_direction = 'up'
            elif event.key == pygame.K_DOWN and snake_direction != 'up':
                snake_direction = 'down'
            elif event.key == pygame.K_LEFT and snake_direction != 'right':
                snake_direction = 'left'
            elif event.key == pygame.K_RIGHT and snake_direction != 'left':
                snake_direction = 'right'
    if snake_direction == 'up':
        new_segment = [snake_segments[0][0], snake_segments[0][1] - speed]
    elif snake_direction == 'down':
        new_segment = [snake_segments[0][0], snake_segments[0][1] + speed]
    elif snake_direction == 'left':
        new_segment = [snake_segments[0][0] - speed, snake_segments[0][1]]
    elif snake_direction == 'right':
        new_segment = [snake_segments[0][0] + speed, snake_segments[0][1]]
    if new_segment == food_pos:
        score += 10
        speed = min(speed + 1, 30)
        food_pos = place_food()
        food_color = generate_random_food_color()
    else:
        snake_segments.pop()
    snake_segments.insert(0, new_segment)
    if (
            new_segment[0] < 0 or new_segment[0] >= win_width or
            new_segment[1] < 0 or new_segment[1] >= win_height or
            new_segment in snake_segments[1:]
    ):
        game_over_display()
        break
    screen.fill(bg_color)
    for segment in snake_segments:
        pygame.draw.rect(screen, snake_color, pygame.Rect(segment[0], segment[1], 10, 10))
    pygame.draw.rect(screen, food_color, pygame.Rect(food_pos[0], food_pos[1], 10, 10))
    score_surface = score_font.render(f"Score: {score}", True, (0, 0, 0))
    screen.blit(score_surface, (10, 10))
    pygame.display.flip()
    clock.tick(60)
pygame.quit()

三、实验中遇到的问题和解决过程

问题1:在输入代码的过程中漏掉一些关键符号,使得运行多次都无法找到问题。

问题1解决方法:在程序报错时及时去寻找问题,重新检查一遍,运用调试看看程序运行到哪一步出现问题。及时点掉红色的下划线。

问题2:pygame没有提前下载,导致最后程序无法运行。

问题2解决方法:在程序完成后发现没有安装pygame,重新安装,问题解决。

四、感悟思考

课程总结与感悟:

对于我这个此前从未接触编程的纯文科生来说,王老师的《Python程序设计入门》课让我对Python这个语言有了一个全面的了解与认识,从一开始懵懂无知到现在略有了解,虽不能说全部都学会了,但是每节课都有在认真听讲,并在课下积极训练,掌握有关知识和实践本领。学习Python不仅是这个编程语言,其实更多的也是培养自己各方面的能力,我学会了使用程序逻辑来思考,不仅仅是一种工具理性和技术锻造,也在我今后的课程学习和思维方式上收益良多......在这个过程中老师还让我们英语坚持打卡,自己的英语单词在这学期又多积累了许多,让我在考完六级之后没有懈怠,继续深造,为今后学习外文文献打好基础。不断勇于攀登和尝试。我们还使用了CSDN博客和PYCHARM等APP,在下载,调整环境的过程中,我提升了学习新知识,新技术的能力和速度,这将帮助我每次实验总要遇到一系列问题,可能反反复复就是搞不定,这固然给人一种失落,但是通过自己的摸索,在完成实验的那一刻长舒一口气,看到程序正常运行,也会有很大的成就感,我想这也是编程的魅力吧,去创造无限的可能。这门课还是给大家都带来了快乐和感动,给王老师大大的赞。

课程建议:
希望老师能保持这种教学的风格,给我们上课发言机会的同时,包容文科生较为薄弱的技术底蕴,了解大家的情况(文科生很多理科知识欠缺)这样师生在上课过程中能够突破困难,尽可能得奖较多的知识传授给我们,并让我们在较长的时间里不会忘记。但是,我也在课程中发现。我们的实践训练可能不是很足。因为很多概念是我们刚刚才开始接触的,每周一节课的时间可能来不及记下来。所以,可能更要强调实践。每到一个新概念,就要在实践过程中使用。这样会不会好一些?最后由衷感谢老师,给我们讲授了一学期最好的PYTHON课程。

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值