50行代码实现贪吃蛇(具体思路及代码)


Posted in Python onApril 27, 2013

最近一直在准备用来面试的几个小demo,为了能展现自己,所以都是亲自设计并实现的,其中一个就是在50行代码内来实现一个贪吃蛇,为了说明鄙人自己练习编程的一种方式--把代码写短,为了理解语言细节。

<SPAN style="FONT-SIZE: 14px">import sys, pygame 
from pygame.locals import * 
from random import randrange 
up =lambda x:(x[0]-1,x[1]) 
down = lambda x :(x[0]+1,x[1]) 
left = lambda x : (x[0],x[1]-1) 
right = lambda x : (x[0],x[1]+1) 
tl = lambda x :x<3 and x+1 or 0 
tr = lambda x :x==0 and 3 or x-1 
dire = [up,left,down,right] 
move = lambda x,y:[y(x[0])]+x[:-1] 
grow = lambda x,y:[y(x[0])]+x 
s = [(5,5),(5,6),(5,7)] 
d = up 
food = randrange(0,30),randrange(0,40) 
FPSCLOCK=pygame.time.Clock() 
pygame.init() 
pygame.display.set_mode((800,600)) 
pygame.mouse.set_visible(0) 
screen = pygame.display.get_surface() 
screen.fill((0,0,0)) 
times=0.0 
while True: 
time_passed = FPSCLOCK.tick(30) 
if times>=150: 
times =0.0 
s = move(s,d) 
else: 
times +=time_passed 
for event in pygame.event.get(): 
if event.type == QUIT: 
sys.exit() 
if event.type == KEYDOWN and event.key == K_UP: 
s = move(s,d) 
if event.type == KEYDOWN and event.key == K_LEFT: 
d=dire[tl(dire.index(d))] 
if event.type == KEYDOWN and event.key == K_RIGHT: 
d=dire[tr(dire.index(d))] 
if s[0]==food: 
s = grow(s,d) 
food =randrange(0,30),randrange(0,40) 
if s[0] in s[1:] or s[0][0]<0 or s[0][0] >= 30 or s[0][1]<0 or s[0][1]>=40: 
break 
screen.fill((0,0,0)) 
for r,c in s: 
pygame.draw.rect(screen,(255,0,0),(c*20,r*20,20,20)) 
pygame.draw.rect(screen,(0,255,0),(food[1]*20,food[0]*20,20,20)) 
pygame.display.update()</SPAN>

游戏截图:
50行代码实现贪吃蛇(具体思路及代码)
说明:
1.其实不用pygame,在把一些条件判断改改,估计可以再短一半。。等以后自己python水平高了再回来试试。。
2.但是50行的贪吃蛇代码,还是有可读性的,写的太短就真没有了。。
3.关键是把旋转,移动,等等这些算法用lamda表达式实现,还有函数对象。。
4.哪位“行者”能写的更短,小弟愿意赐教....
作者:aiqier
Python 相关文章推荐
树莓派中python获取GY-85九轴模块信息示例
Dec 05 Python
python在windows下创建隐藏窗口子进程的方法
Jun 04 Python
python简单猜数游戏实例
Jul 09 Python
python中list列表的高级函数
May 17 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
Django自定义插件实现网站登录验证码功能
Apr 19 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
Apr 21 Python
微信公众号token验证失败解决方案
Jul 22 Python
python绘制玫瑰的实现代码
Mar 02 Python
Django一小时写出账号密码管理系统
Apr 29 Python
Python闭包的定义和使用方法
Apr 11 Python
Python的lambda匿名函数的简单介绍
Apr 25 #Python
python批量下载图片的三种方法
Apr 22 #Python
如何运行Python程序的方法
Apr 21 #Python
python读取注册表中值的方法
Apr 08 #Python
重命名批处理python脚本
Apr 05 #Python
Python编写的com组件发生R6034错误的原因与解决办法
Apr 01 #Python
Python中用Ctrl+C终止多线程程序的问题解决
Mar 30 #Python
You might like
php获取某个目录大小的代码
2008/09/10 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
php实例化一个类的具体方法
2019/09/19 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
javascript实用方法总结
2015/02/06 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
理解javascript async的用法
2017/08/22 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
vue2.0 实现页面导航提示引导的方法
2018/03/13 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
原生js实现随机点名
2020/07/05 Javascript
Python 自动补全(vim)
2014/11/30 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
python 实现目录复制的三种小结
2019/12/04 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
英国网上超市:Ocado
2020/03/05 全球购物
xxx同志考察材料
2014/02/07 职场文书
个人委托书范本
2014/04/02 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript