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与shell的3种交互方式介绍
Apr 11 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 Python
Python简单计算文件夹大小的方法
Jul 14 Python
python中requests库session对象的妙用详解
Oct 30 Python
Python中__slots__属性介绍与基本使用方法
Sep 05 Python
python and or用法详解
Jun 26 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
pytorch 固定部分参数训练的方法
Aug 17 Python
Python 寻找局部最高点的实现
Dec 05 Python
django orm模块中的 is_delete用法
May 20 Python
Python中生成ndarray实例讲解
Feb 22 Python
Pygame如何使用精灵和碰撞检测
Nov 17 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生成图片缩略图的方法
2015/04/07 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
jQuery 事件队列调整方法
2009/09/18 Javascript
javascript 定义新对象方法
2010/02/20 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
python实现邮件自动发送
2019/08/10 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
django在开发中取消外键约束的实现
2020/05/20 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
C++面试题目
2013/06/25 面试题
本科生求职简历的自我评价
2013/10/21 职场文书
养殖人员的创业计划书范文
2013/12/26 职场文书
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
自我检讨书怎么写
2015/05/07 职场文书