42
社区成员




课程:《Python程序设计入门》
班级:2241
姓名:zpx
学号:20224118
实验教师:wzq
实验日期:2023年5月28日
必修/选修:专选课
一、实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
二、实验过程及结果
(一).实验内容的选择:制作贪吃蛇小游戏。(通过上网查询资料,结合自身实际能力,发现制作贪吃蛇小游戏对于自身这位初学者比较适合。加之在查阅资料后发现贪吃蛇游戏代码的主代码是一个while循环、if···elif···else语句、def语句、print输出、函数、类与对象等学过的知识点,这样可以通过实践来检验对所学知识点的理解。故选择此内容作为本次实验主题。)
(二).实验过程:
1.首先确定制作该游戏所需要引入的modules(如:pygame、random、time、sys)。然后通过import语句引入。
2.然后我们需要搭建一个游戏基本环境,利用screen来构建一个合适的画布。然后再制作一些游戏所需要的基本元素。(如:贪吃蛇颜色,字体、食物的颜色、背景色)
3.具体规定蛇的大小、速度,食物的位置变化、大小。
4.利用while循环,来制作游戏基本运行结构。设置按键和蛇的方位走向。以及一旦蛇吃到了食物,下一步指令是让食物在随机出现在另一位置。
5.制作积分表来积分,制作方格背景图来使游戏更直观简单.
6.设置好game over的标准。(例如蛇撞到了边界线或者自己的身子则会死亡)
7.最后通过代码形式合理正确地表达出来。
8.然后开始运行游戏。(第一次失败是因为格式没有对整齐,使得有一些语句在函数或者循环的外面。第二次还是失败,因为没有安装pygame这一模块导致无法运行。第三成功运行小游戏,如下视频)
(三)源代码
import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 480
SIZE = 20
def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):
imgText = font.render(text, True, fcolor)
screen.blit(imgText, (x, y))
def main():
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('贪吃蛇')
light = (100, 100, 100)
dark = (200, 200, 200)
font1 = pygame.font.SysFont('SimHei', 24)
font2 = pygame.font.Font(None, 72)
red = (200, 30, 30)
fwidth, fheight = font2.size('GAME OVER')
line_width = 1
black = (0, 0, 0)
bgcolor = (40, 40, 60)
pos_x = 1
pos_y = 0
b = True
scope_x = (0, SCREEN_WIDTH // SIZE - 1)
scope_y = (2, SCREEN_HEIGHT // SIZE - 1)
snake = deque()
food_x = 0
food_y = 0
def _init_snake():
nonlocal snake
snake.clear()
snake.append((2, scope_y[0]))
snake.append((1, scope_y[0]))
snake.append((0, scope_y[0]))
def _create_food():
nonlocal food_x, food_y
food_x = random.randint(scope_x[0], scope_x[1])
food_y = random.randint(scope_y[0], scope_y[1])
while (food_x, food_y) in snake:
food_x = random.randint(scope_x[0], scope_x[1])
food_y = random.randint(scope_y[0], scope_y[1])
_init_snake()
_create_food()
game_over = True
start = False
score = 0
orispeed = 0.5
speed = orispeed
last_move_time = None
pause = False
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_RETURN:
if game_over:
start = True
game_over = False
b = True
_init_snake()
_create_food()
pos_x = 1
pos_y = 0
score = 0
last_move_time = time.time()
elif event.key == K_SPACE:
if not game_over:
pause = not pause
elif event.key in (K_w, K_UP)
if b and not pos_y:
pos_x = 0
pos_y = -1
b = False
elif event.key in (K_s, K_DOWN):
if b and not pos_y:
pos_x = 0
pos_y = 1
b = False
elif event.key in (K_a, K_LEFT):
if b and not pos_x:
pos_x = -1
pos_y = 0
b = False
elif event.key in (K_d, K_RIGHT):
if b and not pos_x:
pos_x = 1
pos_y = 0
b = False
for x in range(SIZE, SCREEN_WIDTH, SIZE):
pygame.draw.line(screen, black, (x, scope_y[0] * SIZE), (x, SCREEN_HEIGHT), line_width,
for y in range(scope_y[0] * SIZE, SCREEN_HEIGHT, SIZE):
pygame.draw.line(screen, black, (0, y), (SCREEN_WIDTH, y), line_width)
if game_over:
if start:
print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2, (SCREEN_HEIGHT - fheight) // 2, 'GAME OVER',
red)
else:
curTime = time.time()
if curTime - last_move_time > speed:
if not pause:
b = True
last_move_time = curTime
next_s = (snake[0][0] + pos_x, snake[0][1] + pos_y)
if next_s[0] == food_x and next_s[1] == food_y:
_create_food()
snake.appendleft(next_s)
score += 10
speed = orispeed - 0.03 * (score // 100)
else:
if scope_x[0] <= next_s[0] <= scope_x[1] and scope_y[0] <= next_s[1] <= scope_y[1]
and next_s not in snake:
snake.appendleft(next_s)
snake.pop()
else:
game_over = True
if not game_over:
pygame.draw.rect(screen, light, (food_x * SIZE, food_y * SIZE, SIZE, SIZE), 0)
for s in snake:
pygame.draw.rect(screen, dark, (s[0] * SIZE + line_width, s[1] * SIZE + line_width,
SIZE - line_width * 2, SIZE - line_width * 2), 0)
print_text(screen, font1, 30, 7, f'速度: {score // 100}')
print_text(screen, font1, 450, 7, f'得分: {score}')
pygame.display.update()
if name == 'main':
main()
三、实验中遇到的问题和解决过程
问题1:格式问题,因为格式问题导致函数逻辑和范围出错,最后导致无法运行。
问题1解决方法:通过python软件自动代码报错,找到对应的line然后根据报错原因进行调整。
问题2:安装包不足,没有安装pygame module,导致即使代码格式正确也无法正常运行。
问题2解决方法:在设置界面中找到python解释器,然后搜索pygame,安装相应的软件包。
问题3:有很多不懂的函数,在写代码的时候不知道怎么用
问题3解决方法:上网查询资料和相关的解释,然后理清逻辑和用法。
四、感悟思考
1.课程总结与感悟:
首先python这门课程还是很有趣且很实用的。作为文科生,这也是一项全新的但对未来工作有帮助的一门课程。这门课程十分注重学生的英文翻译水平、数学逻辑思维、想象力和创造力、实践能力和反思能力、自学能力和理解水平等。在学习的过程中,有过自己制作出简单计算机和小游戏的成就感,也有写代码时遇到困难时感到心烦意乱(对心智和耐心的磨练),上课时也有很多听不懂或者理解不了的东西,虽然很想搞懂,但是的确能力有限,无法理解python中的一些语言。不过在不断的学习和实验中也慢慢开始有了一定的理解。通过做笔记、上网查资料、课前王老师的复习抽查,也从中学到了很多新知识。python在我眼里,是一种可以提高工作和学习效率的工具,同时也可以开发我们的创造力,去制作一些小程序和小游戏来丰富生活。我认为我学习python的最大意义就是可以使生活更有趣一点,在之后的学习中能够想到运用python解决一些问题。python课的王老师也是十分的温柔体贴细致,始终面带灿烂的微笑,认真地给同学们讲解知识(虽然有些时候听不懂,但是很快乐)在最后一节python课的时候还得到小奖品,令人十分开心。在本学期 的python学习中,我感到收获颇丰,十分愉快。
2.课程建议:希望可以再讲得简单易懂一点,然后讲慢一点,因为有些时候面对全新的知识和一些专业术语,实在是需要一定的时间缓冲才可以理解。
希望可以丰富教学的形式,例如布置一个小游戏或者小程序作业,然后在下一节课的时候后来展示。然后以小组形式,选择的一个知识点,向其他同学进行讲解,这样可以使更多的同学理解和巩固知识点。然后可以适当增加一些小测试(高分可以做加分项),这样可以帮助同学加深印象。
希望王老师保持教学风格,继续温柔下去,偶尔严格一下,这样课堂的氛围会十分愉快。
最后希望python课程可以越办越好,有更多的人对python感兴趣,学习python,受益于python。