创作灵感
小时候也就是大概十几年前的时候,智能触屏手机还未大量普及,移动网络还是2G,大部分人用的都是小灵通,里面只有几款经典的游戏,比如俄罗斯方块,贪吃蛇等。还记得以前自己玩的不亦乐乎。如今网络发展迅速,通讯设备越来越智能化,集成化,这些上世纪的经典游戏似乎早已淡忘人们的视野。也许是小时候对这些经典游戏的热爱,今天在此用python语言编写一个贪吃蛇小游戏。同时创建一个简单的Python小游戏是一个很好的学习项目,对于python语法的学习以及常见的函数认识很有帮助,下面是一个经典的“贪吃蛇”游戏的示例,使用pygame
库来实现。
详细步骤
安装Pygame
首先,你需要安装pygame
库。如果你还没有安装,可以使用以下命令:
pip install pygame
导入模块
导入模块的代码
import pygame
import time
import random
初始化pygame
pygame.init()
定义屏幕大小
window_x = 720
window_y = 480
定义颜色
black = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
red = pygame.Color(255, 0, 0)
green = pygame.Color(0, 255, 0)
blue = pygame.Color(0, 0, 255)
初始化游戏窗口
pygame.display.set_caption('贪吃蛇游戏')
game_window = pygame.display.set_mode((window_x, window_y))
控制帧率
fps = pygame.time.Clock()
定义贪吃蛇的默认位置
snake_position = [100, 50]
snake_body = [[100, 50], [90, 50], [80, 50]]
食物的位置
food_position = [random.randrange(1, (window_x//10)) * 10,
random.randrange(1, (window_y//10)) * 10]
food_spawn = True
设置默认方向
direction = 'RIGHT'
change_to = direction
初始得分
score = 0
显示分数函数
def show_score(choice, color, font, size):
score_font = pygame.font.SysFont(font, size)
score_surface = score_font.render('Score : ' + str(score), True, color)
score_rect = score_surface.get_rect()
if choice == 1:
score_rect.midtop = (window_x / 10, 15)
else:
score_rect.midtop = (window_x / 2, window_y / 1.25)
game_window.blit(score_surface, score_rect)
游戏结束函数
def game_over():
my_font = pygame.font.SysFont('times new roman', 50)
game_over_surface = my_font.render(
'Your Score is : ' + str(score), True, red)
game_over_rect = game_over_surface.get_rect()
game_over_rect.midtop = (window_x / 2, window_y / 4)
game_window.blit(game_over_surface, game_over_rect)
pygame.display.flip()
time.sleep(2)
pygame.quit()
quit()
主函数
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
if direction != 'DOWN':
change_to = 'UP'
elif event.key == pygame.K_DOWN:
if direction != 'UP':
change_to = 'DOWN'
elif event.key == pygame.K_LEFT:
if direction != 'RIGHT':
change_to = 'LEFT'
elif event.key == pygame.K_RIGHT:
if direction != 'LEFT':
change_to = 'RIGHT'
如果方向改变,更新方向
direction = change_to
根据方向更新贪吃蛇的头部位置
if direction == 'UP':
snake_position[1] -= 10
if direction == 'DOWN':
snake_position[1] += 10
if direction == 'LEFT':
snake_position[0] -= 10
if direction == 'RIGHT':
snake_position[0] += 10
贪吃蛇的头部移动到新的位置
snake_body.insert(0, list(snake_position))
if snake_position[0] == food_position[0] and snake_position[1] == food_position[1]:
score += 10
food_spawn = False
else:
snake_body.pop()
生成新的食物
if not food_spawn:
food_position = [random.randrange(1, (window_x//10)) * 10,
random.randrange(1, (window_y//10)) * 10]
food_spawn = True
更新游戏窗口
game_window.fill(black)
for pos in snake_body:
pygame.draw.rect(game_window, green, pygame.Rect(
pos[0], pos[1], 10, 10))
pygame.draw.rect(game_window, white, pygame.Rect(
food_position[0], food_position[1], 10, 10))
检查是否撞到边界或自己
if snake_position[0] < 0 or snake_position[0] > window_x-10 or snake_position[1] < 0 or snake_position[1] > window_y-10:
game_over()
for block in snake_body[1:]:
if snake_position[0] == block[0] and snake_position[1] == block[1]:
game_over()
显示分数
show_score(1, white, 'times new roman', 20)
刷新游戏屏幕
pygame.display.update()
控制帧率
fps.tick(25)
代码解释
-
导入必要的库:
pygame
:用于游戏开发。time
和random
:用于时间控制和随机生成食物位置。
-
初始化游戏:
- 初始化pygame,定义屏幕大小和颜色,设置游戏窗口标题。
-
定义贪吃蛇和食物的初始位置:
snake_position
和snake_body
定义贪吃蛇的位置和身体。food_position
定义食物的位置,并设置食物是否需要重新生成。
-
设置方向和分数:
- 初始方向设置为右,初始得分为0。
-
显示分数函数:
- 使用
pygame.font.SysFont
显示分数。
- 使用
-
游戏结束函数:
- 显示游戏结束时的分数,并退出游戏。
-
主循环:
- 处理事件(方向键控制贪吃蛇移动方向)。
- 更新贪吃蛇位置,检查是否吃到食物,更新食物位置。
- 检查是否撞到边界或自己,结束游戏。
- 更新游戏窗口,显示分数,并控制帧率。
这个示例展示了如何使用pygame
构建一个简单的贪吃蛇游戏。你可以在此基础上进行扩展,通过改变某些函数的参数来满足自己对于游戏的特征修改,或者扩展某些模块,例如添加更复杂的关卡、计时功能等。
附录(完整代码)
import pygame
import time
import random
# 初始化pygame
pygame.init()
# 定义屏幕大小
window_x = 720
window_y = 480
# 定义颜色
black = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
red = pygame.Color(255, 0, 0)
green = pygame.Color(0, 255, 0)
blue = pygame.Color(0, 0, 255)
# 初始化游戏窗口
pygame.display.set_caption('贪吃蛇游戏')
game_window = pygame.display.set_mode((window_x, window_y))
# 控制帧率
fps = pygame.time.Clock()
# 定义贪吃蛇的默认位置
snake_position = [100, 50]
snake_body = [[100, 50], [90, 50], [80, 50]]
# 食物的位置
food_position = [random.randrange(1, (window_x//10)) * 10,
random.randrange(1, (window_y//10)) * 10]
food_spawn = True
# 设置默认方向
direction = 'RIGHT'
change_to = direction
# 初始得分
score = 0
# 显示分数函数
def show_score(choice, color, font, size):
score_font = pygame.font.SysFont(font, size)
score_surface = score_font.render('Score : ' + str(score), True, color)
score_rect = score_surface.get_rect()
if choice == 1:
score_rect.midtop = (window_x / 10, 15)
else:
score_rect.midtop = (window_x / 2, window_y / 1.25)
game_window.blit(score_surface, score_rect)
# 游戏结束函数
def game_over():
my_font = pygame.font.SysFont('times new roman', 50)
game_over_surface = my_font.render(
'Your Score is : ' + str(score), True, red)
game_over_rect = game_over_surface.get_rect()
game_over_rect.midtop = (window_x / 2, window_y / 4)
game_window.blit(game_over_surface, game_over_rect)
pygame.display.flip()
time.sleep(2)
pygame.quit()
quit()
# 主函数
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
if direction != 'DOWN':
change_to = 'UP'
elif event.key == pygame.K_DOWN:
if direction != 'UP':
change_to = 'DOWN'
elif event.key == pygame.K_LEFT:
if direction != 'RIGHT':
change_to = 'LEFT'
elif event.key == pygame.K_RIGHT:
if direction != 'LEFT':
change_to = 'RIGHT'
# 如果方向改变,更新方向
direction = change_to
# 根据方向更新贪吃蛇的头部位置
if direction == 'UP':
snake_position[1] -= 10
if direction == 'DOWN':
snake_position[1] += 10
if direction == 'LEFT':
snake_position[0] -= 10
if direction == 'RIGHT':
snake_position[0] += 10
# 贪吃蛇的头部移动到新的位置
snake_body.insert(0, list(snake_position))
if snake_position[0] == food_position[0] and snake_position[1] == food_position[1]:
score += 10
food_spawn = False
else:
snake_body.pop()
# 生成新的食物
if not food_spawn:
food_position = [random.randrange(1, (window_x//10)) * 10,
random.randrange(1, (window_y//10)) * 10]
food_spawn = True
# 更新游戏窗口
game_window.fill(black)
for pos in snake_body:
pygame.draw.rect(game_window, green, pygame.Rect(
pos[0], pos[1], 10, 10))
pygame.draw.rect(game_window, white, pygame.Rect(
food_position[0], food_position[1], 10, 10))
# 检查是否撞到边界或自己
if snake_position[0] < 0 or snake_position[0] > window_x-10 or snake_position[1] < 0 or snake_position[1] > window_y-10:
game_over()
for block in snake_body[1:]:
if snake_position[0] == block[0] and snake_position[1] == block[1]:
game_over()
# 显示分数
show_score(1, white, 'times new roman', 20)
# 刷新游戏屏幕
pygame.display.update()
# 控制帧率
fps.tick(25)
标签:10,score,python,window,小游戏,pygame,position,100,snake
From: https://blog.csdn.net/2401_83155259/article/details/140154373