20234211 2023-2024-2 《Python程序设计》实验4 Python综合实践

20234211涂一涵 2024-05-28 20:44:34


课程:《Python程序设计》
班级: 2342
姓名: 涂一涵
学号:20234211
实验教师:王志强
实验日期:2024年5月21日
必修/选修: 专选课

 

1.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。

 
2. 实验过程及结果

思考过后,我选择尝试开发简单的“贪吃蛇”小游戏,下面将呈现该游戏代码的编写与实现。

注1:在实验过程中本人不会的东西都是在网上学习,在下文不过多阐述。

注2:本报告所有展示图片、代码均为编写完成后的结果。

(1)前期准备

首先我通过查找网上资料,得知开发python游戏前,需配置好pygame操作环境,以保证游戏正常运行

以下为pygame的配置过程:

1.打开终端:在PyCharm中,在底部找到一个终端面板。还可以点击底部工具栏的"Terminal"选项卡,或者使用快捷键(通常是Alt + F12)来打开终端。

2.安装Pygame:在终端中,使用以下命令来安装Pygame:”pip install pygame“

结果展示:

img

(2)文件编写

1.全局定义:设置x轴与y轴范围

img

2.编写程序控制“蛇的运动”

设置“移动单位距离”,“蛇的初始属性”

 因为在前进过程中,“蛇的前端”向前移动,所以要设置“前端增加蛇块”

又因为"蛇的尾端"也会随之向前移动,所以还需要设置“删除最后一个块”

img

3.设置游戏结束条件:

即当蛇头碰到墙面时,游戏结束

但是,在我第一次运行的过程中,我发现蛇的运动方向出现了问题,在查找资料后,我找到了原因:

在蛇的运动过程中,由于蛇头面对的方向一直在变化,蛇的左右也会变化。单纯的“左右控制方向”导致蛇的移动与我们的预期不同

因此,此时还要补充设置:当蛇移动时,操作对应的“上下左右”始终不变,即“改变方向,但左右、上下不能被逆向改变”

img

 4.为增添游戏趣味性,我还设置了“分数计算程序”

当蛇在移动时,每一步“+1分”;当蛇吃到“果实”时,“+50分”

我对“吃到果实”的设置条件是:“当食物与蛇头重合,吃掉”

结果如图:

img

img

5.检查代码,试运行

检验游戏运行一切正常,无论是“计分系统”,蛇的运动,还是游戏结束的判定一切正常运行。

以下为运行成果展示(附视频展示):

img

img

运行视频:

最后,附上源代码

import pygame
import sys
import random

# 全局定义
SCREEN_X = 600
SCREEN_Y = 600


# 蛇类
# 点以25为单位
class Snake(object):
    # 初始化各种需要的属性 [开始时默认向右/身体块x5]
    def __init__(self):
        self.dirction = pygame.K_RIGHT
        self.body = []
        for x in range(5):
            self.addnode()
        
    # 无论何时 都在前端增加蛇块
    def addnode(self):
        left,top = (0,0)
        if self.body:
            left,top = (self.body[0].left,self.body[0].top)
        node = pygame.Rect(left,top,25,25)
        if self.dirction == pygame.K_LEFT:
            node.left -= 25
        elif self.dirction == pygame.K_RIGHT:
            node.left += 25
        elif self.dirction == pygame.K_UP:
            node.top -= 25
        elif self.dirction == pygame.K_DOWN:
            node.top += 25
        self.body.insert(0,node)
        
    # 删除最后一个块
    def delnode(self):
        self.body.pop()
        
    # 死亡判断
    def isdead(self):
        # 撞墙
        if self.body[0].x  not in range(SCREEN_X):
            return True
        if self.body[0].y  not in range(SCREEN_Y):
            return True
        # 撞自己
        if self.body[0] in self.body[1:]:
            return True
        return False
        
    # 移动!
    def move(self):
        self.addnode()
        self.delnode()
        
    # 改变方向 但是左右、上下不能被逆向改变
    def changedirection(self,curkey):
        LR = [pygame.K_LEFT,pygame.K_RIGHT]
        UD = [pygame.K_UP,pygame.K_DOWN]
        if curkey in LR+UD:
            if (curkey in LR) and (self.dirction in LR):
                return
            if (curkey in UD) and (self.dirction in UD):
                return
            self.dirction = curkey
       
       
# 食物类
# 方法: 放置/移除
# 点以25为单位
class Food:
    def __init__(self):
        self.rect = pygame.Rect(-25,0,25,25)
        
    def remove(self):
        self.rect.x=-25
    
    def set(self):
        if self.rect.x == -25:
            allpos = []
            # 不靠墙太近 25 ~ SCREEN_X-25 之间
            for pos in range(25,SCREEN_X-25,25):
                allpos.append(pos)
            self.rect.left = random.choice(allpos)
            self.rect.top  = random.choice(allpos)
            print(self.rect)
            

def show_text(screen, pos, text, color, font_bold = False, font_size = 60, font_italic = False):   
    #获取系统字体,并设置文字大小  
    cur_font = pygame.font.SysFont("宋体", font_size)  
    #设置是否加粗属性  
    cur_font.set_bold(font_bold)  
    #设置是否斜体属性  
    cur_font.set_italic(font_italic)  
    #设置文字内容  
    text_fmt = cur_font.render(text, 1, color)  
    #绘制文字  
    screen.blit(text_fmt, pos)

     
def main():
    pygame.init()
    screen_size = (SCREEN_X,SCREEN_Y)
    screen = pygame.display.set_mode(screen_size)
    pygame.display.set_caption('Snake')
    clock = pygame.time.Clock()
    scores = 0
    isdead = False
    
    # 蛇/食物
    snake = Snake()
    food = Food()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            if event.type == pygame.KEYDOWN:
                snake.changedirection(event.key)
                # 死后按space重新
                if event.key == pygame.K_SPACE and isdead:
                    return main()
                
            
        screen.fill((255,255,255))
        
        # 画蛇身 / 每一步+1分
        if not isdead:
            scores+=1
            snake.move()
        for rect in snake.body:
            pygame.draw.rect(screen,(20,220,39),rect,0)
            
        # 显示死亡文字
        isdead = snake.isdead()
        if isdead:
            show_text(screen,(100,200),'YOU DEAD!',(227,29,18),False,100)
            show_text(screen,(150,260),'press space to try again...',(0,0,22),False,30)
            
        # 食物处理 / 吃到+50分
        # 当食物rect与蛇头重合,吃掉 -> Snake增加一个Node
        if food.rect == snake.body[0]:
            scores+=50
            food.remove()
            snake.addnode()
        
        # 食物投递
        food.set()
        pygame.draw.rect(screen,(136,0,21),food.rect,0)
        
        # 显示分数文字
        show_text(screen,(50,500),'Scores: '+str(scores),(223,223,223))
        
        pygame.display.update()
        clock.tick(10)
    
    
if __name__ == '__main__':
    main()


3.实验过程中遇到的问题和解决过程

在实验过程中,我也遇到了许多问题:

  1. 编写的程序运行不了,显示找不到所需要的文件

  2. 贪吃蛇的运动方向有时候和控制的方向不一样

我和同学在这个问题上讨论很久,并查找了相关资料,知识,最终找到了以下解决方法

  1. 编写的程序运行不了是缺少了pygame,在下载,更新pygame后,程序得以运行

  2. 贪吃蛇运动方向不一致是因为:第一次编写程序时,未设置“左右、上下不能被逆向改变”,因为如果是单纯的“左右控制方向”,那么当蛇头面对的方向变化,蛇自己的左右方向就会随之变化,导致蛇的移动与我们的预期不同。在了解问题成因之后,我添设了一个限制:即“改变方向,但左右、上下不能被逆向改变”,蛇的运动恢复正常

4.实验4的感想与体会

在此次实验过程中,我体会到了python编程的乐趣与强大功能。当然,没有一帆风顺的事情:在此次程序编写中,我遇到了很多困难,也学习到了很多新知识。看到游戏正常运行后,我体验到了很强的成就感,对python的喜爱之情油然而生。后续我将继续深入学习,学有余力的情况下尝试开发其他趣味小游戏,深入学习python的相关功能。

5.全课总结
非常感谢王志强老师一个学期的倾情教导,细心地教授,不厌其烦地一次又一次解答同学们在学习中遇到的问题。尤其是结课时,送给我们的临别赠语,充满了对教学事业的热爱以及对同学们倾注的热情。作为一名文科生,我对Python由最初的陌生与好奇变成了熟悉与喜爱,在学习这门课程前,我无法想象自己可以独立制作一个游戏或者进行爬虫,进步之大令人震惊。这门课不仅仅提高了我的动手操作能力,更是培养了我勇于探索、勤于动手、善于思考的精神。

体会:在报名选修课时,由于选择太多,我的备选课程迟迟未敲定,但是唯一确定的一门选修课便是python程序设计,虽然这门编程语言没有纳入必修课中,但我认为python对专业后期的学习有很大帮助,它在游戏开发、网站制作等方面比其他编程语言更为强大,也更多被使用。
这学期刚开始的几节课是学习基本语法,我听得十分投入认真,害怕基础打得不牢而跟不上后续学习进度,所以我都有认真记笔记与阅读相关教材。但后来学习socket编程技术后,我渐渐开始感到吃力,于是我在下课后经常去找老师答疑解惑,老师讲得很好,循循善诱,给我很大的启发,同时我还花更多的课下时间学习相关知识。虽然牺牲了很多课余时间,但是我确实学到了很多。包括课程最后的大作业实践,能让我在亲身实践过程中体验python编程的趣味。本课程还有一点优势,让我收获很大,便是平时的英语打卡,这一点很创新,并且很有效果,将编程语言与英语同步学习,事半功倍。

意见和建议:志强老师的课真的非常有趣,虽然后期的python学习我比较吃力,但是上课时并不会让我觉得枯燥乏味,非常感谢志强老师的付出!感觉课程后期稍微进度稍微有些快,对于编程与理解能力较差的同学来说相对吃力;同时希望该课程能够出一套自编教材讲义,供同学们学习使用,统一购买的教材太笨重,使用率低,可以根据课程具体情况适当简化、总结等等。

最后,再次感谢王志强老师。在未来的日子里我会继续学习Python知识,始终保持对未知世界的探索热情,希望有机会可以再参与王老师的课堂。

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

93

社区成员

发帖
与我相关
我的任务
社区描述
Python程序设计作业
软件构建 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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