python贪吃蛇核心功能实现下

作者:jackwsd 时间:2021-08-23 00:32:37 

紧接上回,已经完成了单独的贪食蛇的控制,但是呢,居然没有苹果可以吃,所以,非常简单的加入苹果,同时呢,修改一下主程序中贪食蛇的创建,单独编写一个贪食蛇身体生成函数,这样将来要做双蛇也很简单了。

#创建一条新的蛇
def create_new_snake():
   snake_body = []
   snake_x = random.randint(5, rows - 5)
   snake_y = random.randint(5, columns - 5)
   snake_body.append([snake_x, snake_y])
   snake_body.append([snake_x, snake_y + 1])
   snake_body.append([snake_x, snake_y + 2])
   return snake_body

把主程序中所有生成新蛇的地方换成

snake = create_new_snake()

创建新苹果,苹果不能出现在蛇的身体里,所以

def create_new_apple(snake_body):
   apple_in_game = False
   while not apple_in_game:
       apple_x = random.randint(0, rows - 1)
       apple_y = random.randint(0, columns - 1)
       # print(apple_x, apple_y)
       if (apple_x, apple_y) not in snake_body:
           new_apple = pygame.image.load('apple.png')
           new_apple = pygame.transform.scale(new_apple, (tile_size - 2, tile_size - 2))
           apple_x_location = apple_y * tile_size + x_margin/2
           apple_y_location = apple_x * tile_size + y_margin/2

display.blit(new_apple, (apple_x_location, apple_y_location))
           apple_in_game = True
   return new_apple, (apple_x, apple_y), apple_x_location, apple_y_location

在主程序中,主循环之前创建一个苹果

if __name__ == '__main__':
   pygame.init()
   snake = create_new_snake()
   # 未按下按键时,默认的初识移动方向
   direction = directions[random.randint(0, 3)]
   # 创建一个小苹果
   apple, apple_location, apple_left, apple_top = create_new_apple(snake)
   # 吃到苹果标志
   apple_was_eaten = False

因为蛇与苹果之间有交互关系,如果蛇吃到苹果,那么蛇的身体会增加一格,也就是此次循环不删除列表的最后一个元素,所以定义了一格标志位。

在主循环中,与监测按键平级的地方,放入蛇与苹果关系检查。

if apple_location in snake:
           apple, apple_location, apple_left, apple_top = create_new_apple(snake)
           apple_was_eaten = True
           my_score += 1

无论??的那个部分碰到苹果,都算迟到苹果,也可以考虑只有舌头碰到才算,这根据自己喜好吧。碰到苹果后,苹果消失,得分等等…

还需要修改删除最后一个列表元素位置,同时因为蛇的身体会变长了,所以单纯的碰到边界游戏才结束,已经不够了,我们还需要加入如果蛇头碰到自己的身体,游戏还是要结束。

if snake[0] in snake[1:]:
           snake = create_new_snake()
           #print(snake)
       elif is_right_direction(snake, new_body_location[0], new_body_location[1]):
           snake.insert(0, new_body_location)
           if not apple_was_eaten:
               del snake[-1]
           else:
               apple_was_eaten = False

如果不想结束的太突然,祭出万年不变的结束动画。

#游戏结束时特效
def game_over_animation(color=white, animation_speed=50):
   orig_surf = display.copy()
   flash_surf = pygame.Surface(display.get_size())
   flash_surf = flash_surf.convert_alpha()
   r, g, b = color
   for i in range(3):
       for start, end, step in ((0, 255, 1), (255, 0, -1)):
           for alpha in range(start, end, animation_speed * step):
               # 先铺一层新的界面,包含老界面所有内容
               display.blit(orig_surf, (0, 0))
               # flash界面填充颜色,开始很淡,越来越浓,然后越来越淡
               flash_surf.fill((r, g, b, alpha))
               # 把flash界面加载到display中
               display.blit(flash_surf, (0, 0))
               # draw_game_board(maze)
               # 刷新看效果
               pygame.display.update()
               fps_clock.tick(fps)

把动画放到程序中。即可欣赏结束动画。因为结束动画使用alpha时用到了颜色的RGB三色,这里需要把while的定义改为三色(255, 255, 255),而不是’white’。

还可以加入得分系统。

def make_score():
   score = pygame.font.Font('Kaiti.ttc', 20)
   score_surf = score.render('得分: %d' % my_score, True, text_color, bg_color)
   score_rect = score_surf.get_rect()
   score_rect.topleft = (screen_width-100, y_margin/8)
   return score_surf, score_rect

这个Kaiti.ttc字体是我从苹果系统字体里导出到工程里的,目前发现如果想要显示中文,这样比较方便,pygame自带的字体中,不知道那些可以正常显示。

在循环中加入

display.blit(score_display, score_rect)

然后运行游戏

python贪吃蛇核心功能实现下

虽然简陋,但是难看的贪食蛇完成了。我们还可以进一步增加难度,根据得分的增加,提高fps率,也就是提高了贪食蛇的移动速度。这个就不提了。还可以增加开始结束画面,暂停功能,声音,音效等等…

如果增加了这些,就不符合简陋的定义了,所以就不增加了,本身这些也太简单了…

来源:https://blog.csdn.net/jackwsd/article/details/126501681

标签:python,贪吃蛇
0
投稿

猜你喜欢

  • 10个不为人知的Google失败作品

    2008-05-24 16:56:00
  • js选取多个或单个元素的实现代码(用class)

    2023-08-24 16:51:29
  • python的变量与赋值详细分析

    2022-06-14 23:09:44
  • python3+PyQt5使用数据库窗口视图

    2023-03-08 10:44:26
  • Python 字符串操作方法大全

    2023-12-06 04:21:48
  • python获取外网IP并发邮件的实现方法

    2023-01-07 13:55:33
  • 代码总结Python2 和 Python3 字符串的区别

    2023-05-25 00:58:52
  • 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等

    2024-01-26 16:53:22
  • Vue项目中如何使用Axios封装http请求详解

    2024-04-28 09:19:49
  • python画双y轴图像的示例代码

    2021-12-07 16:07:12
  • Python matplotlib学习笔记之坐标轴范围

    2022-04-21 16:24:28
  • golang实现整型和字节数组之间的转换操作

    2024-02-11 00:13:08
  • oblog4.6转换ucenterHome1.5过程全记录,提供老用户无法登陆的补丁

    2009-10-29 12:04:00
  • MySQL视图简介及基本操作教程

    2024-01-24 14:51:51
  • python3让print输出不换行的方法

    2021-02-16 20:48:33
  • 一文秒懂pandas中iloc()函数

    2023-07-31 18:20:42
  • c#判断数据库服务器是否已经启动的方法

    2024-01-25 06:23:05
  • pd.read_csv读取文件路径出现的问题解决

    2022-03-16 06:12:53
  • Vue工程模板文件 webpack打包配置方法

    2024-05-10 14:15:40
  • php生成4位数字验证码的实现代码

    2023-11-20 15:00:12
  • asp之家 网络编程 m.aspxhome.com