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中的数据类型
May 05 Python
python文件操作之目录遍历实例分析
May 20 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
Python使用re模块正则提取字符串中括号内的内容示例
Jun 01 Python
python3.4爬虫demo
Jan 22 Python
set在python里的含义和用法
Jun 24 Python
关于pytorch中网络loss传播和参数更新的理解
Aug 20 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
pycharm 添加解释器的方法步骤
Aug 31 Python
python 用opencv实现霍夫线变换
Nov 27 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 Python
如何使用Python实现一个简易的ORM模型
May 12 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工厂模式
2014/11/25 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
php批量删除操作代码分享
2017/02/26 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
JS实现页面打印功能
2017/03/16 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
详解在React里使用&quot;Vuex&quot;
2018/04/02 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
Python+django实现文件上传
2016/01/17 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
详解Python3的TFTP文件传输
2018/06/26 Python
在Python中增加和插入元素的示例
2018/11/01 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
使用python远程操作linux过程解析
2019/12/04 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
Python项目跨域问题解决方案
2020/06/22 Python
手术室护士自我鉴定
2013/10/14 职场文书
法律进社区实施方案
2014/03/21 职场文书
幼儿生日活动方案
2014/08/27 职场文书
个人授权委托书
2014/09/15 职场文书
出国留学自荐信模板
2015/03/06 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
社区服务理念口号
2015/12/25 职场文书
小学美术教学反思
2016/02/17 职场文书
导游词之西安骊山
2019/12/03 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python