课程:《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课程。