20232418 郭俊廷 2023-2024-2 《Python程序设计》实验四报告

20232418郭俊廷 2024-05-29 21:14:24

20232418 郭俊廷 2023-2024-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 2324班
姓名: 郭俊廷
学号: 20232418
实验教师:王志强
实验日期:2024年5月15日
必修/选修: 公选课

1.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
通过python编写贪吃蛇小游戏

2. 实验过程及结果

实验分析
贪吃蛇控制:让玩家能够简单易懂地控制贪吃蛇的移动。
食物生成:分析食物生成的位置是否合理,能否给玩家带来足够的挑战。
碰撞检测:评估碰撞检测算法的实现效果,确保贪吃蛇在撞到墙壁或自身时能够准确判断并作出相应处理。
得分:分析得分计算方式,确保玩家能够及时了解自己的游戏成绩和速度。

1.导入所需的库和模块,如random、sys、time、pygame等。

import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque

2.定义常量(屏幕宽度、高度、小方格大小、网格线宽度等)和定义蛇、食物、背景等的颜色

SCREEN_WIDTH = 600      # 屏幕宽度
SCREEN_HEIGHT = 480     # 屏幕高度
SIZE = 20               # 小方格大小
LINE_WIDTH = 1          # 网格线宽度

SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)
SCOPE_Y = (2, SCREEN_HEIGHT // SIZE - 1)

LIGHT = (100, 100, 100)
SNAKE = (200, 200, 200)      # 蛇
BLACK = (0, 0, 0)           # 网格线
RED = (200, 30, 30)         # 红色,GAME OVER 的字体
BGCOLOR = (40, 40, 60)      # 背景

3.定义文本函数print_text,用于显示得分和速度。

def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):
    imgText = font.render(text, True, fcolor)
    screen.blit(imgText, (x, y))

4.定义初始化蛇的函数init_snake,用于创建初始蛇身。

def init_snake():
    snake = deque()
    snake.append((2, SCOPE_Y[0]))
    snake.append((1, SCOPE_Y[0]))
    snake.append((0, SCOPE_Y[0]))
    return snake

5.定义食物函数create_food,用于随机生成一个食物。

def create_food(snake):
    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])
    return food_x, food_y

6.定义生成食物的函数get_food_style,用于随机生成食物的样式和颜色.

FOOD_STYLE_LIST = [(10, (255, 100, 100)), (20, (100, 255, 100)), (30, (100, 100, 255))]
def get_food_style():   #随机选择食物样式
    return FOOD_STYLE_LIST[random.randint(0, 2)]

7.主函数部分

1.初始化Pygame环境、设置窗口标题以及加载两种字体

def main():
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption('贪吃蛇')

    font1 = pygame.font.SysFont('SimHei', 24)  # 得分的字体
    font2 = pygame.font.Font(None, 72)  # GAME OVER 的字体
    fwidth, fheight = font2.size('GAME OVER')

2.初始化数据

    b = True
    snake = init_snake()
 
    food = create_food(snake)
    food_style = get_food_style()
    
    pos = (1, 0)

    game_over = True
    start = False       # 是否开始,当start = True,game_over = True 时,才显示 GAME OVER
    score = 0           # 得分
    orispeed = 0.5  # 初始速度
    speed = orispeed #目前速度
    last_move_time = None
    pause = False 

3.处理按键操作、绘制游戏界面、更新游戏状态。

    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
                        snake = init_snake()
                        food = create_food(snake)
                        food_style = get_food_style()
                        pos = (1, 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):
                    # 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVER
                    if b and not pos[1]:
                        pos = (0, -1)
                        b = False
                elif event.key in (K_s, K_DOWN):
                    if b and not pos[1]:
                        pos = (0, 1)
                        b = False
                elif event.key in (K_a, K_LEFT):
                    if b and not pos[0]:
                        pos = (-1, 0)
                        b = False
                elif event.key in (K_d, K_RIGHT):
                    if b and not pos[0]:
                        pos = (1, 0)
                        b = False

4.绘制游戏界面、更新游戏状态。

       screen.fill(BGCOLOR)
        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 not game_over:
            curTime = time.time()
            if curTime - last_move_time > speed:
                if not pause:
                    b = True
                    last_move_time = curTime
                    next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])
                    if next_s == food:
                        snake.appendleft(next_s)
                        score += food_style[0]
                        speed = orispeed - 0.03 * (score // 50)
                        food = create_food(snake)
                        food_style = get_food_style()
                    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, food_style[1], (food[0] * SIZE, food[1] * SIZE, SIZE, SIZE), 0)

        # 画蛇
        for s in snake:
            pygame.draw.rect(screen, SNAKE, (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//50}')
        print_text(screen, font1, 450, 7, f'得分: {score}')

        if game_over:
            if start:
                print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2, (SCREEN_HEIGHT - fheight) // 2, 'GAME OVER', RED)

        pygame.display.update()


if __name__ == '__main__':
    main()

演示视频(以方向键控制方向,以空格键停止游戏)

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

  • 问题1:蛇在快速向下又向左移动时会出现bug
  • 问题1解决方案:将这种情况单独用if处理
  • 问题2:不清楚怎么呈现多种颜色的区块
  • 问题2解决方案:在网络上查询到对应的像素数据
  • 问题3:如何监控键盘行为来进行操作
  • 问题3解决方案:在网络上查询到相应的资料

##实验的感想体会
在本次实践中,我在自己摸索、网络查询中终于完成了这个贪吃蛇小游戏。本来是想要在添加上一个管理员作弊的模式的,但是限于技术力不足,在中止程序同时修改速度与长度的时候遇到了瓶颈,无奈放弃。这个程序还是比较简陋,有着许多不足,但是通过这次实验我应用到了以往学会的许多知识,真正将以往的许多知识糅合在一起,做到了学以致用。

##课程感想体会
在这次Python实践中,我对于“实践出真知”有了更加深刻的了解。在自己做游戏的过程中,发现自己对于Python的许多知识还是不甚了解,Python还是有许多的知识等着我们去探索,去汲取,我们只是在这半年里推开了一扇新世界的大门,学到的只是皮毛。感谢王老师带领着我们去接触到了Python这一种编程语言。“人生苦短,我学Python"是我在结课后领悟到的最深刻的一课。即使课程已经到达了尾声,我依然要秉承着对知识孜孜以求的精神,继续钻研更高深的Python技术,让“苦短”的人生也能因为Python而变得多姿多彩。最后,感谢王老师一学期的陪伴,感谢老师让我对Python有了浓厚的兴趣,希望未来老师能够带领更多的同学学到Python,体会到“人生苦短,我学Python"的真谛。

##课程建议
希望课程时间延长,能够了解到更多深层次的python知识

参考资料

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

110

社区成员

发帖
与我相关
我的任务
社区描述
人生苦短,我用Python!
python3.11 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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