实验四《Python程序设计》实验报告

 

实验四

课程:《Python程序设计》
班级: 2031
姓名: 尹宗颐
学号: 20203121
实验教师:王志强
必修/选修: 公选课


#1.实验内容

  • Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
    我做的是游戏普普通通的 贪吃蛇

## 2. 实验过程及结果

1.

 此前已经安装过一遍,忘记截图,此时显示已经安装过

 

 

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_ci

 

 2.

  导入函数,检测版本,确定导入成功

 

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_Python贪吃蛇游戏程序设计开题报告_02

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_ci_03

 

 3.

  进行初始化设置

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_python_04

 

 

 4.

开始游戏,编写标题,得分,设置背景颜色和网格,设置帧率fps并利用fps控制蛇的移速,然后随机位置刷新食物

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_ide_05

 

利用collidepoint进行碰撞检测,模拟出吃掉食物的效果,并增加分数和蛇的速度

 

 

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_python_06

 

 

设置蛇的移动方向

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_Python贪吃蛇游戏程序设计开题报告_07

 

 

 

从键盘获取输入,控制蛇进行移动,并且限制不能向后移动,防止因此直接死亡

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_python_08

 

 

 

5.

失败条件判定:撞到自己

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_ide_09

 

 

 

6.

失败后显示结算界面,但出现问题,结算界面未显示便直接结束程序,尚未解决

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_python_10

 码云:  https://gitee.com/besti2021python/yzy20203121/blob/master/game.py

 

 

 代码:

import pygame
import random
import copy



#初始方向
move_up = False
move_down = False
move_left = False
move_right = True



#初始化
pygame.init()
clock = pygame.time.Clock() #设置游戏时钟
screen = pygame.display.set_mode((800, 600)) #窗口大小
snake_list =[[10, 10]]#蛇的初始位置
food_point = [random.randint(10, 490),random.randint(10, 490)]#食物位置

#字体设置
font1 = pygame.font.SysFont('宋体', 16, True)
font_list = pygame.font.get_fonts()
game_font = pygame.font.SysFont('宋体', 16, True)
game_font1 = pygame.font.SysFont('宋体', 36, True)

#参数设置
num = -1
score = 0
a=10
b=0
c=move_left

#开始游戏
run = True
while run:
    pygame.display.update()
    pygame.display.set_caption("贪吃蛇  当前得分:%d   " % score  ) #编写标题与得分
    clock.tick(a)#设置游戏fps,并利用fps控制蛇的速度
    screen.fill([255, 255, 255])#
#绘制背景网格
    for x in range(0,801,10):
        pygame.draw.line(screen,(195,197,199),(x,0),(x,800),1)
        pygame.draw.line(screen, (195, 197, 199), (0, x), (800, x), 1)
    if b ==0:
        food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10, 0)#显示食物
    if b ==1:
        food_rect = pygame.draw.circle(screen,[0,255,255],food_point,20,0)#显示食物

    snake_rect = []
    for pos in snake_list:

        snake_rect.append(pygame.draw.circle(screen,[255,0,0],pos,5,0))

#吃掉食物
        if food_rect.collidepoint(pos):
            snake_list.append(food_point)
            if num % 5 ==4 :
                food_point = [random.randint(10, 790), random.randint(10, 590)]# 重新生成食物位置
                food_rect = pygame.draw.circle(screen, [0  , 255, 255], food_point, 20, 0)# 显示食物
                score += 1
                num += 1
                a += 2
                b = 1
                break
            if num % 5 == 0:
                score += 5
                food_point = [random.randint(10,790),random.randint(10,590)]# 重新生成食物位置
                food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10,0)  # 显示食物
                num +=1
                a += 2
                b = 0
                break
            else:
                food_point = [random.randint(10, 790), random.randint(10, 590)]# 重新生食物位置
                food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10, 0)# 显示食物
                score += 1
                num +=1
                a += 2
                b = 0
                break
# 移动
    pos = len(snake_list) - 1
    while pos > 0:
        snake_list[pos] = copy.deepcopy(snake_list[pos - 1])
        pos -= 1
    if move_right:
        snake_list[pos][0] += 10
        if snake_list[pos][0] > 800:
            snake_list[pos][0] = 0
    if move_left:
        snake_list[pos][0] -= 10
        if snake_list[pos][0] < 0:
            snake_list[pos][0] = 800
    if move_up:
        snake_list[pos][1] -= 10
        if snake_list[pos][1] < 0:
            snake_list[pos][1] = 600
    if move_down:
        snake_list[pos][1] += 10
        if snake_list[pos][1] > 600:
            snake_list[pos][1] = 0


#位置移动
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and event.key!=c:
                move_up = True
                move_down = False
                move_left = False
                move_right = False
                print('上')
                c = pygame.K_DOWN
            if event.key == pygame.K_RIGHT and event.key!=c:
                move_up = False
                move_down = False
                move_left = False
                move_right = True
                print('右')
                c = pygame.K_LEFT
            if event.key == pygame.K_LEFT and event.key!=c:
                move_up = False
                move_down = False
                move_left = True
                move_right = False
                print('左')
                c = pygame.K_RIGHT
            if event.key == pygame.K_DOWN and event.key!=c:
                move_up = False
                move_down = True
                move_left = False
                move_right = False
                print('下')
                c = pygame.K_UP

        # 如果吃掉自己
    head_rect = snake_rect[0]
    count = len(snake_rect)
    while count > 1:
        if head_rect.colliderect(snake_rect[count - 1]):
            run = False
        count -= 1
while run == -1:
    screen.fill([0,0,0])
    screen.blit(game_font1.render(u'Game Over' % score, True, [255, 255, 255]), [200, 200])
    screen.blit(game_font1.render(u'您的得分:%d' % score, True, [255, 255, 255]), [400, 400])  #显示结算界面
#结算界面暂时出现问题,尚未解决
    pygame.display.update()#刷新显示内容


#结束·

 


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

-问题1:用pip安装python失败,显示pip不是内部和外部指令

- 问题1解决方案:在python/script/中找到pip,修改指令的路径

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_ci_11

 

 

- 问题2:蛇每次碰到食物就会报错
- 问题2解决方案:每次碰到食物后刷新食物位置,蛇长度+1

-问题3:无法显示结算界面
-问题3解决方案:询问同学,暂未解决

 


## 其他(感悟、思考等)

       一学期的python课程已经结束,我对python也有了大概的认识,但这只是一些皮毛,需要学习的知识还有很多。python的学习只能说是 “ 师傅领进门,修行靠个人。” 自学是非常重要的,但重要的还是要感

谢老师的引领。

       回顾这学期学到的知识,元组,集合,列表,字典,封装,继承,多态,爬虫等等,不同于c语言,python真的很神奇,它非常灵活而简洁,如果能够学好python,对于以后的生活与工作一定有很大的帮助。

       这次实验中,我第一次用编程的方式做出了一个游戏,虽然只是贪吃蛇这种小游戏,而且参考了许多资料,但我也学到了很多新的东西,如何使用pygame,collide函数,创建窗口,绘制图形,让图形动起

来等等,看见自己屏幕上的蛇动起来,逐渐变长,我内心的喜悦是无法描述的。虽然这次的程序还是有些瑕疵,但希望以后能够通过学习,做出更有意思的游戏或者其他小程序。

       最后,正如王老师第一节课讲的:“人生苦短,我用python”,希望python的学习能成为我人生记忆中精彩的一笔。

 

  • 云班课pygame相关内容



实验四

课程:《Python程序设计》
班级: 2031
姓名: 尹宗颐
学号: 20203121
实验教师:王志强
必修/选修: 公选课


#1.实验内容

  • Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
    我做的是游戏普普通通的 贪吃蛇

## 2. 实验过程及结果

1.

 此前已经安装过一遍,忘记截图,此时显示已经安装过

 

 

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_ci

 

 2.

  导入函数,检测版本,确定导入成功

 

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_Python贪吃蛇游戏程序设计开题报告_02

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_ci_03

 

 3.

  进行初始化设置

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_python_04

 

 

 4.

开始游戏,编写标题,得分,设置背景颜色和网格,设置帧率fps并利用fps控制蛇的移速,然后随机位置刷新食物

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_ide_05

 

利用collidepoint进行碰撞检测,模拟出吃掉食物的效果,并增加分数和蛇的速度

 

 

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_python_06

 

 

设置蛇的移动方向

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_Python贪吃蛇游戏程序设计开题报告_07

 

 

 

从键盘获取输入,控制蛇进行移动,并且限制不能向后移动,防止因此直接死亡

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_python_08

 

 

 

5.

失败条件判定:撞到自己

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_ide_09

 

 

 

6.

失败后显示结算界面,但出现问题,结算界面未显示便直接结束程序,尚未解决

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_python_10

 码云:  https://gitee.com/besti2021python/yzy20203121/blob/master/game.py

 

 

 代码:

import pygame
import random
import copy



#初始方向
move_up = False
move_down = False
move_left = False
move_right = True



#初始化
pygame.init()
clock = pygame.time.Clock() #设置游戏时钟
screen = pygame.display.set_mode((800, 600)) #窗口大小
snake_list =[[10, 10]]#蛇的初始位置
food_point = [random.randint(10, 490),random.randint(10, 490)]#食物位置

#字体设置
font1 = pygame.font.SysFont('宋体', 16, True)
font_list = pygame.font.get_fonts()
game_font = pygame.font.SysFont('宋体', 16, True)
game_font1 = pygame.font.SysFont('宋体', 36, True)

#参数设置
num = -1
score = 0
a=10
b=0
c=move_left

#开始游戏
run = True
while run:
    pygame.display.update()
    pygame.display.set_caption("贪吃蛇  当前得分:%d   " % score  ) #编写标题与得分
    clock.tick(a)#设置游戏fps,并利用fps控制蛇的速度
    screen.fill([255, 255, 255])#
#绘制背景网格
    for x in range(0,801,10):
        pygame.draw.line(screen,(195,197,199),(x,0),(x,800),1)
        pygame.draw.line(screen, (195, 197, 199), (0, x), (800, x), 1)
    if b ==0:
        food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10, 0)#显示食物
    if b ==1:
        food_rect = pygame.draw.circle(screen,[0,255,255],food_point,20,0)#显示食物

    snake_rect = []
    for pos in snake_list:

        snake_rect.append(pygame.draw.circle(screen,[255,0,0],pos,5,0))

#吃掉食物
        if food_rect.collidepoint(pos):
            snake_list.append(food_point)
            if num % 5 ==4 :
                food_point = [random.randint(10, 790), random.randint(10, 590)]# 重新生成食物位置
                food_rect = pygame.draw.circle(screen, [0  , 255, 255], food_point, 20, 0)# 显示食物
                score += 1
                num += 1
                a += 2
                b = 1
                break
            if num % 5 == 0:
                score += 5
                food_point = [random.randint(10,790),random.randint(10,590)]# 重新生成食物位置
                food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10,0)  # 显示食物
                num +=1
                a += 2
                b = 0
                break
            else:
                food_point = [random.randint(10, 790), random.randint(10, 590)]# 重新生食物位置
                food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10, 0)# 显示食物
                score += 1
                num +=1
                a += 2
                b = 0
                break
# 移动
    pos = len(snake_list) - 1
    while pos > 0:
        snake_list[pos] = copy.deepcopy(snake_list[pos - 1])
        pos -= 1
    if move_right:
        snake_list[pos][0] += 10
        if snake_list[pos][0] > 800:
            snake_list[pos][0] = 0
    if move_left:
        snake_list[pos][0] -= 10
        if snake_list[pos][0] < 0:
            snake_list[pos][0] = 800
    if move_up:
        snake_list[pos][1] -= 10
        if snake_list[pos][1] < 0:
            snake_list[pos][1] = 600
    if move_down:
        snake_list[pos][1] += 10
        if snake_list[pos][1] > 600:
            snake_list[pos][1] = 0


#位置移动
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and event.key!=c:
                move_up = True
                move_down = False
                move_left = False
                move_right = False
                print('上')
                c = pygame.K_DOWN
            if event.key == pygame.K_RIGHT and event.key!=c:
                move_up = False
                move_down = False
                move_left = False
                move_right = True
                print('右')
                c = pygame.K_LEFT
            if event.key == pygame.K_LEFT and event.key!=c:
                move_up = False
                move_down = False
                move_left = True
                move_right = False
                print('左')
                c = pygame.K_RIGHT
            if event.key == pygame.K_DOWN and event.key!=c:
                move_up = False
                move_down = True
                move_left = False
                move_right = False
                print('下')
                c = pygame.K_UP

        # 如果吃掉自己
    head_rect = snake_rect[0]
    count = len(snake_rect)
    while count > 1:
        if head_rect.colliderect(snake_rect[count - 1]):
            run = False
        count -= 1
while run == -1:
    screen.fill([0,0,0])
    screen.blit(game_font1.render(u'Game Over' % score, True, [255, 255, 255]), [200, 200])
    screen.blit(game_font1.render(u'您的得分:%d' % score, True, [255, 255, 255]), [400, 400])  #显示结算界面
#结算界面暂时出现问题,尚未解决
    pygame.display.update()#刷新显示内容


#结束·

 


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

-问题1:用pip安装python失败,显示pip不是内部和外部指令

- 问题1解决方案:在python/script/中找到pip,修改指令的路径

Python贪吃蛇游戏程序设计开题报告 python贪吃蛇课程设计报告_ci_11

 

 

- 问题2:蛇每次碰到食物就会报错
- 问题2解决方案:每次碰到食物后刷新食物位置,蛇长度+1

-问题3:无法显示结算界面
-问题3解决方案:询问同学,暂未解决

 


## 其他(感悟、思考等)

       一学期的python课程已经结束,我对python也有了大概的认识,但这只是一些皮毛,需要学习的知识还有很多。python的学习只能说是 “ 师傅领进门,修行靠个人。” 自学是非常重要的,但重要的还是要感

谢老师的引领。

       回顾这学期学到的知识,元组,集合,列表,字典,封装,继承,多态,爬虫等等,不同于c语言,python真的很神奇,它非常灵活而简洁,如果能够学好python,对于以后的生活与工作一定有很大的帮助。

       这次实验中,我第一次用编程的方式做出了一个游戏,虽然只是贪吃蛇这种小游戏,而且参考了许多资料,但我也学到了很多新的东西,如何使用pygame,collide函数,创建窗口,绘制图形,让图形动起

来等等,看见自己屏幕上的蛇动起来,逐渐变长,我内心的喜悦是无法描述的。虽然这次的程序还是有些瑕疵,但希望以后能够通过学习,做出更有意思的游戏或者其他小程序。

       最后,正如王老师第一节课讲的:“人生苦短,我用python”,希望python的学习能成为我人生记忆中精彩的一笔。

 

参考资料 

  • 云班课pygame相关内容