python3 80行代码实现贪吃蛇

上面是实现的截图,废话不说,直接开始说一下代码
pos = {
'UP': (-1,0),
'DOWN':(+1,0),
'LEFT':(0,-1),
'RIGHT':(0,+1),
}
current = 'RIGHT'
snake = [[1,1],[1,2],[1,3],[1,4],[1,5]] #ex: [[1,1],[1,2],[1,3]] [y,x]
head = snake[-1]
snake_speed = 0.1
rany, ranx = -1, -1
来一些数据的初始化,蛇用列表表示,蛇的头的是列表的最后一项,速度用time.sleep()表示,速度越小,越快
def isover(head):
if snake.count(head) > 1: #碰到自己身体
return True
if (head[0] == y-1) or (head[1] == x-1) or (head[0] == 0) or (head[1] == 0): #碰到墙
return True
return False
判定游戏是否结束,碰到自己身体结束或者碰到墙结束
def randomyx():
ranflag = False
while ranflag is False:
rany, ranx = random.randint(1,y-2) , random.randint(1,x-2)
if [rany,ranx] not in snake:
ranflag = True
随机生成贪吃蛇的点,注意:生成的点:需在框内而且不能在蛇的身上
while isover(head) is False:
draw()
head = [ head[0] + pos[current][0] , head[1] + pos[current][1]]
snake.append(head)
if head[0] == rany and head[1] == ranx:
randomyx()
snake_speed = snake_speed - 0.01
else:
snake.pop(0)
time.sleep(snake_speed)
上面是核心的逻辑代码,主要思想是:
1.只要蛇没有吃到东西,就头加入进去,尾掉(形成蛇走步的感觉);只要蛇吃到了东西,就头加进来,尾不出去(形成蛇长大的感觉) <--- 典型队列
2.然后考虑current <-- 当前蛇走的方向,如何去改变
这里首先就考虑是一个异步的情形!利用异步监听鼠标时间!
t1 = threading.Thread(target=listening, args=(head,), name='listenkeyboard')
t1.start()
def listening(head):
while True:
c = stdscr.getch()
if c == curses.KEY_UP and current != 'DOWN':
current = 'UP'
elif c == curses.KEY_DOWN and current != 'UP':
current = 'DOWN'
elif c == curses.KEY_LEFT and current != 'RIGHT':
current = 'LEFT'
elif c == curses.KEY_RIGHT and current != 'LEFT':
current = 'RIGHT'
这里需要注意的是: 在当前方向为上的时候,不能按下---> 按了蛇不就自己撞自己了嘛~
写完主要逻辑,之后 美化以下界面->
curses.start_color() #开启颜色
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_RED)#定义点的颜色
curses.init_pair(2, curses.COLOR_BLUE, curses.COLOR_BLUE) #定义蛇的颜色
for si in snake:
stdscr.addstr(si[0],si[1],'@',curses.color_pair(2))
stdscr.addstr(rany,ranx,' ',curses.color_pair(1))
这样,一个贪吃蛇小游戏就完成了,下面是实现的全部代码,python3 snake.py,自己玩一下吧~~
import time,curses,random,threading
pos = {
'UP': (-1,0),
'DOWN':(+1,0),
'LEFT':(0,-1),
'RIGHT':(0,+1),
}
current = 'RIGHT'
snake = [[1,1],[1,2],[1,3],[1,4],[1,5]] #ex: [[1,1],[1,2],[1,3]] [y,x]
head = snake[-1]
snake_speed = 0.1
rany, ranx = -1, -1
def isover(head):
if snake.count(head) > 1: #碰到自己身体
return True
if (head[0] == y-1) or (head[1] == x-1) or (head[0] == 0) or (head[1] == 0): #碰到墙
return True
return False
def randomyx():
global rany,ranx
ranflag = False
while ranflag is False:
rany, ranx = random.randint(1,y-2) , random.randint(1,x-2)
if [rany,ranx] not in snake:
ranflag = True
def draw():
stdscr.erase()
stdscr.border()
for si in snake:
stdscr.addstr(si[0],si[1],'@',curses.color_pair(2))
stdscr.addstr(rany,ranx,' ',curses.color_pair(1))
stdscr.refresh()
def listening(head):
global current
while True:
c = stdscr.getch()
if c == curses.KEY_UP and current != 'DOWN':
current = 'UP'
elif c == curses.KEY_DOWN and current != 'UP':
current = 'DOWN'
elif c == curses.KEY_LEFT and current != 'RIGHT':
current = 'LEFT'
elif c == curses.KEY_RIGHT and current != 'LEFT':
current = 'RIGHT'
def loop(stdscr):
global head,snake_speed
randomyx()
t1 = threading.Thread(target=listening, args=(head,), name='listenkeyboard')
t1.start()
while isover(head) is False:
draw()
head = [ head[0] + pos[current][0] , head[1] + pos[current][1]]
snake.append(head)
if head[0] == rany and head[1] == ranx:
randomyx()
snake_speed = snake_speed - 0.01
else:
snake.pop(0)
time.sleep(snake_speed)
stdscr = curses.initscr()
curses.noecho() #不输出- -
curses.cbreak() #立刻读取:暂不清楚- -
curses.start_color() #开启颜色
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_RED)#定义点的颜色
curses.init_pair(2, curses.COLOR_BLUE, curses.COLOR_BLUE) #定义蛇的颜色
#init_pair(n,f,b)修改颜色对n,让f为前景色,b为背景色。颜色对0天生的黑白色,不允许改。
stdscr.keypad(1) #开启keypad
stdscr.border()
curses.curs_set(0)
(y,x) = stdscr.getmaxyx()
curses.wrapper(loop)
curses.endwin()
python3 80行代码实现贪吃蛇的更多相关文章
- 20行JS代码实现贪吃蛇
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 200行PYTHON代码实现贪吃蛇
200行Python代码实现贪吃蛇 话不多说,最后会给出全部的代码,也可以从这里Fork,正文开始: 目前实现的功能列表: 贪吃蛇的控制,通过上下左右方向键: 触碰到边缘.墙壁.自身则游戏结束: 接触 ...
- 80 行代码爬取豆瓣 Top250 电影信息并导出到 CSV 及数据库
一.下载页面并处理 二.提取数据 观察该网站 html 结构 可知该页面下所有电影包含在 ol 标签下.每个 li 标签包含单个电影的内容. 使用 XPath 语句获取该 ol 标签 在 ol 标签中 ...
- 超简单!80行代码实现Google日历(拖放、移动、AJAX)
介绍 本实例介绍使用DayPilot Lite for ASP.NET MVC library 类来实现类google日历效果. 在线实例 天视图 星期视图 拖放调整 拖放移动 行代码来实现a ...
- 超级简单!80行代码实现Google日历(拖放、移动、AJAX)
行代码实现Google日历 Introduction 本实例介绍使用DayPilot Lite for ASP.NET MVC library 类来实现类google日历效果. 在线实例 天视图 星 ...
- 80行代码教你写一个Webpack插件并发布到npm
1. 前言 最近在学习 Webpack 相关的原理,以前只知道 Webpack 的配置方法,但并不知道其内部流程,经过一轮的学习,感觉获益良多,为了巩固学习的内容,我决定尝试自己动手写一个插件. 这个 ...
- Html5游戏开发-145行代码完成一个RPG小Demo
lufy前辈写过<[代码艺术]17行代码的贪吃蛇小游戏>一文,忽悠了不少求知的兄弟进去阅读,阅读量当然是相当的大.今天我不仿也搞一个这样的教程,目地不在于忽悠人,而在于帮助他人. 先看de ...
- 贪吃蛇的java代码分析(二)
代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过 ...
- [置顶] 63行代码完美实现html5 贪吃蛇游戏
以前也很少关注html5,感觉选择html已经慢慢成为趋势,想了解下.就找了个游戏学习了,写完这个游戏感觉html5和js结合很紧密,如果js不是特别好.估计需要先补习下js,这个只是个人的建议,不一 ...
随机推荐
- javaScript中用eval()方法转换json对象
var u = eval('('+user+')'); 1.对于服务器返回的JSON字符串,如果jQuery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将 ...
- JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- MVC部分视图
// 以视图名使用当前文件夹下的视图 // 如果没有找到,则搜索 Shared 文件夹 @Html.Partial("ViewName") @Html.Partial(“视图” ...
- Angular的表单组件
创建表单元素 在上一节中,我们学习了如何创建一个组件login,现在将login改造一下, 在template中添加html表单元素,#usernameRef表示input元素id,如果想传递inpu ...
- C# 进程间共享内存通信方式
从别处看到一篇文章做进程间通信很好使,唯一的问题是,需要注意using的用法,Using有个用法3, using 语句允许程序员指定使用资源的对象应当何时释放资源.using 语句中使用的对象必须实现 ...
- git 拉取远程分支报错(fatal: '' is not a commit and a branch '' cannot be created from it)
问题描述从远程git上拉取某一个分支,然后报错,拉取不了这个分支. 拉取分支的命令: git checkout -b xxx-static-19 origin/xxx-static-19 其中xxx- ...
- 【模板】 全排列 && 有重复元素的全排列
全排列 #include<bits/stdc++.h> using namespace std; ]; void print (int n){ ;i<=n;i++) cout< ...
- windows10下mysql8.0.11忘记密码的解决办法
首先输入 新开一个cmd窗口,登录mysql,刷新权限表 FLUSH PRIVILEGES; 经过我再次修改密码测试,只用下面这条语句就可以了 ALTER USER 'root'@'localhost ...
- 并发编程之ThreadLocal源码分析
当访问共享的可变数据时,通常需要使用同步.一种避免同步的方式就是不共享数据,仅在单线程内部访问数据,就不需要同步.该技术称之为线程封闭. 当数据封装到线程内部,即使该数据不是线程安全的,也会实现自动线 ...
- 撩课-Web大前端每天5道面试题-Day25
1.web前端开发,如何提高页面性能优化? 内容方面: .减少 HTTP 请求 (Make Fewer HTTP Requests) .减少 DOM 元素数量 (Reduce the Number o ...