一、游戏介绍

贪吃蛇是个非常简单的游戏,适合练手。先来看一下我的游戏截图:

玩法介绍:

回车键:开始游戏

空格键:暂停 / 继续

↑↓←→方向键 或 WSAD 键:控制移动方向。

食物分红、绿、蓝三种,分别对应 10 分、20 分、30 分,每吃一个食物增加对应分值,每增加 100 分速度加快一级,没有设置关卡,我玩到 1100 分,速度太快了,然后就 GAME OVER 了。

二、游戏分析

贪吃蛇这个游戏很简单,屏幕上随机出现一个点,表示“食物”,上下左右控制“蛇”的移动,吃到“食物”以后“蛇”的身体加长,“蛇”碰到边框或自己的身体,则游戏结束。

我们先来分析一下,要写出这个游戏来需要注意哪些点。

1、蛇怎么表示

我们可以将整个游戏区域划分成一个个的小格子,由一组连在一起的小格子组成“蛇”,我们可以用不同的颜色来表示,如上图中,我以深色表示背景,浅色表示“蛇”。

我们可以用坐标来表示每一个小方格,X 轴和 Y 轴的范围都是可以设定好的。用一个列表来存放“蛇身”的坐标,那么一条“蛇”就出来了,最后只要显示的时候以不同的颜色表示即可。

2、蛇怎么移动?

第一反应就是像蚯蚓蠕动一样,每一个小方块向前移动一格,但这样实现起来很麻烦。一开始就是被这里卡住了。

想象一下我们玩过的贪吃蛇,每次“蛇”的移动感觉上是整体往前移动了一格,排除掉脑子中“蛇”的“动作”,细想移动前和移动后“蛇”的位置变化,其实除了头尾,其他部分根本就没有变。那就简单了,将下一格的坐标添加到列表开头,并移除列表的最后一个元素,就相当于蛇向前移动了一格。

3、如何判定游戏结束?

“蛇”移动超出了游戏区的范围或者碰到了自己就算输了,轴坐标的范围是事先定好的,超出范围很容易判断。那么如何判断碰到自己呢?

如果脑子里想的是“蛇”动的画面,那真的比较难了,但是放到代码中,我们的“蛇”是一个列表,那么只要判断下一格的坐标是否已经包含在“蛇”的列表中岂不就可以了?

理清了这些问题,我们就可以开始编码了。

三、代码展示

由于程序中要频繁的对“蛇”进行头尾的添加和删除操作,为了性能更好那么一点,我们用 deque 代替列表。

首先需要初始化“蛇”,“蛇”的初始长度为 3,位置位于左上角。

# 游戏区域的坐标范围

SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)

SCOPE_Y = (2, SCREEN_HEIGHT // SIZE - 1)

snake = deque()

def _init_snake():

snake.clear()

snake.append((2, scope_y[0]))

snake.append((1, scope_y[0]))

snake.append((0, scope_y[0]))

创建“食物”,在屏幕内随机选取一个点作为“食物”,但是要保证“食物”不在“蛇”身上。

def create_food(snake):

food_x = random.randint(SCOPE_X[0], SCOPE_X[1])

food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])

while (food_x, food_y) in snake:

# 如果食物出现在蛇身上,则重来

food_x = random.randint(SCOPE_X[0], SCOPE_X[1])

food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])

return food_x, food_y

“蛇”的移动可以有 4 个方向,用一个元组来表示移动的方向,每次按下方向键,给赋对应的值

# 方向

pos = (1, 0)

for event in pygame.event.get():

if event.type == QUIT:

sys.exit()

elif event.type == KEYDOWN:

if event.key in (K_w, K_UP):

# 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVER

if pos[1]:

pos = (0, -1)

elif event.key in (K_s, K_DOWN):

if pos[1]:

pos = (0, 1)

elif event.key in (K_a, K_LEFT):

if pos[0]:

pos = (-1, 0)

elif event.key in (K_d, K_RIGHT):

if pos[0]:

pos = (1, 0)

而“蛇”的移动就可以表示为:

next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])

if next_s == food:

# 吃到了食物

snake.appendleft(next_s)

food = create_food(snake)

else:

if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] and next_s not in snake:

snake.appendleft(next_s)

snake.pop()

else:

game_over = True

扫码关注我的个人公众号,后台回复【贪吃蛇】,获取源码。

扫码关注我的个人公众号

python双人格斗游戏代码_Python:游戏:贪吃蛇相关推荐

  1. java小游戏代码压缩包_java 贪吃蛇小游戏 源码下载

    [实例简介] 使用java程序设计语言制作的一个贪吃蛇小游戏.游戏的控制模块应该做到易懂.易操作,以给玩家一个很好的游戏环境.在这个游戏的设计中,牵涉到图形界面的显示与更新.数据的收集与更新,还要应用 ...

  2. flash游戏代码html5,Flash贪吃蛇游戏AS代码翻译

    Flash贪吃蛇游戏AS代码翻译 互联网   发布时间:2008-10-06 01:25:13   作者:佚名   我要评论 今天翻译了一段经典的贪吃蛇代码,译后感觉还有很多地方不太妥当,很多不妥的地 ...

  3. 贪吃蛇小游戏代码html,自制贪吃蛇小游戏代码

    package game; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Game_St ...

  4. python外星人入侵游戏代码_Python游戏:外星人入侵游戏编程完整版!内附代码

    importsysimportpygamefrom bullet importBulletfrom alien importAlienfrom time importsleepdefcheck_eve ...

  5. python50行小游戏_50行python代码实现的贪吃蛇小游戏

    50行python代码实现的贪吃蛇小游戏 发布于 2014-09-01 21:26:24 | 1337 次阅读 | 评论: 1 | 来源: 网友投递 Python编程语言Python 是一种面向对象. ...

  6. 用python自带的tkinter做游戏(一)—— 贪吃蛇 篇

    用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 本人新手,刚自学python满半年,现分享下心得,希望各位老手能指点一二,也希望和我一样的新手能共勉,谢谢~ 大家都知道用python做 ...

  7. python 250行代码开发一个贪吃蛇

    python 250行代码开发一个贪吃蛇 1. 前提工作准备 2. 全局变量的定义与包的导入 3. 游戏开始界面初始化 4. 游戏界面的设置 4.1 游戏界面,使用一个Point类进行划分 4.2 预 ...

  8. JAVA基于J2ME的手机游戏开发和实现——贪吃蛇

    随着通信技术的发展和手机的普及,手机游戏的开发技术越来越为人们所关注.以J2ME为开发平台,利用Java提供强大工具,不但可以在手机上实现静态HTML技术所无法实现的计算处理.数据存储.与服务器的通信 ...

  9. c/c++游戏编程之控制台贪吃蛇(一)

    c/c++游戏编程之控制台贪吃蛇(一) c/c++游戏编程之控制台贪吃蛇(二) 欢迎你开启了c++的游戏编程世界之旅 如果你还未学过c++基本语法,请先学习基本语法再来学习游戏编程噢~. 对这样的&q ...

  10. c/c++游戏编程之控制台贪吃蛇(二)

    c/c++游戏编程之控制台贪吃蛇(一) c/c++游戏编程之控制台贪吃蛇(二) 为了解决"闪屏"问题,我们不再使用system("cls")进行清屏,而是直接用 ...

最新文章

  1. 如何在Mac上加入adb服务
  2. Hadoop运行模式 之 伪分布式运行模式
  3. 面试常问Handler 的问题合集
  4. python3精要(1)-python特点
  5. SVN Error:请求的名称有效并且在数据库中找到,但是它没有相关的正确的数据来被解析...
  6. 安全数据分析理念的变化
  7. nsfocus 十周年了 时间过得好快啊... 恭喜下...
  8. angelica类似_亲爱的当归(Angelica)是第一个让我哭泣的VR体验
  9. 大一C语言和线性代数,有谁学过线性代数和C语言啊?
  10. 时间序列趋势判断(二)——Cox-Staut趋势检验
  11. 事务复制5: Transaction and Command
  12. 003::每天五分钟入门TCP/IP协议栈::IP协议之TOS字段说明
  13. 用for循环打印出大写字母的ASCII码对照表
  14. 配好lsd_slam后的使用PTAM工具标定相机
  15. php 判断是否是拼音,php汉字转拼音的示例
  16. 机器学习在网络中的实际应用
  17. python-django前端传递数据的三种格式_CBV源码分析_django模板语法
  18. python爬虫requests库的使用及python正则表达式的使用
  19. php class中public,private,protected的区别以及实例分析
  20. freesurfer运行完recon-all怎么快速查看有没有报错?——核心命令tail重定向

热门文章

  1. HDU3047 Zjnu Stadium
  2. 光大银行外包软件测试,文思海辉蝉联光大银行人力外包测试领域优秀服务商
  3. Zsh 入门(安装及使用)
  4. Android App 瘦身总结
  5. centos升级openssh之后,连接报错Add correct host key in /root/.ssh/known_hosts to get rid of this message
  6. python抢票用哪个库_手把手教你使用python抢票回家玩
  7. 树莓派设置静态ip2
  8. 甲骨文全球大会揭示Oracle Solaris 11
  9. ASP如何开发验证码短信接口API
  10. Fuse文件系统优化方案