110
社区成员
发帖
与我相关
我的任务
分享课程:《Python程序设计》
班级: 2324班
姓名: 郭俊廷
学号: 20232418
实验教师:王志强
实验日期:2024年5月15日
必修/选修: 公选课
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
通过python编写贪吃蛇小游戏
实验分析
贪吃蛇控制:让玩家能够简单易懂地控制贪吃蛇的移动。
食物生成:分析食物生成的位置是否合理,能否给玩家带来足够的挑战。
碰撞检测:评估碰撞检测算法的实现效果,确保贪吃蛇在撞到墙壁或自身时能够准确判断并作出相应处理。
得分:分析得分计算方式,确保玩家能够及时了解自己的游戏成绩和速度。
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()
##实验的感想体会
在本次实践中,我在自己摸索、网络查询中终于完成了这个贪吃蛇小游戏。本来是想要在添加上一个管理员作弊的模式的,但是限于技术力不足,在中止程序同时修改速度与长度的时候遇到了瓶颈,无奈放弃。这个程序还是比较简陋,有着许多不足,但是通过这次实验我应用到了以往学会的许多知识,真正将以往的许多知识糅合在一起,做到了学以致用。
##课程感想体会
在这次Python实践中,我对于“实践出真知”有了更加深刻的了解。在自己做游戏的过程中,发现自己对于Python的许多知识还是不甚了解,Python还是有许多的知识等着我们去探索,去汲取,我们只是在这半年里推开了一扇新世界的大门,学到的只是皮毛。感谢王老师带领着我们去接触到了Python这一种编程语言。“人生苦短,我学Python"是我在结课后领悟到的最深刻的一课。即使课程已经到达了尾声,我依然要秉承着对知识孜孜以求的精神,继续钻研更高深的Python技术,让“苦短”的人生也能因为Python而变得多姿多彩。最后,感谢王老师一学期的陪伴,感谢老师让我对Python有了浓厚的兴趣,希望未来老师能够带领更多的同学学到Python,体会到“人生苦短,我学Python"的真谛。
##课程建议
希望课程时间延长,能够了解到更多深层次的python知识