贪吃蛇python代码穿墙_5 分钟教你用 Python 实现贪吃蛇!

贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中。

尽管贪吃蛇的历史相对比较久远,但它却有着十分顽强的生命力,保持经久不衰,其中很重要的原因便是游戏厂家不断的对其进行更新迭代。现在,这款游戏无论是游戏场景、规则等都变得十分丰富。

接下来,我们看一下如何通过 Python 简单的实现这款小游戏。

规则

要有游戏主界面、贪吃蛇、食物;

能够控制贪吃蛇移动并获取食物;

贪吃蛇吃了食物后,增加自身长度、分数,食物消失并随机生成新的食物;

贪吃蛇触碰到周围边界或自己身体时,游戏结束。

环境

操作系统:Windows

Python 版本:3.6

涉及模块:sys、random、pygame

实现

首先,安装第三方库 pygame,使用 pip install pygame 即可。

➢ 游戏主界面

SCREEN_X = 500SCREEN_Y = 500screen_size = (SCREEN_X, SCREEN_Y)screen = pygame.display.set_mode(screen_size)pygame.display.set_caption('贪吃蛇')

➢ 贪吃蛇

初始化

def __init__(self):self.dirction = pygame.K_RIGHTself.body = []

移动

def addNode(self):left, top = (0, 0)if self.body:left, top = (self.body[0].left, self.body[0].top)node = pygame.Rect(left, top, 20, 20)if self.dirction == pygame.K_LEFT:node.left -= 20elif self.dirction == pygame.K_RIGHT:node.left += 20elif self.dirction == pygame.K_UP:node.top -= 20elif self.dirction == pygame.K_DOWN:node.top += 20self.body.insert(0, node)def delNode(self):self.body.pop()

改变方向

def changeDirection(self, curkey):LR = [pygame.K_LEFT, pygame.K_RIGHT]UD = [pygame.K_UP, pygame.K_DOWN]if curkey in LR + UD:if (curkey in LR) and (self.dirction in LR):returnif (curkey in UD) and (self.dirction in UD):returnself.dirction = curkey

死亡判断

def isDead(self):# 撞墙if self.body[0].x not in range(SCREEN_X):return Trueif self.body[0].y not in range(SCREEN_Y):return True# 撞自己if self.body[0] in self.body[1:]:return Truereturn False

➢ 食物

投放食物

def set(self):if self.rect.x == -20:allpos = []for pos in range(20, SCREEN_X - 20, 20):allpos.append(pos)self.rect.left = random.choice(allpos)self.rect.top = random.choice(allpos)print(self.rect)

吃掉食物

def remove(self):self.rect.x = -20

➢ 文字显示

显示方法

def show_text(screen, pos, text, color, font_bold=False, font_size=30, font_italic=False):# 设置文字大小cur_font = pygame.font.SysFont("宋体", font_size)# 加粗cur_font.set_bold(font_bold)# 斜体cur_font.set_italic(font_italic)# 设置内容text_fmt = cur_font.render(text, 1, color)# 绘制文字screen.blit(text_fmt, pos)

显示分数

show_text(screen, (50, 400), 'scores: ' + str(scores), (103, 213, 213))

显示死亡提示

show_text(screen, (150, 50), 'GAME OVER', (227, 29, 18), False, 50)show_text(screen, (140, 100), "Press space to try again", (0, 0, 22), False, 30)

➢ 吃到食物

当贪吃蛇吃掉食物,增加蛇身长度、分数,食物消失,重新投放食物。

if food.rect == snake.body[0]:scores += 1food.remove()snake.addNode()# 投放食物food.set()

➢ 最终效果

打包

贪吃蛇完整代码 请关注文末公众号,后台回复 g2 获取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python贪吃蛇游戏可以设置可穿墙模式,即贪吃蛇可以穿过墙面。但是,如果贪吃蛇咬到自身,游戏仍然失败。可以通过编写死亡判断函数来实现这一功能,遍历蛇身存储列表,判断蛇身坐标是否与蛇头坐标相同,若相同则判定贪吃蛇咬到自身,死亡。在可穿墙模式下,需要在死亡判断函数中添加穿墙的判断逻辑。 下面是一个简单的Python贪吃蛇穿墙模式的实现代码: ```python import pygame import random # 初始化pygame pygame.init() # 设置游戏窗口大小 screen_width = 480 screen_height = 480 screen = pygame.display.set_mode((screen_width, screen_height)) # 设置游戏标题 pygame.display.set_caption('Python贪吃蛇') # 定义颜色 white = (255, 255, 255) black = (0, 0, 0) red = (255, 0, 0) # 定义贪吃蛇初始位置和大小 snake_block_size = 10 snake_speed = 15 snake_list = [] snake_length = 1 snake_x = screen_width / 2 snake_y = screen_height / 2 # 定义食物初始位置和大小 food_block_size = 10 food_x = round(random.randrange(0, screen_width - food_block_size) / 10.0) * 10.0 food_y = round(random.randrange(0, screen_height - food_block_size) / 10.0) * 10.0 # 定义死亡判断函数 def is_dead(snake_head, snake_list): die_flag = False for block in snake_list[1:]: if snake_head == block: die_flag = True break if die_flag: return True else: if snake_head[0] >= screen_width or snake_head[0] < 0 or snake_head[1] >= screen_height or snake_head[1] < 0: return True else: return False # 游戏循环 game_over = False clock = pygame.time.Clock() while not game_over: for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True # 获取键盘输入 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: snake_x -= snake_block_size if keys[pygame.K_RIGHT]: snake_x += snake_block_size if keys[pygame.K_UP]: snake_y -= snake_block_size if keys[pygame.K_DOWN]: snake_y += snake_block_size # 更新贪吃蛇位置 snake_head = [snake_x, snake_y] snake_list.append(snake_head) if len(snake_list) > snake_length: del snake_list[0] # 判断是否吃到食物 if snake_x == food_x and snake_y == food_y: food_x = round(random.randrange(0, screen_width - food_block_size) / 10.0) * 10.0 food_y = round(random.randrange(0, screen_height - food_block_size) / 10.0) * 10.0 snake_length += 1 # 绘制游戏界面 screen.fill(white) pygame.draw.rect(screen, red, [food_x, food_y, food_block_size, food_block_size]) for block in snake_list: pygame.draw.rect(screen, black, [block[0], block[1], snake_block_size, snake_block_size]) # 判断是否死亡 if is_dead(snake_head, snake_list): game_over = True # 更新游戏界面 pygame.display.update() # 控制游戏速度 clock.tick(snake_speed) # 退出pygame pygame.quit() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值