贪吃蛇(python版)
安装依赖pipinstallpygame完整代码importpygameimportrandomimportsys# 初始化pygamepygame.init()# 游戏配置WINDOW_WIDTH800WINDOW_HEIGHT600CELL_SIZE20CELL_NUMBER_XWINDOW_WIDTH//CELL_SIZE CELL_NUMBER_YWINDOW_HEIGHT//CELL_SIZE# 颜色定义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(40,40,40)GRASS_COLOR(167,209,61)TEXT_COLOR(255,255,255)# 设置游戏窗口screenpygame.display.set_mode((WINDOW_WIDTH,WINDOW_HEIGHT))pygame.display.set_caption(贪吃蛇游戏)clockpygame.time.Clock()# 字体设置fontpygame.font.SysFont(arial,25)big_fontpygame.font.SysFont(arial,50)classSnake:def__init__(self):# 初始位置身体由多个方块组成self.body[pygame.Vector2(5,10),pygame.Vector2(4,10),pygame.Vector2(3,10)]self.directionpygame.Vector2(1,0)# 初始向右移动self.new_blockFalsedefdraw_snake(self):绘制蛇forindex,blockinenumerate(self.body):x_posint(block.x*CELL_SIZE)y_posint(block.y*CELL_SIZE)block_rectpygame.Rect(x_pos,y_pos,CELL_SIZE,CELL_SIZE)# 蛇头用深绿色身体用浅绿色ifindex0:pygame.draw.rect(screen,DARK_GREEN,block_rect)else:pygame.draw.rect(screen,GREEN,block_rect)defmove_snake(self):移动蛇ifself.new_block:body_copyself.body[:]body_copy.insert(0,body_copy[0]self.direction)self.bodybody_copy[:]self.new_blockFalseelse:body_copyself.body[:-1]body_copy.insert(0,body_copy[0]self.direction)self.bodybody_copy[:]defadd_block(self):增加蛇的长度self.new_blockTruedefcheck_collision(self):检查碰撞撞墙或撞自己# 检查是否撞墙ifnot0self.body[0].xCELL_NUMBER_Xornot0self.body[0].yCELL_NUMBER_Y:returnTrue# 检查是否撞到自己forblockinself.body[1:]:ifblockself.body[0]:returnTruereturnFalseclassFood:def__init__(self):self.randomize()defdraw_food(self):绘制食物food_rectpygame.Rect(int(self.pos.x*CELL_SIZE),int(self.pos.y*CELL_SIZE),CELL_SIZE,CELL_SIZE)pygame.draw.rect(screen,RED,food_rect)defrandomize(self):随机生成食物位置self.xrandom.randint(0,CELL_NUMBER_X-1)self.yrandom.randint(0,CELL_NUMBER_Y-1)self.pospygame.Vector2(self.x,self.y)classGame:def__init__(self):self.snakeSnake()self.foodFood()self.score0self.game_overFalsedefupdate(self):更新游戏状态ifnotself.game_over:self.snake.move_snake()self.check_collision()self.check_fail()defdraw_elements(self):绘制所有游戏元素self.food.draw_food()self.snake.draw_snake()self.draw_score()ifself.game_over:self.draw_game_over()defcheck_collision(self):检查蛇是否吃到食物ifself.food.posself.snake.body[0]:self.food.randomize()self.snake.add_block()self.score1# 确保食物不会生成在蛇身上forblockinself.snake.body[1:]:ifblockself.food.pos:self.food.randomize()defcheck_fail(self):检查游戏是否失败ifself.snake.check_collision():self.game_overTruedefdraw_score(self):绘制分数score_textstr(self.score)score_surfacefont.render(score_text,True,TEXT_COLOR)score_xint(WINDOW_WIDTH-60)score_yint(WINDOW_HEIGHT-40)score_rectscore_surface.get_rect(center(score_x,score_y))screen.blit(score_surface,score_rect)defdraw_game_over(self):绘制游戏结束界面# 半透明遮罩overlaypygame.Surface((WINDOW_WIDTH,WINDOW_HEIGHT))overlay.set_alpha(150)overlay.fill((0,0,0))screen.blit(overlay,(0,0))game_over_surfacebig_font.render(GAME OVER,True,WHITE)game_over_rectgame_over_surface.get_rect(center(WINDOW_WIDTH//2,WINDOW_HEIGHT//2-50))screen.blit(game_over_surface,game_over_rect)restart_textfont.render(Press R to Restart or Q to Quit,True,WHITE)restart_rectrestart_text.get_rect(center(WINDOW_WIDTH//2,WINDOW_HEIGHT//220))screen.blit(restart_text,restart_rect)defreset(self):重置游戏self.snakeSnake()self.foodFood()self.score0self.game_overFalsedefmain():gameGame()# 自定义事件控制蛇的移动速度SCREEN_UPDATEpygame.USEREVENT pygame.time.set_timer(SCREEN_UPDATE,150)# 每150毫秒更新一次whileTrue:foreventinpygame.event.get():ifevent.typepygame.QUIT:pygame.quit()sys.exit()ifevent.typeSCREEN_UPDATEandnotgame.game_over:game.update()ifevent.typepygame.KEYDOWN:ifnotgame.game_over:# 控制蛇的方向不能直接反向ifevent.keypygame.K_UPandgame.snake.direction.y!1:game.snake.directionpygame.Vector2(0,-1)ifevent.keypygame.K_DOWNandgame.snake.direction.y!-1:game.snake.directionpygame.Vector2(0,1)ifevent.keypygame.K_RIGHTandgame.snake.direction.x!-1:game.snake.directionpygame.Vector2(1,0)ifevent.keypygame.K_LEFTandgame.snake.direction.x!1:game.snake.directionpygame.Vector2(-1,0)else:# 游戏结束时可以重新开始或退出ifevent.keypygame.K_r:game.reset()ifevent.keypygame.K_q:pygame.quit()sys.exit()screen.fill(GRAY)game.draw_elements()pygame.display.update()clock.tick(60)if__name____main__:main()
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2546001.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!