ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

xu0713#True贪吃蛇经典的游戏

xu0713#True贪吃蛇经典的游戏 游戏简介贪吃蛇是一款经典的游戏玩家通过键盘方向键控制一条蛇在屏幕上移动吃掉随机出现的食物来增长身体同时要避免撞到墙壁或自己的身体。这个项目非常适合 Python 初学者学习游戏开发基础。xu0713#True️ 环境准备确保你的 Python 环境已安装以下库pipinstallpygame如果没有安装 pip请先安装 Python 包管理工具。 完整代码实现importpygameimportrandomimportsys# 初始化 Pygamepygame.init()# 游戏常量WIDTH,HEIGHT600,600GRID_SIZE20GRID_WIDTHWIDTH//GRID_SIZE GRID_HEIGHTHEIGHT//GRID_SIZE FPS10# 颜色定义BLACK(0,0,0)WHITE(255,255,255)GREEN(0,255,0)RED(255,0,0)BLUE(0,120,255)GRAY(40,40,40)# 方向常量UP(0,-1)DOWN(0,1)LEFT(-1,0)RIGHT(1,0)classSnake:def__init__(self):self.reset()defreset(self):重置蛇的状态self.length3self.positions[(GRID_WIDTH//2,GRID_HEIGHT//2)]self.directionRIGHT self.score0self.grow_pending2# 初始长度为3需要再生长2节defget_head_position(self):获取蛇头位置returnself.positions[0]defturn(self,point):改变蛇的移动方向# 防止直接反向移动例如向右移动时不能直接向左转ifself.length1and(point[0]*-1,point[1]*-1)self.direction:returnself.directionpointdefmove(self):移动蛇headself.get_head_position()x,yself.direction new_x(head[0]x)%GRID_WIDTH new_y(head[1]y)%GRID_HEIGHT new_position(new_x,new_y)# 检查是否撞到自己ifnew_positioninself.positions[1:]:returnFalse# 游戏结束self.positions.insert(0,new_position)# 处理生长逻辑ifself.grow_pending0:self.grow_pending-1else:self.positions.pop()returnTrue# 游戏继续defgrow(self):蛇吃到食物后生长self.grow_pending1self.score10self.length1defdraw(self,surface):绘制蛇fori,pinenumerate(self.positions):# 蛇头用不同颜色colorBLUEifi0elseGREEN# 绘制蛇身方块rectpygame.Rect(p[0]*GRID_SIZE,p[1]*GRID_SIZE,GRID_SIZE,GRID_SIZE)pygame.draw.rect(surface,color,rect)pygame.draw.rect(surface,BLACK,rect,1)# 黑色边框# 为蛇头添加眼睛ifi0:eye_sizeGRID_SIZE//5# 根据方向确定眼睛位置ifself.directionRIGHT:eye1(rect.right-eye_size*2,rect.topeye_size*2)eye2(rect.right-eye_size*2,rect.bottom-eye_size*3)elifself.directionLEFT:eye1(rect.lefteye_size,rect.topeye_size*2)eye2(rect.lefteye_size,rect.bottom-eye_size*3)elifself.directionUP:eye1(rect.lefteye_size*2,rect.topeye_size)eye2(rect.right-eye_size*3,rect.topeye_size)else:# DOWNeye1(rect.lefteye_size*2,rect.bottom-eye_size*2)eye2(rect.right-eye_size*3,rect.bottom-eye_size*2)pygame.draw.circle(surface,WHITE,eye1,eye_size)pygame.draw.circle(surface,WHITE,eye2,eye_size)pygame.draw.circle(surface,BLACK,eye1,eye_size//2)pygame.draw.circle(surface,BLACK,eye2,eye_size//2)classFood:def__init__(self):self.position(0,0)self.randomize_position()defrandomize_position(self):随机生成食物位置self.position(random.randint(0,GRID_WIDTH-1),random.randint(0,GRID_HEIGHT-1))defdraw(self,surface):绘制食物rectpygame.Rect(self.position[0]*GRID_SIZE,self.position[1]*GRID_SIZE,GRID_SIZE,GRID_SIZE)pygame.draw.rect(surface,RED,rect)pygame.draw.rect(surface,BLACK,rect,1)# 黑色边框# 添加食物内部的细节inner_rectpygame.Rect(self.position[0]*GRID_SIZEGRID_SIZE//4,self.position[1]*GRID_SIZEGRID_SIZE//4,GRID_SIZE//2,GRID_SIZE//2)pygame.draw.rect(surface,(255,200,200),inner_rect)defdraw_grid(surface):绘制游戏网格foryinrange(0,HEIGHT,GRID_SIZE):forxinrange(0,WIDTH,GRID_SIZE):rectpygame.Rect(x,y,GRID_SIZE,GRID_SIZE)pygame.draw.rect(surface,GRAY,rect,1)defdraw_score(surface,score,high_score):绘制分数显示fontpygame.font.SysFont(arial,25)score_textfont.render(f得分:{score},True,WHITE)high_score_textfont.render(f最高分:{high_score},True,WHITE)surface.blit(score_text,(10,10))surface.blit(high_score_text,(WIDTH-high_score_text.get_width()-10,10))defdraw_game_over(surface,score):绘制游戏结束画面font_largepygame.font.SysFont(arial,50)font_smallpygame.font.SysFont(arial,30)game_over_textfont_large.render(游戏结束!,True,RED)score_textfont_small.render(f最终得分:{score},True,WHITE)restart_textfont_small.render(按 R 键重新开始,True,GREEN)quit_textfont_small.render(按 Q 键退出游戏,True,WHITE)# 居中显示surface.blit(game_over_text,(WIDTH//2-game_over_text.get_width()//2,HEIGHT//2-80))surface.blit(score_text,(WIDTH//2-score_text.get_width()//2,HEIGHT//2-20))surface.blit(restart_text,(WIDTH//2-restart_text.get_width()//2,HEIGHT//220))surface.blit(quit_text,(WIDTH//2-quit_text.get_width()//2,HEIGHT//260))defmain():# 初始化游戏窗口screenpygame.display.set_mode((WIDTH,HEIGHT))pygame.display.set_caption(Python 贪吃蛇小游戏)clockpygame.time.Clock()# 创建游戏对象snakeSnake()foodFood()# 游戏状态game_overFalsehigh_score0# 主游戏循环whileTrue:foreventinpygame.event.get():ifevent.typepygame.QUIT:pygame.quit()sys.exit()ifevent.typepygame.KEYDOWN:ifgame_over:ifevent.keypygame.K_r:# 重新开始snake.reset()food.randomize_position()game_overFalseelifevent.keypygame.K_q:# 退出游戏pygame.quit()sys.exit()else:# 控制蛇的移动方向ifevent.keypygame.K_UP:snake.turn(UP)elifevent.keypygame.K_DOWN:snake.turn(DOWN)elifevent.keypygame.K_LEFT:snake.turn(LEFT)elifevent.keypygame.K_RIGHT:snake.turn(RIGHT)ifnotgame_over:# 移动蛇ifnotsnake.move():game_overTruehigh_scoremax(high_score,snake.score)# 检查是否吃到食物ifsnake.get_head_position()food.position:snake.grow()food.randomize_position()# 确保食物不会出现在蛇身上whilefood.positioninsnake.positions:food.randomize_position()# 绘制游戏画面screen.fill(BLACK)draw_grid(screen)ifnotgame_over:snake.draw(screen)food.draw(screen)draw_score(screen,snake.score,high_score)else:draw_game_over(screen,snake.score)pygame.display.update()clock.tick(FPS)if__name____main__:main() 游戏功能说明1. 核心功能蛇的移动使用方向键↑↓←→控制蛇的移动方向食物系统随机生成红色食物蛇吃到后身体变长得分增加碰撞检测撞到自己身体 → 游戏结束穿过边界 → 从对面重新出现可修改为撞墙结束分数系统每吃一个食物得10分显示当前得分和最高分2. 视觉设计蛇头为蓝色蛇身为绿色蛇头有方向性的眼睛食物有内外两层颜色网格背景便于定位游戏结束画面显示最终得分和操作提示3. 游戏控制游戏中方向键控制移动游戏结束后R 键重新开始游戏Q 键退出游戏 自定义修改建议1. 调整游戏难度# 提高游戏速度增加FPSFPS15# 减小网格尺寸增加格子数量GRID_SIZE15GRID_WIDTHWIDTH//GRID_SIZE# 40个格子GRID_HEIGHTHEIGHT//GRID_SIZE# 40个格子2. 修改为撞墙结束模式# 在 Snake.move() 方法中修改边界检测defmove(self):headself.get_head_position()x,yself.direction new_xhead[0]x new_yhead[1]y# 检查是否撞墙ifnew_x0ornew_xGRID_WIDTHornew_y0ornew_yGRID_HEIGHT:returnFalse# 游戏结束# ... 其余代码不变3. 添加音效需要音效文件# 初始化音效pygame.mixer.init()eat_soundpygame.mixer.Sound(eat.wav)game_over_soundpygame.mixer.Sound(game_over.wav)# 在吃到食物时播放音效ifsnake.get_head_position()food.position:snake.grow()eat_sound.play()# 播放吃食物音效food.randomize_position() 运行与调试保存代码将完整代码保存为snake_game.py运行游戏python snake_game.py常见问题解决问题ModuleNotFoundError: No module named pygame解决运行pip install pygame问题游戏窗口无法关闭解决按 Q 键或点击窗口关闭按钮问题游戏速度太快/太慢解决调整代码中的FPS值 学习要点通过这个项目你可以学习到Pygame 基础窗口创建、事件处理、图形绘制面向对象编程Snake 和 Food 类的设计游戏循环主循环、状态更新、画面渲染碰撞检测位置比较算法状态管理游戏进行中、结束等状态切换 扩展挑战尝试为游戏添加以下功能多种食物类型不同颜色的食物给予不同分数障碍物系统随机生成的障碍物碰到即结束关卡系统随着分数增加速度逐渐加快保存最高分将最高分保存到文件开始菜单添加游戏开始菜单和难度选择 总结这个贪吃蛇游戏项目涵盖了 Python 游戏开发的核心概念代码结构清晰注释详细非常适合学习和修改。你可以根据自己的想法添加更多功能创造属于自己的独特版本祝你编程愉快 ✨
返回列表