赞
踩
贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,既简单又耐玩,唯一的目标就是做这条gai上最长(pang)的蛇(zhu)!
玩贪吃蛇最考验的就是走位(简称蛇皮走位),各种漂移过人,唉,就是玩儿!
# 基本设置
lattice_wh = 20
snake_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_color self.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 = screen
self.color = food_color
self.lattice_wh = lattice_wh
# 半径
self.radius = lattice_wh/2
self.x, self.y = x, y
def 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, 0 while not create_success: food_x, food_y = randint(0, 24), randint(0, 24) food_x *= lattice_wh food_y *= lattice_wh # 检查食物位置是否与贪吃蛇位置重合 for snake in snakes: if (food_x, food_y) != (snake.rect.x, snake.rect.y): create_success = 1 break # 在指定位置生成食物 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] = 1 elif event.key == pygame.K_DOWN and game_stats[1] != 1: game_stats[1] = 2 elif event.key == pygame.K_LEFT and game_stats[1] != 4: game_stats[1] = 3 elif event.key == pygame.K_RIGHT and game_stats[1] != 3: game_stats[1] = 4 else: 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] = 1 return # 检查是否触碰食物 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] = 1 return # 更新所有蛇身位置 for i in range(len(snakes)-1, 0, -1): snakes[i].rect.x = snakes[i-1].rect.x snakes[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)
import pygame # 蛇 class Snake(): def __init__(self, snake_color, snake_head_color, x, y, lattice_wh): self.color = snake_color self.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])
import pygame # 食物 class Food(): def __init__(self, food_color, screen, lattice_wh, x, y): self.screen = screen self.color = food_color self.lattice_wh = lattice_wh # 半径 self.radius = lattice_wh/2 self.x, self.y = x, y def 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))
import pygame import sys from random import randint from food import Food from snake import Snake # 生成食物 def create_food(food_color, screen, lattice_wh, snakes): # 食物是否生成成功 create_success = 0 # 食物位置坐标 food_x, food_y = 0, 0 while not create_success: food_x, food_y = randint(0, 24), randint(0, 24) food_x *= lattice_wh food_y *= lattice_wh # 检查食物位置是否与贪吃蛇位置重合 for snake in snakes: if (food_x, food_y) != (snake.rect.x, snake.rect.y): create_success = 1 break # 在指定位置生成食物 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] = 1 elif event.key == pygame.K_DOWN and game_stats[1] != 1: game_stats[1] = 2 elif event.key == pygame.K_LEFT and game_stats[1] != 4: game_stats[1] = 3 elif event.key == pygame.K_RIGHT and game_stats[1] != 3: game_stats[1] = 4 else: 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] = 1 return # 检查是否触碰食物 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] = 1 return # 更新所有蛇身位置 for i in range(len(snakes)-1, 0, -1): snakes[i].rect.x = snakes[i-1].rect.x snakes[i].rect.y = snakes[i-1].rect.y # 更新蛇头位置 snakes[0].move(game_stats[1])
import pygame from function import * from snake import Snake # 基本设置 lattice_wh = 20 snake_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小游戏——井字棋:https://blog.csdn.net/KissMoon_/article/details/117437893
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。