文章目录
前言基本设置绘制屏幕蛇类食物类初始状态生成食物响应键鼠更新屏幕移动进食游戏入口snake.pyfood.pyfunction.pymain.py凉梦空间前言
贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,既简单又耐玩,唯一的目标就是做这条gai上最长(pang)的蛇(zhu)!
玩贪吃蛇最考验的就是走位(简称蛇皮走位),各种漂移过人,唉,就是玩儿!
基本设置
# 基本设置lattice_wh = 20snake_color = (84, 255, 159)snake_head_color = (123, 104, 238)food_color = (255, 64, 64)
绘制屏幕
# 绘制屏幕pygame.init()screen = pygame.display.set_mode((25*lattice_wh, 25*lattice_wh))pygame.display.set_caption("贪吃蛇")# 帧率,每秒刷新屏幕次数FPS = 10# 帧率变化系数level = 1.5# 时间对象FPSCLOCK = pygame.time.Clock()# 游戏结束标志game_over = 0# 前进方向direction = 0# 进食数量num = 0
蛇类
# 蛇class Snake():def __init__(self, snake_color, snake_head_color, x, y, lattice_wh):self.color = snake_colorself.head_color = snake_head_color# 左上顶点坐标self.pos = (x, y)self.lattice_wh = lattice_wh# 绘制蛇体self.rect = pygame.rect.Rect(x, y, self.lattice_wh, self.lattice_wh)# 左上顶点坐标变化self.pos_change = {# 上移1:(0, -self.lattice_wh),# 下移2:(0, self.lattice_wh),# 左移3:(-self.lattice_wh, 0),# 右移4:(self.lattice_wh, 0)}def move(self, direction):self.rect.x += self.pos_change[direction][0]self.rect.y += self.pos_change[direction][1]def forecast(self, direction):return (self.rect.x+self.pos_change[direction][0], self.rect.y+self.pos_change[direction][1])
食物类
# 食物class Food():def __init__(self, food_color, screen, lattice_wh, x, y):self.screen = screenself.color = food_colorself.lattice_wh = lattice_wh# 半径self.radius = lattice_wh/2self.x, self.y = x, ydef draw(self):# 圆心pos = (self.x+self.lattice_wh/2, self.y+self.lattice_wh/2)# 绘制食物pygame.draw.circle(self.screen, self.color, pos, self.radius, int(self.radius))
初始状态
# 贪吃蛇snakes = list()snakes.append(Snake(snake_color, snake_head_color, lattice_wh, 24*lattice_wh, lattice_wh))snakes.append(Snake(snake_color, snake_head_color, 0, 24*lattice_wh, lattice_wh))# 食物food = create_food(food_color, screen, lattice_wh, snakes)# 游戏状态game_stats = [game_over, direction, num, food]
生成食物
# 生成食物def create_food(food_color, screen, lattice_wh, snakes):# 食物是否生成成功create_success = 0# 食物位置坐标food_x, food_y = 0, 0while not create_success:food_x, food_y = randint(0, 24), randint(0, 24)food_x *= lattice_whfood_y *= lattice_wh# 检查食物位置是否与贪吃蛇位置重合for snake in snakes:if (food_x, food_y) != (snake.rect.x, snake.rect.y):create_success = 1break# 在指定位置生成食物food = Food(food_color, screen, lattice_wh, food_x, food_y)return food
响应键鼠
# 响应键鼠def check_events(game_stats):for event in pygame.event.get():# 退出游戏if event.type == pygame.QUIT:pygame.quit()sys.exit()# 控制移动方向,注意不能直接反向移动elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP and game_stats[1] != 2:game_stats[1] = 1elif event.key == pygame.K_DOWN and game_stats[1] != 1:game_stats[1] = 2elif event.key == pygame.K_LEFT and game_stats[1] != 4:game_stats[1] = 3elif event.key == pygame.K_RIGHT and game_stats[1] != 3:game_stats[1] = 4else:game_stats[1] = game_stats[1]
更新屏幕
# 更新屏幕def update(screen, lattice_wh, snakes, game_stats):screen.fill((255, 255, 255))# 绘制蛇头pygame.draw.rect(screen, snakes[0].head_color, snakes[0].rect)# 绘制蛇身for i in range(1, len(snakes)):pygame.draw.rect(screen, snakes[i].color, snakes[i].rect)# 绘制横线for i in range(25):pygame.draw.line(screen, (105, 105, 105), (0, lattice_wh*i), (500, lattice_wh*i))# 绘制竖线for i in range(25):pygame.draw.line(screen, (105, 105, 105), (lattice_wh*i, 0), (lattice_wh*i, 500))# 绘制食物game_stats[3].draw()# 更新屏幕pygame.display.flip()
移动进食
# 移动进食def going(screen, game_stats, snakes, snake_head_color, snake_color, food_color, lattice_wh):if not game_stats[1]:return# 蛇头下一前进位置(x, y) = snakes[0].forecast(game_stats[1])# 检查是否触碰边界if x == -lattice_wh or x == 25*lattice_wh or y == -lattice_wh or y == 25*lattice_wh:game_stats[0] = 1return# 检查是否触碰食物if (x, y) == (game_stats[3].x, game_stats[3].y):# 更新蛇头new_head = Snake(snake_color, snake_head_color, x, y, lattice_wh)snakes.insert(0, new_head)# 更新分数game_stats[2] += 1# 重新生成食物game_stats[3] = create_food(food_color, screen, lattice_wh, snakes)return# 检查是否触碰蛇身for snake in snakes:if (x, y) == (snake.rect.x, snake.rect.y):game_stats[0] = 1return# 更新所有蛇身位置for i in range(len(snakes)-1, 0, -1):snakes[i].rect.x = snakes[i-1].rect.xsnakes[i].rect.y = snakes[i-1].rect.y# 更新蛇头位置snakes[0].move(game_stats[1])
游戏入口
# 游戏入口while not game_stats[0]:update(screen, lattice_wh, snakes, game_stats)check_events(game_stats)going(screen, game_stats, snakes, snake_head_color, snake_color, food_color, lattice_wh)FPSCLOCK.tick(FPS * level ** num if FPS * level ** num < 60 else 60)
snake.py
import pygame# 蛇class Snake():def __init__(self, snake_color, snake_head_color, x, y, lattice_wh):self.color = snake_colorself.head_color = snake_head_color# 左上顶点坐标self.pos = (x, y)self.lattice_wh = lattice_wh# 绘制蛇体self.rect = pygame.rect.Rect(x, y, self.lattice_wh, self.lattice_wh)# 左上顶点坐标变化self.pos_change = {# 上移1:(0, -self.lattice_wh),# 下移2:(0, self.lattice_wh),# 左移3:(-self.lattice_wh, 0),# 右移4:(self.lattice_wh, 0)}# 移动def move(self, direction):self.rect.x += self.pos_change[direction][0]self.rect.y += self.pos_change[direction][1]# 下一前进位置def forecast(self, direction):return (self.rect.x+self.pos_change[direction][0], self.rect.y+self.pos_change[direction][1])
food.py
import pygame# 食物class Food():def __init__(self, food_color, screen, lattice_wh, x, y):self.screen = screenself.color = food_colorself.lattice_wh = lattice_wh# 半径self.radius = lattice_wh/2self.x, self.y = x, ydef draw(self):# 圆心pos = (self.x+self.lattice_wh/2, self.y+self.lattice_wh/2)# 绘制食物pygame.draw.circle(self.screen, self.color, pos, self.radius, int(self.radius))
function.py
import pygameimport sysfrom random import randintfrom food import Foodfrom snake import Snake# 生成食物def create_food(food_color, screen, lattice_wh, snakes):# 食物是否生成成功create_success = 0# 食物位置坐标food_x, food_y = 0, 0while not create_success:food_x, food_y = randint(0, 24), randint(0, 24)food_x *= lattice_whfood_y *= lattice_wh# 检查食物位置是否与贪吃蛇位置重合for snake in snakes:if (food_x, food_y) != (snake.rect.x, snake.rect.y):create_success = 1break# 在指定位置生成食物food = Food(food_color, screen, lattice_wh, food_x, food_y)return food# 响应事件def check_events(game_stats):for event in pygame.event.get():# 退出游戏if event.type == pygame.QUIT:pygame.quit()sys.exit()# 控制移动方向,注意不能直接反向移动elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP and game_stats[1] != 2:game_stats[1] = 1elif event.key == pygame.K_DOWN and game_stats[1] != 1:game_stats[1] = 2elif event.key == pygame.K_LEFT and game_stats[1] != 4:game_stats[1] = 3elif event.key == pygame.K_RIGHT and game_stats[1] != 3:game_stats[1] = 4else:game_stats[1] = game_stats[1]# 更新屏幕def update(screen, lattice_wh, snakes, game_stats):screen.fill((255, 255, 255))# 绘制蛇头pygame.draw.rect(screen, snakes[0].head_color, snakes[0].rect)# 绘制蛇身for i in range(1, len(snakes)):pygame.draw.rect(screen, snakes[i].color, snakes[i].rect)# 绘制横线for i in range(25):pygame.draw.line(screen, (105, 105, 105), (0, lattice_wh*i), (500, lattice_wh*i))# 绘制竖线for i in range(25):pygame.draw.line(screen, (105, 105, 105), (lattice_wh*i, 0), (lattice_wh*i, 500))# 绘制食物game_stats[3].draw()# 更新屏幕pygame.display.flip()# 移动进食def going(screen, game_stats, snakes, snake_head_color, snake_color, food_color, lattice_wh):if not game_stats[1]:return# 蛇头下一前进位置(x, y) = snakes[0].forecast(game_stats[1])# 检查是否触碰边界if x == -lattice_wh or x == 25*lattice_wh or y == -lattice_wh or y == 25*lattice_wh:game_stats[0] = 1return# 检查是否触碰食物if (x, y) == (game_stats[3].x, game_stats[3].y):# 更新蛇头new_head = Snake(snake_color, snake_head_color, x, y, lattice_wh)snakes.insert(0, new_head)# 更新分数game_stats[2] += 1# 重新生成食物game_stats[3] = create_food(food_color, screen, lattice_wh, snakes)return# 检查是否触碰蛇身for snake in snakes:if (x, y) == (snake.rect.x, snake.rect.y):game_stats[0] = 1return# 更新所有蛇身位置for i in range(len(snakes)-1, 0, -1):snakes[i].rect.x = snakes[i-1].rect.xsnakes[i].rect.y = snakes[i-1].rect.y# 更新蛇头位置snakes[0].move(game_stats[1])
main.py
import pygamefrom function import *from snake import Snake# 基本设置lattice_wh = 20snake_color = (84, 255, 159)snake_head_color = (123, 104, 238)food_color = (255, 64, 64)# 绘制屏幕pygame.init()screen = pygame.display.set_mode((25*lattice_wh, 25*lattice_wh))pygame.display.set_caption("贪吃蛇")# 帧率,每秒刷新屏幕次数FPS = 10# 帧率变化系数level = 1.5# 时间对象FPSCLOCK = pygame.time.Clock()# 游戏结束标志game_over = 0# 前进方向direction = 0# 进食数量num = 0# 贪吃蛇snakes = list()snakes.append(Snake(snake_color, snake_head_color, lattice_wh, 24*lattice_wh, lattice_wh))snakes.append(Snake(snake_color, snake_head_color, 0, 24*lattice_wh, lattice_wh))# 食物food = create_food(food_color, screen, lattice_wh, snakes)# 游戏状态game_stats = [game_over, direction, num, food]# 游戏入口while not game_stats[0]:update(screen, lattice_wh, snakes, game_stats)check_events(game_stats)going(screen, game_stats, snakes, snake_head_color, snake_color, food_color, lattice_wh)FPSCLOCK.tick(FPS * level ** num if FPS * level ** num < 60 else 60)
敲黑板!!!在控制蛇的移动方向时,易忽略蛇不能直接反向移动这一问题;另外,在生成食物时,要检查食物的位置与蛇的位置是否重合,如果两者位置重合,此时需要生成新的食物。
python小游戏——井字棋:/KissMoon_/article/details/117437893
凉梦空间
欢迎你进入我的个人博客网站参观交流:https://www.liangmeng.xyz
如果觉得《pygame小游戏——贪吃蛇》对你有帮助,请点赞、收藏,并留下你的观点哦!