最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

详细解释Python快速开发贪吃蛇游戏,只需200行代码

XAMPP案例 admin 572浏览 0评论

前言

最近在学习Python3,看了一下语法和基本数据类型,有多年PHP经验的我感觉难度不是很大。Python作为高级语言,一些数据类型和函数的调用和PHP都有几分类似,大家有兴趣可以看看之前记录的Python基础的文章。

python学习笔记

看了基础语法,感觉需要通过敲码来快速熟悉下Python的开发,于是准备从小游戏的方向来,在网上学习了下guliang贪吃蛇的开发和玩法,和一些知识点,准备也来撸一下【贪吃蛇】游戏。

先展示下跑出来的效果:

drr00040

drr000040

下面记录下开发学习过程。

正文

环境

首先要准备开发环境:

系统:windows Python版本:3.8,从官网下载安装直接安装就好。

IDE:pycharm,官网下载

安装需要的Python库

  1. pip install pygame

测试是否安装成功:

  1. D:\WWW\pythonsty\learn>python
  2. Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AM
  3. Type "help", "copyright", "credits" or "license" for more information.
  4. >>>
  5. >>>
  6. >>> import pygame
  7. pygame 2.0.1 (SDL 2.0.14, Python 3.8.0)
  8. Hello from the pygame community. https://www.pygame.org/contribute.html
  9. >>>

出现上面的输出,表示已经安装成功,可以开始撸了。

具体玩法

回车键enter:开始比赛 空格:暂停 键盘上的方向键控制蛇的前进方向 ↑ / w : 上 ↓ / s : 下 ← / a : 左 → / d : 右

知识点了解

random

随机函数,random.randint(整数A,整数B),可以生成一个在A B之间的整数

while

循环,条件满足时会一直循环,可以通过break跳出循环

pygame

  1. pygame.init() — 初始化所有导入的 pygame 模块
  2. pygame.display.set_mode() -- 设置界面渲染的窗口大小
  3. pygame.event.get() -- 获取设备的输入,这里监控键盘的输入
  4. pygame.draw -- 窗口绘制形状、线和点
  5. 这里用到:pygame.draw.line() -- 画出网格线
  6. pygame.draw.rect() -- 画出矩形方块,用于表示食物和蛇的实体

开发思路

运行流程

drr0000040

具体实现

定义蛇函数,用于生成初始化的蛇

  1. # 初始化蛇
  2. def init_snake():
  3. snake = deque()
  4. snake.append((2, SCOPE_Y[0]))
  5. snake.append((1, SCOPE_Y[0]))
  6. snake.append((0, SCOPE_Y[0]))
  7. print("snake的结构坐标:%s" % snake)
  8. return snake

定义食物,用于食物生成,这里要考虑一个问题,生成食物的时候,只能是在蛇允许活动的范围内,而且不能是在蛇的身上生成,所以这里要特殊处理下:

  1. def create_food(snake):
  2. #在允许的范围内随机生成食物坐标
  3. food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
  4. food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
  5. while (food_x, food_y) in snake:
  6. # 循环判断食物是否在蛇的身上,否则需要重新生成
  7. food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
  8. food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
  9. print("food的结构坐标:%s : %s" % (food_x, food_y))
  10. return food_x, food_y

开启主循环,监控键盘的输入,并且渲染蛇的移动的动画

  1. while True:
  2. for event in pygame.event.get():
  3. if event.type == QUIT:
  4. sys.exit()
  5. elif event.type == KEYDOWN:
  6. if event.key == K_RETURN:
  7. if game_over:
  8. start = True
  9. game_over = False
  10. b = True
  11. snake = init_snake()
  12. food = create_food(snake)
  13. food_style = get_food_style()
  14. pos = (1, 0)
  15. # 得分
  16. score = 0
  17. last_move_time = time.time()
  18. elif event.key == K_SPACE:
  19. if not game_over:
  20. pause = not pause
  21. elif event.key in (K_w, K_UP):
  22. # 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVER
  23. if b and not pos[1]:
  24. pos = (0, -1)
  25. b = False
  26. elif event.key in (K_s, K_DOWN):
  27. if b and not pos[1]:
  28. pos = (0, 1)
  29. b = False
  30. elif event.key in (K_a, K_LEFT):
  31. if b and not pos[0]:
  32. pos = (-1, 0)
  33. b = False
  34. elif event.key in (K_d, K_RIGHT):
  35. if b and not pos[0]:
  36. pos = (1, 0)
  37. b = False

蛇的移动,首先根据方向来判断,这里使用pos变量来记录方向 pos(1, 0) //表示当前蛇向右的方向 pos(-1, 0) //表示当前蛇向左的方向 pos(0, 1) //表示当前蛇向下的方向 pos(0, -1) //表示当前蛇向上的方向

上面的监控键盘的按键,也是通过改变pos里面的值来改变方向

根据方向,来计算出下一个格子的坐标,此时要判断坐标是否在食物上,在的话表示吃到食物,需要重置食物坐标。不在就判断是否有边界触碰而超出边界,超出游戏就结束

  1. next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])
  2. print("snake 下一步的坐标 %s:%s" % next_s, "snake当前走的方向坐标:%s %s" % (snake[0][0], snake[0][1]))
  3. if next_s == food:
  4. # 吃到了食物
  5. snake.appendleft(next_s)
  6. score += food_style[0]
  7. speed = orispeed - 0.03 * (score // 100)
  8. food = create_food(snake)
  9. food_style = get_food_style()
  10. print("吃到食物,蛇增加一个单位,同时重置食物的坐标为:%s:%s" % food)
  11. else:
  12. if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] \
  13. and next_s not in snake:
  14. snake.appendleft(next_s)
  15. snake.pop()
  16. else:
  17. print("游戏结束:snake 下一步的坐标 %s:%s" % next_s, "走的方向:%s %s" % pos)
  18. game_over = True

使用pygame渲染出网格线,食物和蛇的身体

  1. # 画食物
  2. if not game_over:
  3. # 避免 GAME OVER 的时候把 GAME OVER 的字给遮住了
  4. pygame.draw.rect(screen, food_style[1], (food[0] * SIZE, food[1] * SIZE, SIZE, SIZE), 0)
  5. # 画蛇
  6. for s in snake:
  7. pygame.draw.rect(screen, DARK, (s[0] * SIZE + LINE_WIDTH, s[1] * SIZE + LINE_WIDTH,
  8. SIZE - LINE_WIDTH * 2, SIZE - LINE_WIDTH * 2), 0)

最后结果跑起来的效果就如上图所示。

怎么能控制蛇的速度呢?

其实是控制时间来刷新,我们知道所有的动作都在一个循环里面完成的,也就是代码都一直在运行着。

比如我设置速度为1,表示一秒刷新一次,那么蛇的移动也就是一秒一次,我们看到的也是一秒移动一格。

当我们设置速度为0.5,表示0.5秒刷新一次,那我们就看到0.5秒移动一格,速度就相对地看起来快了。

总结

总的来说Python的基础入门不难,学下数据类型和基础的语法就可以上手做简单的项目了。要学习一门新语言,还是要靠多敲码,多做项目,才能慢慢地掌握。

在做项目的过程中,慢慢地接触不同的场景,需要使用不同的函数,慢慢地熟悉和掌握。当然要想深入了解Python,还是要下功夫。

转载请注明:XAMPP中文组官网 » 详细解释Python快速开发贪吃蛇游戏,只需200行代码

您必须 登录 才能发表评论!