

Python,速成心法
敲代码,查资料,问度娘
练习,探索,总结,优化

★★★★★博文创作不易,使用代码的过程中,如有疑问的地方,欢迎大家指正留言交流。喜欢的老铁可以多多点赞+收藏分享+置顶,小红牛在此表示感谢。★★★★★
---------★Pygame教程★---------
Python经典游戏:太空飞机大战Space Plane Battle
Pygame经典游戏:坦克大战TankWar+五子棋人机对弈+俄罗斯方块(安排!!)
Pygame经典游戏:微信飞机大战Wechatflying(初级版)
Python经典游戏:走迷宫,好烦呀,我到现在还没有走出去!!
Pygame教程03:文本显示+字体加载+transform方法
Pygame教程04:draw方法绘制矩形、多边形、圆、椭圆、弧线、直线和线条等
Pygame教程05:帧动画原理+边界值检测,让小球来回上下运动
Pygame教程06:Event事件的类型+处理方法+监听鼠标事件
Pygame教程08:使用键盘方向键,控制小球,上下左右移动。
Pygame教程09:font.render文本内容,如何自动换行显示
我们需要用pygame写贪吃蛇游戏。应该是一个完整可运行的Python脚本,使用pygame库。需要包括基本功能:蛇的移动、食物生成、碰撞检测(墙壁或自身)、得分显示、游戏结束等。可能需要控制方向(上下左右),避免反向移动。窗口大小适中,网格系统(比如20x20或类似)。要求代码清晰,注释。需要确保可运行且无bug。
考虑使用经典贪吃蛇实现:蛇身是一系列方块(矩形),每个方块大小为grid_size,例如20或30像素。窗口宽度和高度为grid_size * 格子数。蛇初始位置在中间,长度为3。食物随机出现在空白位置。蛇移动时,头部增加新位置,尾部移除(除非吃到食物)。吃到食物后,长度增加1,食物重新生成,得分增加。游戏结束条件:碰撞墙壁或碰撞自身。
另外,可以增加游戏结束界面显示得分并等待按键重新开始,或者简单直接退出并打印分数。但更好的做法是显示游戏结束文本并等待按R重新开始。为了用户体验,可以在游戏结束屏幕显示"Game Over, Press R to Restart or Q to Quit",并处理事件。也符合常规。

↓ 源码如下 ↓
# -*- coding: utf-8 -*-# @Author : 小红牛# 微信公众号:wdPythonimport pygameimport randomimport sys# 初始化Pygamepygame.init()# 常量定义SCREEN_WIDTH = 600SCREEN_HEIGHT = 600GRID_SIZE = 20 # 每个格子的大小(像素)GRID_WIDTH = SCREEN_WIDTH // GRID_SIZE # 30列GRID_HEIGHT = SCREEN_HEIGHT // GRID_SIZE # 30行# 颜色定义(RGB)BLACK = (0, 0, 0)WHITE = (255, 255, 255)GREEN = (0, 255, 0)DARK_GREEN = (0, 200, 0)RED = (255, 0, 0)BLUE = (0, 0, 255)GRAY = (128, 128, 128)# 方向向量常量UP = (0, -1)DOWN = (0, 1)LEFT = (-1, 0)RIGHT = (1, 0)# 游戏设置INITIAL_SPEED = 10 # 初始速度(帧率)FONT_SIZE = 30class SnakeGame:def __init__(self):"""初始化游戏窗口和状态"""self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption("贪吃蛇游戏")self.clock = pygame.time.Clock()self.font = pygame.font.SysFont('arial', FONT_SIZE)self.big_font = pygame.font.SysFont('arial', 40)self.reset_game()def reset_game(self):"""重置所有游戏状态(用于重新开始)"""# 蛇的初始身体:三个格子水平排列,头部在最右侧start_x = GRID_WIDTH // 2start_y = GRID_HEIGHT // 2self.snake = [(start_x, start_y), # 头部(start_x - 1, start_y),(start_x - 2, start_y)]self.direction = RIGHT # 当前移动方向self.next_direction = RIGHT # 下一个请求的方向self.score = 0self.game_over = Falseself.win = False # 是否胜利(蛇占满网格)# 生成第一个食物(确保不在蛇身上)self.food = self._generate_random_food()def _generate_random_food(self):"""在空白位置随机生成食物,如果没有空位则返回None"""# 获取所有被蛇占据的位置snake_positions = set(self.snake)# 如果蛇已经占满整个网格,返回None表示胜利if len(snake_positions) >= GRID_WIDTH * GRID_HEIGHT:return None# 随机尝试生成食物(最多尝试1000次,避免极端情况死循环)for _ in range(1000):x = random.randint(0, GRID_WIDTH - 1)y = random.randint(0, GRID_HEIGHT - 1)if (x, y) not in snake_positions:return (x, y)# 理论上应该能找到,但如果找不到,就顺序查找第一个空位for y in range(GRID_HEIGHT):for x in range(GRID_WIDTH):if (x, y) not in snake_positions:return (x, y)return None # 没有空位(胜利)def _handle_events(self):"""处理键盘和窗口事件"""for event in pygame.event.get():if event.type == pygame.QUIT:return False # 退出游戏if event.type == pygame.KEYDOWN:if self.game_over:# 游戏结束后,按R键重新开始,按Q键退出if event.key == pygame.K_r:self.reset_game()elif event.key == pygame.K_q:return Falseelse:# 游戏进行中,处理方向键if event.key == pygame.K_UP and self.direction != DOWN:self.next_direction = UPelif event.key == pygame.K_DOWN and self.direction != UP:self.next_direction = DOWNelif event.key == pygame.K_LEFT and self.direction != RIGHT:self.next_direction = LEFTelif event.key == pygame.K_RIGHT and self.direction != LEFT:self.next_direction = RIGHTreturn True # 继续运行def _update_direction(self):"""更新移动方向(防止反向移动)"""# 检查请求的方向是否与当前方向相反if (self.next_direction[0] * -1, self.next_direction[1] * -1) != self.direction:self.direction = self.next_directiondef _move_snake(self):"""移动蛇,并检测是否吃到食物或发生碰撞"""# 计算新头部位置new_head = (self.snake[0][0] + self.direction[0],self.snake[0][1] + self.direction[1])# 检查是否吃到食物ate_food = (new_head == self.food)# 执行移动if ate_food:# 吃到食物:将新头部插入蛇身,不删除尾部(长度+1)self.snake.insert(0, new_head)self.score += 1# 生成新食物,如果无法生成则胜利self.food = self._generate_random_food()if self.food is None:self.win = Trueself.game_over = Trueelse:# 未吃到食物:插入新头部并删除尾部self.snake.insert(0, new_head)self.snake.pop()# 碰撞检测(仅在未胜利时进行,胜利时不需检测)if not self.game_over:self._check_collision(new_head)def _check_collision(self, head):"""检测是否撞墙或撞自身"""# 边界碰撞检测if (head[0] < 0 or head[0] >= GRID_WIDTH orhead[1] < 0 or head[1] >= GRID_HEIGHT):self.game_over = Trueself.win = Falsereturn# 自身碰撞检测(检查头部是否与身体其他部分重叠)# 注意:头部在索引0,检查索引1开始是否有相同坐标if head in self.snake[1:]:self.game_over = Trueself.win = Falsedef _draw_grid(self):"""绘制网格线"""for x in range(0, SCREEN_WIDTH, GRID_SIZE):pygame.draw.line(self.screen, GRAY, (x, 0), (x, SCREEN_HEIGHT))for y in range(0, SCREEN_HEIGHT, GRID_SIZE):pygame.draw.line(self.screen, GRAY, (0, y), (SCREEN_WIDTH, y))def _draw_snake(self):"""绘制蛇身"""for i, segment in enumerate(self.snake):rect = pygame.Rect(segment[0] * GRID_SIZE, segment[1] * GRID_SIZE,GRID_SIZE, GRID_SIZE)# 头部颜色稍亮color = DARK_GREEN if i == 0 else GREENpygame.draw.rect(self.screen, color, rect)pygame.draw.rect(self.screen, BLACK, rect, 1) # 边框def _draw_food(self):"""绘制食物"""if self.food:rect = pygame.Rect(self.food[0] * GRID_SIZE, self.food[1] * GRID_SIZE,GRID_SIZE, GRID_SIZE)pygame.draw.rect(self.screen, RED, rect)pygame.draw.rect(self.screen, BLACK, rect, 1)def _draw_score(self):"""显示当前分数"""score_text = self.font.render(f"Score: {self.score}", True, WHITE)self.screen.blit(score_text, (10, 10))def _draw_game_over(self):"""显示游戏结束或胜利信息"""# 半透明遮罩层overlay = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT))overlay.set_alpha(128)overlay.fill(BLACK)self.screen.blit(overlay, (0, 0))if self.win:message = "YOU WIN!"color = GREENelse:message = "GAME OVER"color = RED# 显示主消息text = self.big_font.render(message, True, color)text_rect = text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 40))self.screen.blit(text, text_rect)# 显示得分score_text = self.font.render(f"Final Score: {self.score}", True, WHITE)score_rect = score_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 10))self.screen.blit(score_text, score_rect)# 提示重启或退出hint_text = self.font.render("Press R to Restart, Q to Quit", True, WHITE)hint_rect = hint_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 60))self.screen.blit(hint_text, hint_rect)def run(self):"""游戏主循环"""running = Truewhile running:# 处理事件running = self._handle_events()if not running:breakif not self.game_over:# 更新方向和移动蛇self._update_direction()self._move_snake()# 绘制所有元素self.screen.fill(BLACK)self._draw_grid()self._draw_snake()self._draw_food()self._draw_score()if self.game_over:self._draw_game_over()pygame.display.flip()# 控制游戏速度(正常游戏速度,游戏结束时也维持帧率)self.clock.tick(INITIAL_SPEED)pygame.quit()sys.exit()def main():"""程序入口"""game = SnakeGame()game.run()if __name__ == "__main__":main()
完毕!!感谢您的收看
--------★★历史博文集合★★--------
