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批量修改文件名的实现代码
Sep 01 Python
浅析Python 中整型对象存储的位置
May 16 Python
Python之re操作方法(详解)
Jun 14 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
Jan 17 Python
微信公众号token验证失败解决方案
Jul 22 Python
python通过实例讲解反射机制
Oct 17 Python
基于python使用tibco ems代码实例
Dec 20 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
keras读取h5文件load_weights、load代码操作
Jun 12 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
python unichr函数知识点总结
Dec 16 Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 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
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
Bootstrap模块dropdown实现下拉框响应
2016/05/22 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
查看django版本的方法分享
2018/05/14 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
python向图片里添加文字
2019/11/26 Python
Python实现密码薄文件读写操作
2019/12/16 Python
厉行勤俭节约倡议书
2014/05/16 职场文书
大学迎新标语
2014/06/26 职场文书
如何理解及使用Python闭包
2021/06/01 Python
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技